【问题标题】:Ternary if operator inside a regular if one常规 if 中的三元 if 运算符
【发布时间】:2012-07-18 11:30:59
【问题描述】:

在 Java 中,如果我在常规 if 中使用三元 if 运算符,例如:

if ((x > y - z) ? true : callLongWaitedMethod(many, parameteres)) {
        loveTeddyBear();
}

如果x > y - z 确实为真,它会执行 callLongWaitedMethod 吗?我希望不是这样,我可以使用这个漂亮的语句,乍一看有点复杂,但与额外的布尔变量相比更有吸引力:

boolean b = (x > y - z) ? true : callLongWaitedMethod(many, parameteres);
if (b) {
        loveTeddyBear();
}

特别是如果我在一个反复迭代的大循环中使用它,所以从性能的角度来看,每次创建布尔值都不会很好,而如果我在循环之外声明布尔值,我可能会错过整洁因为循环很大。

【问题讨论】:

  • 只是一种风格注释——但是对这种行为进行编码只会让下一个人更难弄清楚发生了什么。要么简化以使其易于阅读,要么在此处发表评论以说明意图。
  • 您在这里所做的只是重新发明条件或运算符
  • 简而言之 - NO,并且总是接吻(保持简单和愚蠢)。
  • @SophieSperner : 我知道它是三元的
  • 苏菲,不是或;它是条件或。阅读 Java 语言规范中的所有内容。

标签: java if-statement ternary-operator


【解决方案1】:

这将如您所愿,但使用普通的|| 运算符来完成完全相同的结果会更清楚:

if ((x > y - z) || callLongWaitedMethod(many, parameteres)) {
        loveTeddyBear();
}

【讨论】:

  • 在您的变体中,callLongWaitedMethod 无论如何都会被执行?这就是我把它改成三元形式的原因。
  • 不,除非第一个为 false,否则不会执行 callLongWaitedMethod。如果第一个参数为真,|| 运算符不会计算第二个参数。
【解决方案2】:

根据Java Language Specification 15.25,只有在必要时才会评估long方法:

未选择的操作数表达式不会针对条件表达式的特定求值进行求值。

【讨论】:

    【解决方案3】:
    如果x > y - z 为真,

    callLongWaitedMethod不会被调用。

    【讨论】:

    • 谢谢你,让我平静)
    【解决方案4】:

    如果您想在(x > y - z) 为真时执行callLongWaitedMethod,您实际上必须交换表达式:

    if ((x > y - z) ? callLongWaitedMethod(many, parameteres) : true ) {
            loveTeddyBear();
    }
    

    【讨论】:

    • 不,如果是真的,我不需要执行它,只有在更简单的表达式(x > y - z)不为真时才需要。
    【解决方案5】:

    看来你有你想要的答案。您也可以只使用带有简单版本代码的调试语句来查看执行了什么,以此作为验证行为的一种方式。类似的东西

    if ((1 > 2) ? true : someSimpleMethod()) {
        System.out.println("true if");
    }
    

    就像你的someSimpleMethod() 一样

    public boolean someSimpleMethod() {
        System.out.println("calling someSimpleMethod()");
        return true;
    }
    

    您可以从那里交换 1 和 2 以查看 someSimpleMethod() 是否会执行。

    【讨论】:

      【解决方案6】:

      作为编码人员,你应该问问自己,如果你不知道它会做什么,你真的应该这样编码吗?为什么不只是这样:

      if ( (x>y-z) || 
           (x<=y-z && callLongWaitedMethod(many, parameteres))) {
          loveTeddyBear();
      }
      

      这对于不熟悉您的代码的新手程序员来说会更有意义。

      【讨论】:

      • x,y,z 的第二个测试是多余的。
      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 2021-01-03
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多