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

为什么是7的输出,而不是8?(我是一个初学者在编程所以请多多包涵。)基本的逻辑运算问题

+0

我很确定这个特定代码的输出是未定义的。在同一语句中对同一变量执行多个增量是C和C++的经典“未定义行为”。它可能会炸毁太阳,仍然是“正确的”。 – Telastyn 2014-08-29 19:57:29

+0

,因为未定义的行为,这意味着*任何*可能发生在打印7或8以擦除硬盘 – 2014-08-29 19:58:28

+2

@Telastyn:'&&'和'||'处有一个序列点,因此此代码具有明确定义的语义。 – mafso 2014-08-29 22:50:32

回答

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<5进步k〜6,这是不<5
  3. &&表达式的后半部分从未被评估过,因为0 && ANYTHING == 0
  4. 因为||的左侧是0,所以右侧是而不是短路。它必须被评估。
  5. ++k<=8 advance k to 7,其中<=8
  6. 总条件的计算结果为1,因为||右手边是1
  7. 的“则” if语句的WHERE子句被执行。
  8. 打印当前值k,即7。
  9. 该程序返回0,并终止。

还值得注意的是,&&条款的后半部分可能没有达到您的要求。 k++/5是整数除法,并且因为k>5在任何时候,k++/5将始终为>=1,因此始终为真。

+0

谢谢,Jonathan Eunice。 – user147699 2014-08-30 01:15:49

+0

不客气@ user147699。如果您认为这回答了您的问题,请点击左上方的复选标记以“接受”答案。 – 2014-08-30 19:51:09