【问题标题】: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,所以它不应该短路吗?

感谢您的回复。

【问题讨论】:

  • 添加括号解决了问题这一事实应该可以揭示答案 - && 绑定比 ? : 更紧密

标签: java logic conditional-operator short-circuiting


【解决方案1】:

这是由于operator precedence。您没有明确括号的条件实际上被评估为

return (super.isAvailable() && expander != null 
    && rightNotLeft) ? !expander.isExpandedRight() : expander.isExpandedRight();

【讨论】:

  • 嗯,好吧,我只是从没想过三元项会被分解,我一直认为它是一个单独的表达式,可以作为一个整体进行评估,而不是作为其余部分的一部分。感谢您帮助我加深理解。
猜你喜欢
  • 2016-04-14
  • 2020-07-22
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多