繁体   English   中英

你能解释输出吗?

[英]Can you explain the Output?

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

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

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

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

函数调用f(a,b,c) a,b和c的求值顺序未指定。

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

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

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

谢谢你的答案.... :)行为是真的未定义和编译器相关。 这是一些输出

用Turbo编译c:20 20 10

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

用CC编写:20 20 20

用gcc编译:20 20 20

用dev c ++编译:20 20 10

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

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

不是为了修改以前的正确答案,而是提供一些额外的信息:根据标准,即使这样也是未定义的:

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

高度依赖于编译器

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM