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运算。