2015-12-25 38 views
6

我有我的書的問題一個問題: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=0d=1

+0

您的答案被接受。這需要儘可能多的證據。我有時想知道我是不是過度使用它,當我寫出這樣的答案時,當我完成時,有人寫了一個'Try this''''接受了相反的答案。 – GolezTrol

+0

@GolezTrol我想先生你打算在我的回答下發表評論,但是,謝謝。 :) –

+0

@SouravGhosh啊,這就是評論去的地方!我的意思是將它發佈在[你在Meta上的問題](http://meta.stackoverflow.com/questions/313420/how-much-explanation-is-good-am-i-overdoing-it),但後來我不能再也找不到它了。 :) – GolezTrol

回答

15

我相信你已經得到了你的答案,但只是逐步闡述一下,讓我再補充一點。首先,引述&&||運營商的屬性,從分別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 == 6b == -6,c == 0d ==1


話雖如此,void main()應改爲int main(void),至少與標準保持一致。

+0

謝謝你,你的解釋非常明確,但我在void main()和int main(void)之間混淆了,上面的代碼我直接從我的書中複製過來。 –

+0

@ Hoang.T有很好的討論貼[這裏](http://stackoverflow.com/q/204476/2173917)。閱讀它。 :) –

14

|| OR運算符是短路的,這意味着如果左側爲真,那麼右側不進行評估。在這種情況下,++a && ++b的計算結果爲true,因此++c永遠不會運行,並且c會保持其值爲零。

此外,由於它的計算結果爲真,因此用1表示,該值存儲在d中。

任何非零值被認爲是真,布爾運算的結果被定義爲01作爲整數。