为什么变量本身不增加?

时间:2019-11-27 14:39:36

标签: c logical-operators logical-or logical-and

我在这里很难理解这段代码。我的问题是为什么后增量不对变量j起作用?似乎该行永远不会执行,并且最终显示0 0而不是0 1?

#include <stdio.h>

int main() {
    int i = 0, j = 0;
    (i == 0) || j++;
    printf("%d %d", i, j);
}

如果有人向我解释我错了,我将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:10)

如果第一个操作数(子表达式)的结果为true,则不对逻辑OR运算符的第二个操作数求值。

在此表达式中

(i == 0) || j++;

i == 0为真,因此不计算第二个操作数j++

如果您要像这样重写表达式

(i == 0) && j++;

然后将评估第二个操作数(子表达式)。

根据C标准(6.5.13逻辑AND运算符)

  

4与按位二进制&运算符不同,&&运算符保证   从左到右的评估;如果对第二个操作数求值,则存在   第一和第二次评估之间的顺序点   操作数。 如果第一个操作数比较等于0,则第二个操作数   未评估。

和(6.5.14逻辑或运算符)

  

4与按位|运算符,||运营商保证   从左到右的评估;如果对第二个操作数求值,则存在   第一和第二次评估之间的顺序点   操作数。 如果第一个操作数比较不等于0,则第二个   操作数未评估。

答案 1 :(得分:2)

(i == 0)的值为1,因此||的结果为1。在这种情况下,它不会执行j++。例如,如果是(i == 1) || j++;,则j会增加。

这是here的解释:

  

lhs评估后有一个序列点。如果结果   的lhs比较不等于零,然后根本不评估rhs   (所谓的短路评估)