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

标签 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);
}

谢谢。

最佳答案

这是短路行为,是 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/

相关文章:

c++ - libcurl 放置数据流而不是文件

管道多个命令的 C 程序

c - c中的逻辑运算和预递增

php - echo++$a + $a++ 的输出应该是什么

c - 如何在字符中显示一个词?

C - 从输入文件中读取,将测试分数转换为字母等级,计算平均值,提取每个测试的最小值和最大值

python - 如果大小增加,为什么 python 列表的位置没有改变?

c - a[j++] =++i 的等效表达式,不使用前置或后置增量运算符

javascript - Javascript 中的预增量

c - C 语言 gcc 编译器中前后增量的意外行为