This question already has an answer here:
Closed 4 years ago.
Short circuit behavior of logical expressions in C in this example
(1个答案)
复合逻辑和/或表达式中的各个表达式不应该在逻辑运算符应用于其结果之前首先求值吗?为什么在以下程序的条件下++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;
}

输出:-2,3,0,1
但我希望输出m = ++i && ++j || ++k

最佳答案

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

m = (++i && ++j) || ++k;

因此,一旦j >= 0条件始终为真,则不计算++j,因为++k是一个短切,然后&&是一个短切或其他(因此他们可能不会计算其右操作数)。
因此||的计算方法如下:对左操作数求值,如果为false则返回,然后仅当它为true(即不等于&&)时,对右操作数求值并返回为0的计算结果。同样,&&的计算如下:计算左操作数。如果为真(非零),则它将成为||的结果;否则将计算右操作数,并成为||表达式的结果。
特别是,当编码||时,决不尝试对if (x > 0 && 20/x < 5)进行除法。
同时阅读维基百科的网页;请花几个小时阅读一本好的C编程书籍。

关于c - 为什么语句“m =++ i &&++ j ||中的“k”没有增加当“++ i &&++ j”评估为真时,“++ k”? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23358090/

10-11 19:36