java运算符优先级DOT与逻辑AND

时间:2015-10-09 08:26:14

标签: java operator-precedence

if(fName != null && fName.isEmpty())

在这个if表达式中,我们有4个运算符

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

我按优先顺序列出,并且都具有相同的关联性,即从左到右

然后为什么这个表达式按照下面的顺序进行评估(据我所知)

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

2 个答案:

答案 0 :(得分:3)

逻辑AND运算符(&&)被短路。这意味着仅在左操作数计算为true时才评估右操作数。

因此首先评估fName != null

如果确实如此,则接下来评估fName.isEmpty(),最后评估&&运算符本身,因为在评估其操作数之前无法对其进行求值。

以下是JLS

的相关引用

15.7:

  

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。

15.7.1:

  

在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已完全评估。

15.7.2:

  

Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外似乎都要完全评估。

答案 1 :(得分:0)

  • 在Java中,操作数从左到右进行评估。因此,首先评估!=,作为&&的左操作数的一部分,具有更高的优先级。
  • &&如果运算符的左操作数为假,则运算符不会计算其右操作数。

您发布的运营商 associativity 与此无关。