【问题标题】:Why the first two variables (a, b) are pre-incremented but the third one is not(c)?为什么前两个变量(a,b)是预先递增的,而第三个变量不是(c)?
【发布时间】:2018-09-29 05:26:38
【问题描述】:

我遇到了一个我无法理解的问题。 a 的输出是 6,b 是 -6,但无论我用什么变量初始化 c,它都保持不变。

#include <stdio.h>
void main()
{
int a = 5, b = -7, c = 0, d;
d = ++a && ++b || ++c;
printf("\n%d%d%d%d", a, b, c, d);
}

谢谢。

【问题讨论】:

  • 短路。
  • 因为如果A 为真或B 为真,A || B 的计算结果为真。如果A 是真的,那么你不需要评估B,因为整个陈述都是真的。 ++a &amp;&amp; ++b 非零,因此它被评估为真,因此 ++c 不需要评估,也不会被执行。
  • 您不仅不需要评估B,而且如果A 评估为真,编译器禁止B 中生成执行副作用的代码。相关:例如if (p == NULL || p-&gt;value == 0) ... 是安全的,即使p 可以是NULL

标签: c pre-increment


【解决方案1】:

这是短路行为,是 C 语言的故意部分。

当 C 找到以下形式的表达式时:

(expression A) || (expression B)

而表达式 A 被计算为 TRUE,无论表达式 B 是什么!
它可能是 TRUEFALSE,但整体表达式仍将是 TRUE,因为||.

因此,C 语言甚至不会费心计算后半部分:表达式 B。那部分只是被跳过,因此 ++c 被跳过并且永远不会被计算。


只是为了好玩,如果您想更改此程序以使++c 确实发生,请将b 设置为等于-1,这样当您拥有++b 时,它就会变为0 (false)

int a = 5, b = -1, c = 0, d;

现在,表达式将以这种方式计算:

d = (6 && 0) || [ lazy, short-circuit evaluation ];
d =    0     || [ second expression is now required! ];
d =    0     ||  1;
d = 1;

输出:

6011

【讨论】:

  • 值得注意的是,如果第一个操作数的计算结果为 0false&amp;&amp; 也会短路。例如,如果a-1 开头,那么b 将不会递增,只会递增ac
猜你喜欢
  • 2020-08-14
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多