#include <stdio.h>
int main()
{
int k=5;
if(++k < 5 && k++/5 || ++k <= 8)
{
printf("%d",k);
}
return 0;
}
爲什麼是7的輸出,而不是8?(我是一個初學者在編程所以請多多包涵。)基本的邏輯運算問題
#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
進步k
〜6,這是不<5
。&&
表達式的後半部分從未被評估過,因爲0 && ANYTHING == 0
。||
的左側是0,所以右側是而不是短路。它必須被評估。++k<=8
advance k
to 7,其中是<=8
。||
右手邊是1if
語句的WHERE子句被執行。k
,即7。還值得注意的是,&&
條款的後半部分可能沒有達到您的要求。 k++/5
是整數除法,並且因爲k>5
在任何時候,k++/5
將始終爲>=1
,因此始終爲真。
謝謝,Jonathan Eunice。 – user147699 2014-08-30 01:15:49
不客氣@ user147699。如果您認爲這回答了您的問題,請點擊左上方的複選標記以「接受」答案。 – 2014-08-30 19:51:09
我很確定這個特定代碼的輸出是未定義的。在同一語句中對同一變量執行多個增量是C和C++的經典「未定義行爲」。它可能會炸燬太陽,仍然是「正確的」。 – Telastyn 2014-08-29 19:57:29
,因爲未定義的行爲,這意味着*任何*可能發生在打印7或8以擦除硬盤 – 2014-08-29 19:58:28
@Telastyn:'&&'和'||'處有一個序列點,因此此代碼具有明確定義的語義。 – mafso 2014-08-29 22:50:32