我有我的書的問題一個問題:Basic編程鍛鍊一下邏輯運算符
#include<stdio.h>
void main()
{
int a=5, b=-7, c=0, d;
d = ++a && ++b || ++c;
printf("\n%d%d%d%d",a,b,c,d);
}
的問題問我什麼是代碼的輸出。我跑了它,屏幕上的結果是6-601。我明白爲什麼和b=-6
,但我不明白爲什麼c=0
和d=1
?
我有我的書的問題一個問題:Basic編程鍛鍊一下邏輯運算符
#include<stdio.h>
void main()
{
int a=5, b=-7, c=0, d;
d = ++a && ++b || ++c;
printf("\n%d%d%d%d",a,b,c,d);
}
的問題問我什麼是代碼的輸出。我跑了它,屏幕上的結果是6-601。我明白爲什麼和b=-6
,但我不明白爲什麼c=0
和d=1
?
我相信你已經得到了你的答案,但只是逐步闡述一下,讓我再補充一點。首先,引述&&
和||
運營商的屬性,從分別C11
標準,章§6.5.13和§6.5.13,
(I)
的
&&
操作者應如果得到1-它的兩個操作數都不等於0;否則,它 得出0. [...]如果第一個操作數比較等於0,則不計算第二個操作數 。
和
(II)
的
||
操作者應得到1如果任一操作數的比較不等於0;否則,它 產量爲0. [...]。如果第一個操作數比較不等於0,則第二個操作數是 未評估。
它們都保證從左到右的評估。所以,比較你的代碼,
d = ++a && ++b || ++c;
它偏偏喜歡
d = ((++a && ++b) || ++c);
計算結果爲
d = ((6 && ++b) || ++c);
然後
d = ((6 && (-6)) || ++c);
以上步驟
現在,(我)達到了,並歸結爲
d = (1 || ++c);
現在,以下重點,已經滿足(II),從而進行的||
的RHS操作數沒有進一步的評價(即,++c
不評估),它似乎是d = 1
和最終結果1存儲在d
中。
就是這樣,a == 6
,b == -6
,c == 0
和d ==1
。
話雖如此,void main()
應改爲int main(void)
,至少與標準保持一致。
謝謝你,你的解釋非常明確,但我在void main()和int main(void)之間混淆了,上面的代碼我直接從我的書中複製過來。 –
@ Hoang.T有很好的討論貼[這裏](http://stackoverflow.com/q/204476/2173917)。閱讀它。 :) –
||
OR運算符是短路的,這意味着如果左側爲真,那麼右側不進行評估。在這種情況下,++a && ++b
的計算結果爲true,因此++c
永遠不會運行,並且c
會保持其值爲零。
此外,由於它的計算結果爲真,因此用1
表示,該值存儲在d
中。
任何非零值被認爲是真,布爾運算的結果被定義爲0
或1
作爲整數。
您的答案被接受。這需要儘可能多的證據。我有時想知道我是不是過度使用它,當我寫出這樣的答案時,當我完成時,有人寫了一個'Try this''''接受了相反的答案。 –
GolezTrol
@GolezTrol我想先生你打算在我的回答下發表評論,但是,謝謝。 :) –
@SouravGhosh啊,這就是評論去的地方!我的意思是將它發佈在[你在Meta上的問題](http://meta.stackoverflow.com/questions/313420/how-much-explanation-is-good-am-i-overdoing-it),但後來我不能再也找不到它了。 :) – GolezTrol