我遇到了一个我无法理解的问题。 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
关于c - 为什么前两个变量 (a, b) 是预递增的,而第三个变量不是 (c)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49908704/