2014-08-28 49 views
4

&&的優先級應該有更高的優先級比||的Java布爾

int a = 10; 
    System.out.println(a==10 || --a==9 && a==8); 
    System.out.println(a); 

此打印正確的,10它似乎只檢查了第一部分,如果其真正的第二個根本不會執行。

如果我做a==9那麼第二部分似乎評估和打印9.有人可以解釋爲什麼會發生這種情況嗎?是不是&&應該首先評估?

編輯:我明白了。 a==10 || --a==9 && a==8轉換成(a==10) || (a==9 && a==8)因此,如果第一個評估爲真,它會短路。謝謝你的幫助。

+0

沒有更高的優先級,它只是從左轉到右.. – gtgaxiola 2014-08-28 13:09:13

+0

@gtgaxiola小心,當你說沒有優先級。如果沒有優先權。如果沒有優先級,表達式將評估爲true。 – Cruncher 2014-08-28 13:11:53

+0

@Cruncher很好抓.. – gtgaxiola 2014-08-28 13:12:54

回答

4
System.out.println(a==10 || --a==9 && a==8); 

等於

System.out.println((a==10) || (((--a)==9) && (a==8))); 

的Java評估||第一。發現,左側部分(一== 10)true並得出沒有母校什麼是正確的部分結果無論如何會true

PS:這是常見的伎倆寫

if(obj != null && obj.isSomething) { ... } 

到防止NPE

3

如果您評估(a==10) || (b == 9)(這是一個OR操作), 如果第一條是true,那麼整個表達式必須是true(因爲它是OR)和第二條將不進行優化的原因被執行。

代碼是從左至右執行的,所以你會打第一TRUE因此整個說明會TRUE,和你的聲明的剩餘部分將不被執行

如果你的第一句話是false,然後只有第二個條款纔會被評估。

如果使用(a==10) | (b == 9)這兩個子句都將被評估。

如果你想成爲某些你符的優先級,你應該用括號

3

看錶情如樹木這是非常有用的順序。

a==10 || --a==9 && a==8 

在這個例子中,樹的頂端是OR。左邊的分支是EQUALS,右邊的分支是AND,其左右分支都是EQUALS。

因爲我在圖形可怕,它看起來是這樣的:

OR 
/ \----- 
    =   \ 
/\   AND 
a 10  / \ 
      =  = 
     /\ /\ 
     --a 9 a 8 

的「優先級」,你這個樹談,訂貨。但它不一定會改變執行順序。因爲在這種情況下,如果第一個分支是真的,這是真的,所以不需要檢查第二個分支。

0
|| and && are short circuit operators they don't evaluate the right hand side expression 
if the left hand side is true. 
So (--a) is never executed as (a==10) left hand side is true 
Therefore the value of a remains same. 
**& and | operators that always evaluate both sides.