我不知道有沒有人可以爲我解釋這段代碼?我想知道爲什麼這段代碼會產生2
unsigned int x = 0;
(x ^= x) || x++ || ++x || x++;
printf("%d\n", x);
當我編譯這個使用gcc 4.2我的電腦上
,輸出爲2
原本我以爲也許這行爲是不確定的,但後來我的身影||比其他運營商的優先級低,所以答案不應該是3?由於有三個「++」。
有人可以解釋一下嗎?在x
至0 /關
(x ^= x)
設置所有位:謝謝
我不知道有沒有人可以爲我解釋這段代碼?我想知道爲什麼這段代碼會產生2
unsigned int x = 0;
(x ^= x) || x++ || ++x || x++;
printf("%d\n", x);
當我編譯這個使用gcc 4.2我的電腦上
,輸出爲2
原本我以爲也許這行爲是不確定的,但後來我的身影||比其他運營商的優先級低,所以答案不應該是3?由於有三個「++」。
有人可以解釋一下嗎?在x
至0 /關
(x ^= x)
設置所有位:謝謝
(x ^= x)
評價和它產生0,因此:(x++)
進行評價,並將其產量0,因此:(++x)
評價和它產生2,因此它停止這一切歸結爲一條規則:||
只評估其右側如果它的左側是假的。
老鼠!你是對的。我在看它溢出一個32位整數,然後加3(它也會產生2),但你的答案是正確的。 –
@PeterRowell這很有趣,我沒有想到:-) – cnicutar
的||
運營商之間的表達將被評估的從左至右,直到一個是true
。 (false
);
x++
增量x
,它現在1
,但仍false
,因爲這是後增量。
++x
(預)遞增x
,這是現在2
並且還true
,所以沒有必要對||
右手側進行評估。
你一定很困,0 XOR 0不評價爲1,即使你有11.8k點:) –
@owlstead - 我最初誤讀了代碼。我想我已經編輯了這個錯誤。我錯過了嗎? – Flexo
我現在正在讀些不同的東西,所以我在更新時寫了評論(編輯後提交2分鐘,看起來好像是)。 –
問題是||
運營商是短路。只要它找到真值,就不再需要檢查剩餘的||
語句;答案是已知的。
(x ^= x)
的計算結果爲0。
x++
的計算結果爲0,然後遞增x
爲1
++x
的計算結果爲2 - 真。
最終或聲明不需要計算。它「短路」並立即返回true。
這是看起來正確的答案,其他人忘記解釋++運算符在評估表達式的那部分後生效。 –
這是短路語義在行動。第一個表達式x ^= x
評估爲0
,第二個表達式也評估爲0
。第三個評估爲2
,然後邏輯表達式被短路,因爲它的結果已經確定爲true
。
行爲是明確的。你正在觀察||的短路行爲;最終的x ++永遠不會被評估。
當然,你不應該使用這樣的結構,但讓我們分析表達式。
有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.
它並不是'''的優先事項,事實上,它是一個序列點。 – Flexo
行爲是完全明確的(不同於這裏定期問的類似問題)。 –