像下面这样的一些代码:
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
我知道执行顺序是从右到左,而为什么A语句结果是“1,1,1”而B语句结果是“112”???
我在调试模式下使用 vs2008:结果相同:2,1,2。带释放模式:结果不同:A:1,1,1,B:1,1,2
您使用的方式会printf
导致未定义的行为。未指定函数参数的评估顺序。它们甚至根本不需要以谨慎的单位进行评估,因为可以评估一个表达式的一部分,然后再评估另一个表达式的一部分。这意味着如果您对评估顺序有某种依赖关系,则整个表达式可能会变得未定义。
呼吁operator <<
也是如此cout
。<<
不是序列点。cout 的不同子句的评估顺序是完全未指定的。并且由于您对评估具有与示例中相同类型的依赖关系printf
,因此您也在这里调用了未定义的行为。
因此,对于这两个表达式,您可能会得到相同的结果。你可能会得到不同的结果。当您评估其中任何一个时,守护程序可能会飞出您的鼻子。你就是说不出来。
序列点和评估顺序的主题可能相当复杂。如果您想了解更多信息,我建议您看一下这个问题:
使用 printf,在调用 printf 之前对所有参数进行评估 (x=1)。使用 cout,参数会按顺序进行评估和应用。(至少就您的编译器而言)