2013-11-28 29 views
1
boolean a = false; 
    boolean b = false; 
    boolean c = false; 
    boolean bool = (a = true) || (b = true) && (c = true); 
    System.out.println("" + a + b + c); 

臨時代碼打印truefalsefalse。但是,該&&運營商具有更高的優先級比||運營商,應該先進行評估,那麼爲什麼不將其打印truetruetrue使用AND和OR進行表達式評估的Java順序

+2

是故意的,你使用賦值'=',而不是比較''==? –

+0

是的。這是OCA模擬考試的一個例子 – korshyadoo

回答

8

相信你的問題的關鍵是這一部分:

但是,在& &操作具有更高的優先級比||運營商和應首先

號優先級不影響執行訂購進行評估。這是有效的包圍。因此,您的表達等同於:

boolean bool = (a = true) || ((b = true) && (c = true)); 

...仍然首先執行a = true ...。在這一點上,作爲結果一定會true||是短路,不執行的||右手操作,所以bc都是假的。

JLS section 15.7.1

二進制運算符的左邊的操作數出現的右側操作數的任何部分被評估前被完全評估。

優先級是不相關了這一點。

+0

如果它不改變執行順序,那就可以解釋它。但是,從Mala Gupta關於表達式'(a> = 99 || a <= 33 && b == 10)'的OCA Java SE 7程序員I認證指南的提綱中聲明,表達式的評估從評估'a < = 33 && b == 10'。那是不正確的? – korshyadoo

+0

@ korshyadoo:是的,這是絕對不正確的。 –

3

||是短路,所以它的右側將被評估只有在左側將是false

0

,因爲它執行懶惰的評價。

由於(a = true)返回true,(b = true) && (c = true)永遠不會被評估。因此你會得到這樣的輸出。

0

的& &和||運營商會「短路」:如果沒有必要,他們不會評估右側。

+2

2 .:不一定,賦值也有返回值。這取決於他想用代碼表達什麼。 –