为什么代码中的输出不是这个?
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 = 1
和 1 || 1 = 0
因此,在使用 ||
运算符评估语句时,一旦第一个条件为真,就无需评估此处发生的第二个表达式。
||
之前的表达式为真,因此 ||
之后的部分 ++K 不会被执行,因此 k
不会递增。因此,K 的值保持为 0,m 的值为 1,因为 ||
的左边为真且 true || <anything>
始终为 true
.
||
有短路评估,这意味着只有当左侧是 false
时,右侧才会被评估。在您的情况下,这不会发生,因为 i
和 j
在递增后的值都不同于 0
,因此 ++k
不会执行
当您有一个 &&
时,会发生相同的行为,其中 LHS 表达式的计算结果为 false
不要与 Precedence and Order of evaluation.
混淆
逻辑OR||
的求值顺序是从左到右。
所以如果 left = true
那么 left || right
永远不会执行 right
。在您的代码中发生了完全相同的情况。
如您所知,任何非零值在 C 中都被视为 true
,因此,++i
或 -2
是 true
。所以,
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
#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 = 1
和 1 || 1 = 0
因此,在使用 ||
运算符评估语句时,一旦第一个条件为真,就无需评估此处发生的第二个表达式。
||
之前的表达式为真,因此 ||
之后的部分 ++K 不会被执行,因此 k
不会递增。因此,K 的值保持为 0,m 的值为 1,因为 ||
的左边为真且 true || <anything>
始终为 true
.
||
有短路评估,这意味着只有当左侧是 false
时,右侧才会被评估。在您的情况下,这不会发生,因为 i
和 j
在递增后的值都不同于 0
,因此 ++k
不会执行
当您有一个 &&
时,会发生相同的行为,其中 LHS 表达式的计算结果为 false
不要与 Precedence and Order of evaluation.
混淆逻辑OR||
的求值顺序是从左到右。
所以如果 left = true
那么 left || right
永远不会执行 right
。在您的代码中发生了完全相同的情况。
如您所知,任何非零值在 C 中都被视为 true
,因此,++i
或 -2
是 true
。所以,
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