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
最佳答案
预自增运算符实际上已编译,因此对它的所有调用都会在调用 printf 和 cout 的表达式求值之前执行。
就好像你有:
int myVal = 0;
myVal += 1;
myVal += 1;
printf("%d %d %d\n", myVal, myVal, myVal);
还可以想象,在这种情况下,编译器优化可以使用常量“2”值,而不是在运行时执行增量。
编辑:双语:这个答案试图解释OP代码中具体发生的情况,但这确实是未定义行为的一个例子,因为编译器在这种情况下几乎可以做任何他们想做的事情。
关于c++ - 不可预测的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4224459/