基本逻辑运算符问题

时间:2014-08-29 19:43:04

标签: c operators

#include <stdio.h>
int main()
{
    int k=5;
    if(++k < 5 && k++ / 5 || ++k <= 8)
    {
         printf("%d",k);
    }
    return 0;
}

为什么输出7而不是8?(我是编程的初学者所以请耐心等待。)

1 个答案:

答案 0 :(得分:5)

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;
}

现在是执行的一个小打击。

  1. k从5开始。
  2. ++k<5k提升至6,即 <5
  3. 永远不会评估&&表达式的后半部分,因为0 && ANYTHING == 0
  4. 因为||的左侧是0,所以右侧短路。必须对其进行评估。
  5. ++k<=8k提升至7, <=8
  6. 总条件评估为1,因为||的右侧是1。
  7. 执行if语句的“then”子句。
  8. 打印k的当前值,即7。
  9. 程序返回0,并终止。
  10. 值得注意的是,&&条款的后半部分可能没有按照您的意图行事。 k++/5是整数除法,由于k>5始终为k++/5,因此>=1始终为{{1}},因此始终为真。