2015-02-24 126 views
0

從凱茜塞拉利昂書上找到OCA/OCP Java SE 7級中的程序員我& II學習指南瞭解這個以下布爾表達式:需要幫助的if語句

int x = 2; 
int y = 5; 
if ((x > 3) && (y < 2) | doStuff()) { 
    System.out.println("true"); 
} 

這現在打印...什麼都沒有!因爲前面的代碼(少一個 括號)評估就好像你在說,「如果(x> 3) 不是真的,並且或者(y < 2)或doStuff()的結果爲真, 那麼如果(x> 3)不是真的,那麼沒有觀察表達式的其餘部分「因爲短路& &, 表達式被評估爲好像圍繞着括號(y < 2)|做東西()。

在我的理解中,運營商&&||具有相同的優先順序並從左到右進行評估。因此,在這種情況下,表達式(x > 3) && (y < 2)仍應首先進行評估。請解釋。

更新:我的錯誤。這確實是一個「|」而不是「||」。

+3

它是二進制還是「|」或者它是真的還是運營商「||」? – Necreaux 2015-02-24 21:35:58

+1

但是&&的優先級低於按位包含的OR。 – jdv 2015-02-24 21:38:36

+0

是的你是對的。你應該回答(而不是評論),那麼我會選擇你的回答。 – user1539343 2015-02-24 22:44:46

回答

5

那麼,我不一定期望它打印任何東西。條件x > 3 && y < 2對於給定的x和y值是錯誤的。

我有現在一個時刻反思運算符優先級,基本上,不管是什麼doStuff說(true或false),如果x > 3計算結果爲false,它沒有任何打印。

有效地,此表達式:

(x > 3) && (y < 2) | doStuff() 

相當於:

(x > 3) && (y < 2 | doStuff()) 

...並且由於x > 3是爲給定的值x假,則整個表達式評估爲假。這裏,&&將短路表達式,而不呼叫doStuff