2015-10-09 30 views
2
if(fName != null && fName.isEmpty()) 

在此,如果表達我們有4個運營商java的運算符優先級DOT VS邏輯與

1) . access object member 
2)() invoke a method 
3) != equality 
4) && conditional AND 

我列出了按優先級,並都具有相同的相關性,即從左到右

那麼,爲什麼這個表達按以下順序評估(據我所知)

1) != 
2) && 
3,4) .() 
+1

你期待它做什麼呢? –

+0

我只想知道爲什麼編譯器會按照順序排列的順序 –

+0

[Java中的評估順序是什麼規則?](http://stackoverflow.com/questions/6800590/what-are-the-規則爲評估順序在java) –

回答

3

邏輯與運算符(&&)短路。這意味着右操作數只在左操作數計算結果爲真時才被評估。因此fName != null首先被評估。

如果這是真的,接下來會評估fName.isEmpty(),最後對&&運算符本身進行評估,因爲在評估其操作數之前無法評估它。

下面是從JLS相關報價:

15.7:

Java編程語言保證運營商的操作數出現在一個特定的評估順序進行評估,即從左至右。

15.7.1:

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

15.7.2:

Java編程語言保證操作的每一個操作數(除有條件的經營者& &,||和:)似乎任何部分前應充分評估?的操作本身執行。

+0

。@Eran但是&&的優先級低於。和()那麼爲什麼它首先評估? –

+0

@AmitYadav &&操作符有兩個操作數 - 左邊是'fName!= null',右邊是'fName.isEmpty()'。 – Eran

0
  • 在Java中,操作數從左到右計算。所以!=,作爲& &左操作數的一部分,並具有更高的優先級,首先被評估。
  • & &如果操作數的左操作數爲假,操作符不會評估其右操作數。

運營商聯想性您發佈的內容與其無關。