2012-02-22 20 views
5

我正在研究C的基礎知識,並試圖解決下面的問題,任何人都可以解釋爲什麼變量c的輸出是不同的?爲什麼c不會在輸出中增加?

以下程序的輸出是什麼?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

答案:-2,3,0,1

c爲什麼沒有在輸出遞增?

+1

d =((-2 && 3)||(++ C))。它在達到c之前短路。 – 2012-02-22 16:24:04

+0

你究竟在做什麼?或者你只是簡單地玩一些代碼? – Bart 2012-02-22 16:25:27

+0

簡單解決c謎題 – Nisha 2012-02-22 16:56:51

回答

10

變量c不會遞增,因爲||的RHS(右側)不會被執行,除非LHS評估爲假,並且LHS評估爲真。 C ||&&運營商是'短路'運營商;他們不評估第二個操作數,除非第一個操作數不足以確定表達式的整體真值。

&&結合比||更緊,所以操作可以括號爲:

d = (++a && ++b) || ++c; 

++a的值爲-2,其評估爲真(,因爲這是不爲0的任意值的計算結果爲真); ++b的值爲3,其結果爲真;所以&&這個術語的值是真實的。由於true || falsetrue || true都評估爲true,因此無需評估RHS以瞭解整體結果。 (&&的類似規則是,如果第一項評估爲假,則不需要評估第二項,因爲整體表達式必須是假的。如果在測試之前有a = -1;,則b不會遞增,因爲++a會因爲&&的RHS是未評估的,當然,c會增加,因爲||的LHS將是錯誤的,並且必須對RHS進行評估以確定總體結果。)

+2

也許他不明白-2和3如何評估爲真。 – 2012-02-22 16:27:46

+0

@ 0A0D:我已經說過 - 你可能是對的。 – 2012-02-22 16:36:46

9

因爲++a && ++b評估爲true

這就是所謂的短路。條件內的表達式從左到右進行評估。如果您的情況,如果OR子句中的第一個條件評估爲true,則沒有必要對第二個條件進行評估,因爲已知整個表達式爲true

2

在C中,布爾邏輯運算符&&||short-circuiting。這意味着他們只評估他們的右側,如果評估左側還不足以知道答案。

對於您的代碼,這樣做的效果是從不評估++c,因爲左側不爲零,因此布爾值或結果將爲true,因此無需執行更多工作。

2

這是懶惰的布爾表達式評估。 執行是:

++a-2

++b3

-2 && 31

好吧!無需檢查||的結果。因此++c未被評估。

規則是:表達式部分X在下列情況下不進行評估:(0 && X),(1 || X)。當然這裏1是「不是0」。

2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

這就是它大致是如何工作的幕後...