This question was migrated from Software Engineering Stack Exchange because it can be answered on Stack Overflow. Migrated5年前。Learn more
#include <stdio.h>
int main()
{
    int k=5;
    if(++k < 5 && k++ / 5 || ++k <= 8)
    {
         printf("%d",k);
    }
    return 0;
}

为什么输出是7而不是8?(我是一个编程初学者,请容忍我。)

最佳答案

Operator precedence和逻辑表达式short circuit evaluation
逻辑条件中的&&绑定比||更紧密,因此条件相当于:

((++k<5 && k++/5) || ++k<=8)

当代码以结构化的方式呈现时,更容易阅读,例如:
int main() {
    int k=5;
    if ((++k<5 && k++/5) || ++k<=8) {
        printf("%d",k);
    }
    return 0;
}

现在是死刑的一个打击。
k从5点开始。
++k<5前进到6,而不是k
<5表达式的后半部分永远不会计算,因为&&
因为0 && ANYTHING == 0的左侧为0,所以右侧不短路。必须进行评估。
||前进到7,即++k<=8
总条件计算为1,因为k的右侧为1。
执行<=8语句的“then”子句。
打印当前值||,即7。
程序返回0并终止。
同样值得注意的是,您的if子句的后半部分可能没有按照您的意图执行。k是整数除法,并且由于始终&&k++/5将始终k>5,因此始终为真。

关于c - 基本逻辑运算符问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25577166/

10-11 22:53
查看更多