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

В этом случае выражение мы имеем 4 операторовJava приоритет операторов DOT против логическое И

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- rules-for-evaluation-order-in-java) –

ответ

3

Оператор логического И ()) короткое замыкание. Это означает, что правый операнд оценивается только в том случае, если левый операнд имеет значение true.

Поэтому fName != null оценивается первым.

Если это правда, то оценивается fName.isEmpty(), и, наконец, вычисляется сам оператор &&, так как вы не можете его оценить, прежде чем оценивать его операнды.

Вот соответствующие цитаты из JLS:

15.7:

гарантирует язык программирования Java, что операнды операторов, как представляется, оцениваются в определенном порядке оценки, а именно, слева направо ,

15.7.1:

Левый операнд бинарного оператора, как представляется, в полной мере оценены до какой-либо части правого операнда вычисляется.

15.7.2:

языка программирования Java гарантирует, что каждый операнд оператора (за исключением условных операторов & &, ||, и :), как представляется, полностью оценены, прежде чем какой-либо части? самой операции.

+0

[email protected], но && имеет меньший приоритет. и(), то почему он сначала оценивает? –

+0

@AmitYadav Оператор && имеет два операнда - слева - 'FName! = Null', а справа -' fName.isEmpty() '. – Eran

0
  • В Java операнды оцениваются слева направо. Таким образом, сначала вычисляется значение! =, Являющееся частью левого операнда & & и с более высоким приоритетом.
  • Оператор не оценивает его правый операнд, если его левый операнд является ложным.

Оператор ассоциативность вы опубликовали не имеющую к нему отношения.

Смежные вопросы