当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符
Posted
技术标签:
【中文标题】当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符【英文标题】:Why is the conditional (ternary) operator evaluated in a logical AND when the lhs is false当 lhs 为假时,为什么在逻辑 AND 中评估条件(三元)运算符 【发布时间】:2015-05-30 00:32:37 【问题描述】:return super.isAvailable() && expander != null
&& rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight();
我的问题是,当扩展器为空时,我得到一个空指针异常。但我认为这不应该发生,因为 expander!=null 被评估为 false,并且由于使用了 AND,整个表达式应该短路并返回 false。
return super.isAvailable() && expander != null
&& (rightNotLeft ? !expander.isExpandedRight() : expander.isExpandedRight());
上面的代码(加上括号)解决了这个问题。然而,这对我来说没有意义,因为无论条件运算符中发生什么,都无法返回 true,所以它不应该短路吗?
感谢您的回复。
【问题讨论】:
添加括号解决了问题这一事实应该可以揭示答案 -&&
绑定比 ? :
更紧密
【参考方案1】:
这是由于operator precedence。您没有明确括号的条件实际上被评估为
return (super.isAvailable() && expander != null
&& rightNotLeft) ? !expander.isExpandedRight() : expander.isExpandedRight();
【讨论】:
嗯,好吧,我只是从没想过三元项会被分解,我一直认为它是一个单独的表达式,可以作为一个整体进行评估,而不是作为其余部分的一部分。感谢您帮助我加深理解。以上是关于当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符的主要内容,如果未能解决你的问题,请参考以下文章