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

0 c pre-increment

我遇到了一个我无法理解的问题.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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

abe*_*nky 5

这是短路行为,是C语言的深思熟虑的一部分.

当C找到表单的表达式时:

(expression A) || (expression B)
Run Code Online (Sandbox Code Playgroud)

并且表达式A被评估为TRUE,表达式B是什么并不重要!
它可能是TRUE,或者FALSE,但整体表达仍然是TRUE,因为||.

因此,C语言甚至不会费心去评估下半部分:表达式B.该部分只是被跳过,因此++c被跳过并且从未进行过评估.


只是为了踢,如果你想改变这个程序以便++c确实发生,那么设置b等于-1,这样当你拥有时++b,就会变成0 (false).

int a = 5, b = -1, c = 0, d;
Run Code Online (Sandbox Code Playgroud)

现在,表达式将以这种方式进行评估:

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

输出:

6011
Run Code Online (Sandbox Code Playgroud)