Possible Duplicate:
FAQ : Undefined Behavior and Sequence Points
#include<iostream>
#include<stdio.h>
int main(){
int myVal = 0;
printf("%d %d %d\n", ++myVal,myVal,++myVal);
myVal = 0 ; /*reset*/
std::cout<<++myVal<<" "<<myVal<<" "<<++myVal<<std::endl;
return 0;
}
在两种情况下,我都得到输出2 2 2。怎么可能是2 2 2?我期望2 1 1或1 1 2
最佳答案
pre-increment运算符实际上是编译的,因此在评估调用printf和cout的表达式之前,要执行对其的所有调用。
就像您有:
int myVal = 0;
myVal += 1;
myVal += 1;
printf("%d %d %d\n", myVal, myVal, myVal);
还可以想象,在这种情况下,编译器优化可以达到使用恒定的'2'值,而不是在运行时执行递增。
编辑:diclaimer:这个答案是试图解释在OP的代码情况下发生的具体情况,但这实际上是未定义行为的一个示例,因为在这种情况下编译器几乎可以执行任何操作。
关于c++ - 不可预测的输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4224459/