为什么前两个变量 (a, b) 是预递增的,而第三个变量不是 (c)?

Why the first two variables (a, b) are pre-incremented but the third one is not(c)?

我遇到了无法理解的问题。 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);
}

谢谢。

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

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

(expression A) || (expression B)

并且表达式A被计算为TRUE,表达式B是什么并不重要!
它可以是TRUE,或者FALSE,但是由于 ||.

,整体表达式仍将是 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