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

Operator precedence for multiple parentheses in Java

例如,如果 currNode.leftcurrNode.right 为 null,我希望 if 语句在进一步评估 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)
=   R1   && (C && D) || (E && F) 
=   R1   &&    R2    || (E && F)
=   R1   &&    R2    ||    R3
=        R4          ||    R3
=                    R5

在你的第二个例子中:

A && B && ((C && D) || (E && F))

这个评价如下:

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

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