我在这里无法理解这段代码。我的问题是为什么后增量对变量 j 不起作用?似乎该行永远不会执行并且最终打印 0 0 而不是 0 1?
#include <stdio.h>
int main() {
int i = 0, j = 0;
(i == 0) || j++;
printf("%d %d", i, j);
}
如果有人向我解释我错在哪里,我将不胜感激,谢谢!
我在这里无法理解这段代码。我的问题是为什么后增量对变量 j 不起作用?似乎该行永远不会执行并且最终打印 0 0 而不是 0 1?
#include <stdio.h>
int main() {
int i = 0, j = 0;
(i == 0) || j++;
printf("%d %d", i, j);
}
如果有人向我解释我错在哪里,我将不胜感激,谢谢!
如果第一个操作数(子表达式)为真,则不计算逻辑 OR 运算符的第二个操作数。
在这个表达式中
(i == 0) || j++;
i == 0
为真,因此j++
不计算第二个操作数。
如果你将重写表达式
(i == 0) && j++;
然后将评估第二个操作数(子表达式)。
来自 C 标准(6.5.13 逻辑与运算符)
4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间有一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
和(6.5.14 逻辑或运算符)
4 不同于按位 | 运算符,|| 运算符保证从左到右的评估;如果计算第二个操作数,则在第一个和第二个操作数的计算之间有一个序列点。如果第一个操作数比较不等于 0,则不计算第二个操作数。
(i == 0)
evaluates to 1
, so the result of the ||
is 1
. It doesn't execute the j++
in this case. If it was (i == 1) || j++;
instead, for instance, then j
would be increased.
This is explained here:
There is a sequence point after the evaluation of lhs. If the result of lhs compares unequal to zero, then rhs is not evaluated at all (so-called short-circuit evaluation)