基本逻辑运算符问题

0 c operators

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

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

Jon*_*ice 5

运算符优先级和逻辑表达式短路评估.

&&你的逻辑条件比结合更紧密||,所以你的条件相当于:

((++k<5 && k++/5) || ++k<=8)
Run Code Online (Sandbox Code Playgroud)

以结构化方式呈现代码时更容易阅读,如下所示:

int main() {
    int k=5;
    if ((++k<5 && k++/5) || ++k<=8) {
        printf("%d",k);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

而现在是执行的一击之处.

  1. k 从5开始.
  2. ++k<5提升k到6,这不是 <5.
  3. &&表达式的后半部分从未被评估过,因为0 && ANYTHING == 0.
  4. 因为左侧||是0,右侧不是短路.必须对其进行评估.
  5. ++k<=8进展k到7,这 <=8.
  6. 总条件评估为1,因为右边||是1.
  7. if执行语句的"then"子句.
  8. k打印当前值7,即7.
  9. 程序返回0,并终止.

值得注意的是,你的&&条款的后半部分可能没有按照你的意图行事.k++/5是整数除法,因为k>5在任何时候,k++/5总是如此>=1,因此总是如此.