为什么代码中的输出不是这个?

Why the output won't be this in the code?

#include <stdio.h>

int main(void) {
int i = -3, j = 2, k = 0, m;
m = ++i && ++j || ++k;
printf("%d %d %d %d\n",i,j,k,m);
    return 0;
}

我正在尝试了解 C 中运算符的结合性和优先级。在这里,输出结果是 -2 3 0 1,但我认为输出应该是 -2 3 1 1,因为 k 也预先递增。为什么那不是答案?谢谢!

1 || 0 = 11 || 1 = 0

因此,在使用 || 运算符评估语句时,一旦第一个条件为真,就无需评估此处发生的第二个表达式。

|| 之前的表达式为真,因此 || 之后的部分 ++K 不会被执行,因此 k 不会递增。因此,K 的值保持为 0,m 的值为 1,因为 || 的左边为真且 true || <anything> 始终为 true.

|| 有短路评估,这意味着只有当左侧是 false 时,右侧才会被评估。在您的情况下,这不会发生,因为 ij 在递增后的值都不同于 0,因此 ++k 不会执行

当您有一个 && 时,会发生相同的行为,其中 LHS 表达式的计算结果为 false

不要与 Precedence and Order of evaluation.

混淆

逻辑OR||的求值顺序是从左到右。

所以如果 left = true 那么 left || right 永远不会执行 right。在您的代码中发生了完全相同的情况。

如您所知,任何非零值在 C 中都被视为 true,因此,++i-2true。所以,

 m = ++i && ++j || ++k;
 m = (true && true) || bla bla bla; //right not even checked!
 m = true 
 m = 1

你得到了预期的输出。

对于实验,而不是 i = -3 尝试 i = -1,那么场景将是

 m = ++i && ++j || ++k;
 m = false && (not going to evaluate) || ++k;
 m = false || true;
 m = true 
 m = 1

输出将是:0 2 1 1