我正在研究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
爲什麼沒有在輸出遞增?
我正在研究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
爲什麼沒有在輸出遞增?
變量c
不會遞增,因爲||
的RHS(右側)不會被執行,除非LHS評估爲假,並且LHS評估爲真。 C ||
和&&
運營商是'短路'運營商;他們不評估第二個操作數,除非第一個操作數不足以確定表達式的整體真值。
的&&
結合比||
更緊,所以操作可以括號爲:
d = (++a && ++b) || ++c;
的++a
的值爲-2,其評估爲真(,因爲這是不爲0的任意值的計算結果爲真); ++b
的值爲3,其結果爲真;所以&&
這個術語的值是真實的。由於true || false
和true || true
都評估爲true
,因此無需評估RHS以瞭解整體結果。 (&&
的類似規則是,如果第一項評估爲假,則不需要評估第二項,因爲整體表達式必須是假的。如果在測試之前有a = -1;
,則b
不會遞增,因爲++a
會因爲&&
的RHS是未評估的,當然,c
會增加,因爲||
的LHS將是錯誤的,並且必須對RHS進行評估以確定總體結果。)
也許他不明白-2和3如何評估爲真。 – 2012-02-22 16:27:46
@ 0A0D:我已經說過 - 你可能是對的。 – 2012-02-22 16:36:46
因爲++a && ++b
評估爲true
。
這就是所謂的短路。條件內的表達式從左到右進行評估。如果您的情況,如果OR
子句中的第一個條件評估爲true
,則沒有必要對第二個條件進行評估,因爲已知整個表達式爲true
。
在C中,布爾邏輯運算符&&
和||
是short-circuiting。這意味着他們只評估他們的右側,如果評估左側還不足以知道答案。
對於您的代碼,這樣做的效果是從不評估++c
,因爲左側不爲零,因此布爾值或結果將爲true,因此無需執行更多工作。
這是懶惰的布爾表達式評估。 執行是:
++a
給-2
++b
給3
-2 && 3
給1
好吧!無需檢查||
的結果。因此++c
未被評估。
規則是:表達式部分X
在下列情況下不進行評估:(0 && X)
,(1 || X)
。當然這裏1
是「不是0」。
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
這就是它大致是如何工作的幕後...
d =((-2 && 3)||(++ C))。它在達到c之前短路。 – 2012-02-22 16:24:04
你究竟在做什麼?或者你只是簡單地玩一些代碼? – Bart 2012-02-22 16:25:27
簡單解決c謎題 – Nisha 2012-02-22 16:56:51