Java 中多个括号的运算符优先级
Operator precedence for multiple parentheses in Java
例如,如果 currNode.left
和 currNode.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
注意 &&
和 ||
是短路运算符,这意味着如果可以从计算左操作数推断出结果,则不会计算右操作数。
例如,如果 currNode.left
和 currNode.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
注意 &&
和 ||
是短路运算符,这意味着如果可以从计算左操作数推断出结果,则不会计算右操作数。