2014-08-29 139 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