当"++ i && ++ j"求值为真时,为什么"k = ++ i && ++ j || ++ k"中的"k"不递增?

Rüp*_*ure -1 c expression logical-operators

复合逻辑AND/OR 表达式中的各个表达式是否应该在将逻辑运算符应用于其结果之前首先进行求值?为什么在以下程序++k的条件中不受影响m = ++i && ++j || ++k:

 #include<stdio.h>

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

输出: -2,3,0,1

但我期待输出 -2,3,1,1

Bas*_*tch 6

你应该避免编写这样不可读的代码.它实际上被解析为

m = (++i && ++j) || ++k;
Run Code Online (Sandbox Code Playgroud)

因此,一旦j >= 0++j条件总是为真,所以++k不评价,因为&&是短切,然后||是短切或其他(所以他们可能不会评估其右操作数).

所以&&评估如下:左操作数被评估,如果它是假的,则返回,然后只有当它为真(即不等于0)时,右操作数被评估并作为评估结果返回&&.同样地||评估如下:评估左操作数.如果它是真的(非零)它就成了||; 否则评估右操作数并且是||表达式的结果.

特别是,当if (x > 0 && 20/x < 5)从未尝试对分割进行编码时x==0.

另请阅读C&C++中的维基百科运算符以及短路评估惰性评估页面; 请花几个小时阅读一本好的C编程书.