2011-11-03 85 views
3

我不知道有沒有人可以爲我解釋這段代碼?我想知道爲什麼這段代碼會產生2

unsigned int x = 0; 
(x ^= x) || x++ || ++x || x++; 

printf("%d\n", x); 
當我編譯這個使用gcc 4.2我的電腦上

,輸出爲2

原本我以爲也許這行爲是不確定的,但後來我的身影||比其他運營商的優先級低,所以答案不應該是3?由於有三個「++」。

有人可以解釋一下嗎?在x至0 /關

(x ^= x) 

設置所有位:謝謝

+3

它並不是'''的優先事項,事實上,它是一個序列點。 – Flexo

+0

行爲是完全明確的(不同於這裏定期問的類似問題)。 –

回答

6
  • (x ^= x)評價和它產生0,因此:
  • (x++)進行評價,並將其產量0,因此:
  • (++x)評價和它產生2,因此它停止

這一切歸結爲一條規則:||只評估其右側如果它的左側是假的。

+0

老鼠!你是對的。我在看它溢出一個32位整數,然後加3(它也會產生2),但你的答案是正確的。 –

+0

@PeterRowell這很有趣,我沒有想到:-) – cnicutar

0

||運營商之間的表達將被評估的從左至右,直到一個是true。 (false);

x++ 

增量x,它現在1,但仍false,因爲這是後增量。

++x 

(預)遞增x,這是現在2並且還true,所以沒有必要對||右手側進行評估。

+0

你一定很困,0 XOR 0不評價爲1,即使你有11.8k點:) –

+1

@owlstead - 我最初誤讀了代碼。我想我已經編輯了這個錯誤。我錯過了嗎? – Flexo

+0

我現在正在讀些不同的東西,所以我在更新時寫了評論(編輯後提交2分鐘,看起來好像是)。 –

5

問題是||運營商是短路。只要它找到真值,就不再需要檢查剩餘的||語句;答案是已知的。

(x ^= x)的計算結果爲0。
x++的計算結果爲0,然後遞增x爲1
++x的計算結果爲2 - 真。

最終或聲明不需要計算。它「短路」並立即返回true。

+0

這是看起來正確的答案,其他人忘記解釋++運算符在評估表達式的那部分後生效。 –

1

這是短路語義在行動。第一個表達式x ^= x評估爲0,第二個表達式也評估爲0。第三個評估爲2,然後邏輯表達式被短路,因爲它的結果已經確定爲true

2

行爲是明確的。你正在觀察||的短路行爲;最終的x ++永遠不會被評估。

0

當然,你不應該使用這樣的結構,但讓我們分析表達式。

有4個表達與快捷-OR組合:

a || b || c || d 

b,c和d,只能判斷,如果是假,C和D僅當b爲假太和D僅當所有從前是錯誤的。

Ints評估爲0 == false,其他一切都不是錯誤的。

x ^= 0 

其中x爲0再次爲0。

x++ 

被評估並隨後增加,所以它的計算結果爲0,它調用表達式c,但後面的x會增加。

++x 

首先加,導致1,然後進行評價(導致1),這是原因,爲什麼d不評估,但B的增量未決,所以我們得到2.

但我不確定這樣的行爲是否被精確定義,並導致在所有編譯器上得到相同的結果。

Avoid it. 
相關問題