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/

10-10 01:44