以下是一些代码:
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
答案 0 :(得分:1)
您使用printf
的方式会导致未定义的行为。未指定对函数的参数的评估顺序。它们甚至不必以谨慎的单位进行评估,因为可以评估一个表达式的一部分,然后评估另一个表达式的一部分。这意味着如果您对评估顺序有某些依赖关系,则整个表达式可能会变得未定义。
为operator <<
调用cout
也是如此。 <<
不是序列点。 cout的不同子句的评估顺序完全没有说明。由于您在评估中具有与printf
示例相同的依赖关系,因此您也在此处调用未定义的行为。
因此,对于两个表达式,您可能会得到相同的结果。您可能会得到不同的结果。当您评估其中任何一个时,守护进程可能会飞出您的鼻子。你无法分辨。
序列点和评估顺序的主题可能相当复杂。如果你想了解更多信息,我建议你看一下这个问题:
答案 1 :(得分:0)
使用printf,在调用printf之前评估所有参数(x = 1)。 使用cout,参数将按顺序进行评估和应用。 (至少就你的编译器而言)
答案 2 :(得分:0)
浏览this Article。 这很好。
重复this条。
但是,如果我们谈论printf()
或cout<<
,请提供技术支持,
在执行printf
语句时,它接受最后一个语句更改了变量的值,并且还将更改的值影响到下一个语句,而不是当前语句。
在cout
语句中,最近的值取自变量,因此,它直接影响当前语句。
希望你能说清楚。
答案 3 :(得分:0)
陈述A和B的结果相同。
int x = 1;
printf("%d,%d,%d",x,x++,x); //A statement
//cout<<x<<x++<<x<<endl; //B statement
return 0;
<强> STATEMENT A 强>
int x = 1;
//printf("%d,%d,%d",x,x++,x); //A statement
cout<<x<<","<<x++<<","<<x<<endl; //B statement
return 0;
<强> STATEMENT B 强>
结果/行为与编译器不一致。