当 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 中评估条件(三元)运算符的主要内容,如果未能解决你的问题,请参考以下文章

当条件为假时执行 If 语句 True 块

C之逻辑运算符(十四)

当第一个参数为假时,VBA“与”运算符是不是评估第二个参数?

14 C#编程中的逻辑运算

JAVA中&&和是啥意思 怎么用

java 中 和 && 这类的符号都表示啥?