【问题标题】:Java Ternary Operator inside ternary operator, how evaluated?Java 三元运算符里面的三元运算符,怎么求值?
【发布时间】:2013-08-09 12:30:26
【问题描述】:

我想这是一个非常基本的问题,我只是想知道这段代码是如何读取的:

return someboolean ? new someinstanceofsomething() : someotherboolean ? new otherinstance() : new third instance(); 

我想现在在我写它的时候我有点理解这个陈述。如果为真,它返回选项一,但如果为假,则另一个布尔检查并返回其余两个选项之一?我将继续留下这个问题,因为我以前没有见过它,也许其他人也没有。

三元运算中的三元运算能否​​无限期地继续下去?

编辑:另外,为什么这/这对于代码来说并不比使用一堆 if 语句更好?

【问题讨论】:

    标签: java ternary-operator


    【解决方案1】:

    定义在JLS #15.25:

    条件运算符在语法上是右关联的(它从右到左分组)。因此,a?b:c?d:e?f:g 的含义与a?b:(c?d:(e?f:g)) 相同。

    在你的情况下,

    return someboolean ? new someinstanceofsomething() : someotherboolean ? new otherinstance() : new third instance();
    

    相当于:

    return someboolean ? new someinstanceofsomething() : (someotherboolean ? new otherinstance() : new third instance());
    

    【讨论】:

    • 感谢您指出它是正确的关联。与处理器处理代码的方式相比,这是否比 if/if else 语句更可取?
    • @user2097211 不要担心处理器——担心未来的可维护性,做最可读的事情。在 90% 以上的情况下,这是一个 if/else 语句。我怀疑它无论如何都会产生相同的字节码。
    • @user2097211 这不太可能对性能产生任何影响。
    【解决方案2】:

    三元运算符是右结合的。请参阅 assylias 的 JLS 参考答案。

    您的示例将转换为:

    if (someboolean) {
      return new someinstanceofsomething();
    } else {
      if (someotherboolean) {
        return new otherinstance();
      } else {
        return new thirdinstance()
      }
    }
    

    是的,您可以无限期地嵌套它们。

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 2011-03-12
      • 2010-11-29
      • 2013-06-28
      • 2014-04-04
      • 2018-09-10
      相关资源
      最近更新 更多