不可预知的输出

时间:2010-11-19 11:20:43

标签: c++ c

  

可能重复:
  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

1 个答案:

答案 0 :(得分:0)

实际上编译了预增量运算符,因此在调用printf和cout的表达式之前执行对它的所有调用。

就像你有:

int myVal = 0;
myVal += 1;
myVal += 1;
printf("%d %d %d\n", myVal, myVal, myVal);

也可以想象编译器优化可以使用常量'2'值,而不是在运行时执行增量。

编辑:diclaimer:这个答案试图解释OP代码中特别发生的事情,但它确实是未定义行为的一个例子,因为编译器可以在这种情况下做任何他们想做的事情。