【问题标题】:How do I calculate the output [duplicate]如何计算输出[重复]
【发布时间】:2019-03-16 15:33:49
【问题描述】:
#include<stdio.h>
  void main()
  {
     int x=3,y=2,z=0,m;
     m=++x || ++y && ++z;
 printf("\n %d %d %d %d\n",x,y,z,m);  //  4  2  0  1
   } 

以下代码的输出在程序中作为注释被提及,我正在尝试评估这个答案是如何产生的,但我无法理解。

我只是想知道程序是如何计算相对值的。

【问题讨论】:

  • ++x 的值为 4(并将 4 分配给 x 作为副作用)。 4 || &lt;anything&gt; 的值为 1 并且不计算 &lt;anything&gt;。所以你的m 得到1,你的x 得到4,你的其他变量没有改变。
  • 而这段代码不能用在严肃的程序中。
  • 基本上,如果|| 的左侧操作数的计算结果为真,则右侧的所有内容都将被忽略。所以你不妨写m = ++x || y++ + ++y / 0 + *(int*)NULL;,它会工作得很好,因为||右侧的所有错误都被忽略了。
  • @Lundin:即使在隐藏的结构后面,y++ + ++y 仍然是 UB。编译器本身会对此感到厌烦:)

标签: c operators logical-operators


【解决方案1】:

感谢pmg,我已经更正了我原来的答案(我有一个错误)

因为 OR 运算符 (||) 的左侧不为零,所以它不会计算该行上的任何其他内容。这被称为“短路算子”。在你给出的这个例子中,程序员基本上是在欺骗编译器。如果运算符右侧的参数不影响结果,则不会执行该代码。但是在这种情况下,那里有增量,它们也不会被评估。 这会将“1”分配给 m。 你的输出应该是 3, 2, 0, 1。

【讨论】:

  • 不,当程序看到4 ||short-circuits further evaluation并返回1yz 不要“承受”增量。
  • 我会编辑的。谢谢你。
  • @johnlord 但这与运算符优先级有什么关系吗??
  • 阅读pmg的评论。该链接解释了它。如果左侧计算结果为零以外的值,则逻辑或阻止右侧代码运行。
猜你喜欢
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2021-12-13
相关资源
最近更新 更多