你能解释输出吗?

时间:2010-04-29 09:26:31

标签: c++ c

以下代码的输出应该是什么?为什么?我有点困惑。

int a =10;
printf("%d %d %d",a,a=a+10,a);

7 个答案:

答案 0 :(得分:20)

输出是不确定的,因为a=a+10是副作用,编译器可以在任何其他参数之前或之后自由评估它。

编辑:正如David指出的那样,行为实际上是 undefined ,这意味着所有的赌注都已关闭,你永远不应该编写这样的代码。在实践中,编译器几乎总是会做一些看似合理且不可预测的事情,甚至可能在调试和优化构建之间有所不同。我认为抹香鲸不是一种可能的结果。牵牛花?也许

答案 1 :(得分:11)

  

未指定函数调用f(a,b,c)中a,b和c的评估顺序。

阅读序列点以获得更好的想法:(在这种特殊情况下未定义的行为不是由于序列点。感谢@stusmith指出这一点)

  

命令式编程中的sequence point定义了计算机程序执行中的任何一点,保证先前评估的所有副作用都已执行,并且尚未执行后续评估的副作用。它们经常在引用C和C ++时被提及,因为某些表达式的结果可能取决于它们的子表达式的评估顺序。添加一个或多个序列点是确保结果一致的一种方法,因为这会限制可能的评估顺序。

     

当同一个变量被多次修改时,序列点也会发挥作用。一个经常被引用的例子是表达式i=i++,它将i分配给自身并递增i; i的最终价值是多少?语言定义可能指定一种可能的行为,或者只是说行为未定义。在C和C ++中,评估这样的表达式会产生未定义的行为

答案 2 :(得分:9)

感谢您的回答...... :) 行为实际上是未定义的并且依赖于编译器。这是一些输出

使用Turbo c编译: 20 20 10

使用Visual Studio c ++编译: 20 20 20

与CC一起编译: 20 20 20

使用gcc编译: 20 20 20

使用dev c ++编译: 20 20 10

答案 3 :(得分:4)

未定义。
功能参数的评估顺序不是由标准定义的 所以这个输出可能是任何东西。

答案 4 :(得分:3)

在Bloodshed Dev C ++中使用Mingw Compiler:20 20 10

答案 5 :(得分:2)

不要修改以前的正确答案,而是修改一些额外的信息:根据标准,即使这样也不明确:

int a =10;
printf("%d %d %d", a = 20, a = 20, a = 20);

答案 6 :(得分:1)

高度依赖编译器

因为参数的评估顺序未由标准指定。