你能解释输出吗?

use*_*742 5 c c++

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

int a =10;
printf("%d %d %d",a,a=a+10,a);
Run Code Online (Sandbox Code Playgroud)

Mar*_*tos 20

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

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

  • 实际上,行为是不确定的,这意味着系统所做的任何事情(包括变成抹香鲸和一碗矮牵牛花)都完全符合标准. (4认同)

Ama*_*osh 11

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

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

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

当同一个变量被多次修改时,序列点也会发挥作用.一个经常被引用的例子是表达式i=i++,它既赋予i自身又增加i; 什么是最终价值i?语言定义可能指定一种可能的行为,或者只是说行为未定义.在C和C++中,评估这样的表达式会产生不确定的行为.


use*_*742 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

  • +1实际上在不同的编译器上尝试它. (3认同)
  • 只是想知道:谁真的关心结果?无论如何,这是**未定义的**行为! (2认同)