为什么条件(三元)运算符在 lhs 为假时以逻辑 AND 求值
Why is the conditional (ternary) operator evaluated in a logical AND when the lhs is false
return super.isAvailable() && expander != null
&& rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight();
我的问题是,当 expander 为 null 时,我遇到了空指针异常。但我认为这不应该发生,因为 expander!=null 被评估为 false,并且由于使用了 AND,整个表达式应该短路并且 return false.
return super.isAvailable() && expander != null
&& (rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight());
上面的代码(加上括号)解决了问题。然而,这对我来说没有意义,因为无论条件运算符中发生什么,都无法 return true 所以它不应该短路吗?
感谢您的回复。
这是由于 operator precedence。你没有明确括号的条件实际上被评估为
return (super.isAvailable() && expander != null
&& rightNotLeft) ? !expander.isExpandedRight() : expander.isExpandedRight();
return super.isAvailable() && expander != null
&& rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight();
我的问题是,当 expander 为 null 时,我遇到了空指针异常。但我认为这不应该发生,因为 expander!=null 被评估为 false,并且由于使用了 AND,整个表达式应该短路并且 return false.
return super.isAvailable() && expander != null
&& (rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight());
上面的代码(加上括号)解决了问题。然而,这对我来说没有意义,因为无论条件运算符中发生什么,都无法 return true 所以它不应该短路吗?
感谢您的回复。
这是由于 operator precedence。你没有明确括号的条件实际上被评估为
return (super.isAvailable() && expander != null
&& rightNotLeft) ? !expander.isExpandedRight() : expander.isExpandedRight();