以下是类似于下面这样的一些代码:
int x = 1;
printf("%d,%d,%d",x,x++,x); //A statement
cout<<x<<x++<<x<<endl; //B statement
我知道执行顺序是从右到左,那么为什么语句A的结果是“1,1,1”,而语句B的结果是“112”?
我使用的是VS2008。 在调试模式下:结果相同:2,1,2。 在发布模式下:结果不同:A: 1,1,1,B: 1,1,2。
以下是类似于下面这样的一些代码:
int x = 1;
printf("%d,%d,%d",x,x++,x); //A statement
cout<<x<<x++<<x<<endl; //B statement
printf
的方式会导致未定义的行为。函数参数的求值顺序是未指定的。它们甚至不必以离散单元进行评估,因为一个表达式的一部分可以被评估,然后另一部分也可以被评估。这意味着,如果您对评估顺序有某些依赖关系,则整个表达式可能变得未定义。cout
的 operator <<
,情况也是如此。 <<
不是序列点。在 cout 的不同子句的评估顺序完全未指定。由于您在 printf
示例中具有相同类型的依赖关系,因此在此处也会引发未定义的行为。使用printf时,在调用printf之前会评估所有参数(x=1)。 使用cout时,参数按顺序评估和应用。 (至少就您的编译器而言)