Java中多括号的运算符优先级

Java中多括号的运算符优先级,java,operators,Java,Operators,例如,如果currNode.left和currNode.right为空,我希望在计算任何超出currNode.left!=null,但以下if语句抛出null指针错误,因为它首先计算括号中的语句: if (currNode.left != null && currNode.right != null && (currNode.left.val == x && currNode.right.val == y) || (currNode.left.va

例如,如果
currNode.left
currNode.right
为空,我希望在计算任何超出
currNode.left!=null
,但以下if语句抛出null指针错误,因为它首先计算括号中的语句:

if (currNode.left != null && currNode.right != null && (currNode.left.val == x && currNode.right.val == y) || (currNode.left.val == y && currNode.right.val == x))
其中,末尾的一对额外括号给出了所需的行为:

if (currNode.left != null && currNode.right != null && ((currNode.left.val == x && currNode.right.val == y) || (currNode.left.val == y && currNode.right.val == x)))

我知道
()
&&
之前已经计算过了,但我不确定这里发生了什么。

逻辑OR
|
的优先级低于逻辑AND
&
。因此:

A && B || C && D
相当于:

(A && B) || (C && D)
而括号内的内容将首先计算


了解有关Java中运算符的更多信息:


编辑:

在您的第一个示例中:

A && B && (C && D) || (E && F)
A && B && ((C && D) || (E && F))
评估如下:

= A && B && (C && D) || (E && F)
=   R1   && (C && D) || (E && F) 
=   R1   &&    R2    || (E && F)
=   R1   &&    R2    ||    R3
=        R4          ||    R3
=                    R5
= A && B && ((C && D) || (E && F))
=   R1   && ((C && D) || (E && F))
=   R1   && (   R2    || (E && F))
=   R1   && (   R2    ||    R3   )
=   R1   &&           R4
=        R5
在第二个示例中:

评估如下:

= A && B && (C && D) || (E && F)
=   R1   && (C && D) || (E && F) 
=   R1   &&    R2    || (E && F)
=   R1   &&    R2    ||    R3
=        R4          ||    R3
=                    R5
= A && B && ((C && D) || (E && F))
=   R1   && ((C && D) || (E && F))
=   R1   && (   R2    || (E && F))
=   R1   && (   R2    ||    R3   )
=   R1   &&           R4
=        R5


请注意,
&
|
是短路运算符,这意味着如果可以通过计算左操作数推断结果,则不会计算右操作数。

但是在我的例子中,A&&B&(C&&D)|(E&&F),它首先计算(C&&D),那么为什么在A&&B&(C&&D)时不会发生这种情况呢(E&F))?在第一个示例中,
(C&D)
首先与
A&B
进行AND运算,而在第二个示例中,它首先与
(E&F)
进行OR运算。