5

可能重複:
why 「++x || ++y && ++z」 calculate 「++x」 firstly ? however,Operator 「&&」 is higher than 「||」優先邏輯運算符的

如果你看看C'S優先順序表,你會看到& &比||更高的優先級。

但是看看下面的代碼:

a=b=c=1; 

++a || ++b && ++c; 

printf("%d %d %d\n",a,b,c); 

它打印出「2 1 1」,這意味着「++一個」先評估,一旦程序看到一個真正有它在那裏停留,因爲||的另一邊是什麼並不重要。

但由於& &的優先級高於||,不應「++ b & & ++ C」被首先計算,然後將結果插回「++一個||結果」? (在這種情況下,程序將打印「1 2 2」)。

+0

是的,我沒有明白。感謝您的高舉。 –

回答

13

只是儘量用括號想象它:

++a || ++b && ++c; 

等於

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

從左至右被評估。

如果& &和||將具有相同的優先級,它看起來像

(++a || ++b) && (++c); 
+0

很好的解釋,謝謝。 –

0

&& has higher precedence只在解析樹。但是,編譯器優化代碼

if(!++a) { 
    ++b && ++c; 
} 
+0

這不是一個優化。 –

+0

你如何更好地稱呼它呢?沒關係。 –

+0

短路是一種「優化」的想法是一次又一次出現在SO上的誤解。在很多情況下,**不是**短路就是優化。例如,'++ a | ++ b'(無分支)的計算幾乎肯定比'++ a || ++ b'(條件分支)便宜。重要的是要意識到短路不是可選行爲,結果是不同的。 –

6

優先級規則只能說,它會像這樣進行評估:

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

現在到了邏輯運算符的短路行爲,這表示,你必須評估從左到右的條款,並在結果已知時停止。右側的部分永遠不會被執行。

+0

Gotcha。你能給我一個例子,其中&&優先於||會很重要嗎?謝謝 –

+0

這裏很重要。如果它們具有相同的優先級,或者如果'||'具有更高的優先級,則它將被評估爲'(++ a || ++ b)&& ++ c',所以'++ a'和'++ c'將被評估。 –

+0

好點。謝謝。 –

0

你舉的例子++a || ++b && ++c相同++a || (++b && ++c)

2

評價的先後順序和順序是兩個完全不同的東西。對於邏輯運算符表達式,評估總是從左到右。表達++a || ++b && ++c被解釋爲

  1. 評估++一個
  2. 如果1的結果是零,評估++ b & & ++Ç

表達是解析作爲++a || (++b && ++c) ;如果子表達式++a++b && ++c中的任一個爲真,則整個表達式爲真。

+0

呃,是的我的困惑是假設優先順序也影響了評估順序。 –