以下代码的输出应该是什么?为什么?我有点困惑。
int a =10;
printf("%d %d %d",a,a=a+10,a);
答案 0 :(得分:20)
输出是不确定的,因为a=a+10
是副作用,编译器可以在任何其他参数之前或之后自由评估它。
答案 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)
高度依赖编译器。
因为参数的评估顺序未由标准指定。