java运算符优先级点与逻辑和

java运算符优先级点与逻辑和,java,operator-precedence,Java,Operator Precedence,在这个if表达式中,我们有4个运算符 if(fName != null && fName.isEmpty()) 我已按优先级列出,并且所有列表都具有相同的关联性,即从左到右 那么(据我所知)为什么这个表达式按下面的顺序计算呢 逻辑AND运算符(&&)短路。这意味着只有当左操作数的计算结果为true时,才计算右操作数 因此fName!=首先计算null 如果为true,则接下来计算fName.isEmpty(),最后计算&&运算符本身,因为在计算其操作数之前不能对其求值 以下是相

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

if(fName != null && fName.isEmpty())
我已按优先级列出,并且所有列表都具有相同的关联性,即从左到右

那么(据我所知)为什么这个表达式按下面的顺序计算呢

逻辑AND运算符(
&&
)短路。这意味着只有当左操作数的计算结果为true时,才计算右操作数

因此
fName!=首先计算null

如果为true,则接下来计算
fName.isEmpty()
,最后计算
&&
运算符本身,因为在计算其操作数之前不能对其求值

以下是相关引文:

15.7:

Java编程语言保证运算符的操作数按特定的求值顺序求值,即从左到右

15.7.1:

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

15.7.2:

Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件操作符&&、| |和?:)都会得到完全计算

  • 在Java中,操作数从左到右求值。那么,作为&&的左操作数的一部分并具有更高的优先级,首先求值
  • 如果左操作数为false,&&运算符不计算右操作数

您发布的运算符关联性与此无关。

您希望它做什么呢?我只是想知道为什么编译器会按顺序对其进行求值。可能的重复项从()开始求值,因为编译器只会读取您的表达式。@Eran,但&&的优先级低于。和()那么为什么它首先求值?@AmitYadav&&运算符有两个操作数-左边是
fName!=null
右侧为
fName.isEmpty()
1) . access object member
2) () invoke a method
3) != equality
4) && conditional AND
1) !=
2) &&
3,4) . ()