【问题标题】:Does Java evaluate remaining conditions after boolean result is known?Java 是否在布尔结果已知后评估剩余条件?
【发布时间】:2011-09-15 04:18:37
【问题描述】:

也就是说,如果我有一个评估多个条件的语句,比如像这样的“或”语句..

if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
{
    ...
}

如果isVeryLikely()在运行时返回true,isSomewhatLikely()isHardlyLikely()会执行吗?如果它们是静态布尔值而不是方法呢?

【问题讨论】:

标签: java


【解决方案1】:

||&& 运算符短路。

true || willNeverExecute();
false && willNeverExecute();

【讨论】:

    【解决方案2】:

    首先需要注意的是,Java 条件语句只能采用布尔值,这与 C/C++ 等其他语言不同,任何非零值都会计算为真。

    话虽如此,有两种类型的运算符,第一种称为短路类型:

    && and ||
    

    而其他的是非短路类型:

    & and |
    

    对于短路类型,一旦可以找到逻辑输出作为表达式的答案,语句的其余部分将被转储。对于非短路类型,他们将继续评估所有条件。

    考虑到这一点,你有什么:

    if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely())
    {
        ...
    }
    

    Java 将:

    1. 首先检查 isVeryLikely() 返回真。如果是真的,那么它将 不再继续。
    2. 如果 isVeryLikely() 返回 false, 然后调用 isSomewhatLikely() 来 看看它是否返回true。如果是真的, 如果评估没有别的。如果是假的, 转到 3。
    3. isHardlyLikely() 被调用。如果 真,整个表达式为真, 否则为假,全部 表达式为假。

    您要问的整个概念是“Java 如何评估逻辑表达式”。好问题:)

    希望对您有所帮助!干杯!

    【讨论】:

      【解决方案3】:

      不,java 对使用||&& 的表达式使用短路求值。请参阅here 了解更多信息。

      【讨论】:

      • 不是所有的“布尔表达式”;您可以将&| 与布尔值一起使用,它们不会短路。
      【解决方案4】:

      因为 ||是短路的,无论操作数是否为静态,只要满足第一个真条件,该语句就会被评估为真。

      简而言之,如果第一个返回 true,则不会评估其他两个函数。

      【讨论】:

        【解决方案5】:

        简短的回答是,它会评估直到有足够的时间来断定它是否是 T/F。

        有一种叫做布尔短路的东西。本质上,它会尝试只评估它需要的东西(如果你使用 && 或 || 运算符)和离开。您可以通过以下几种方式利用这一点:

        (a() || b())
        
        1. 如果 b() 会抛出异常,如果 a() 为真,那么它甚至不会尝试检查 b()。一种链式检查机制。

        2. 如果后面的评估消耗资源,您可以将它们移到评估的末尾(例如,b() 需要 10 倍的时间)

        3. 如果最可能的路径可以由某个子句确定,则将它们放在首位。这也将加快执行速度。

        【讨论】:

          【解决方案6】:

          作为 Kotlin 用户的更新,您可以在 Kotlin 标准库中使用“或”运算符来检查 if 语句中的所有表达式,而不是执行短路。

          在第一个问题中提出的表达式中,Kotlin 中的代码应该是:

          if(isVeryLikely() or isSomewhatLikely() or isHardlyLikely()) {
              ...
          }
          

          【讨论】:

            【解决方案7】:

            问题中指定的布尔表达式是静态布尔值,还是返回布尔值的方法,在这两种情况下 - 表达式评估将从左侧开始,条件将逐个评估。第一个给出真值的条件将使评估短路。它将直接给出结果为真,其余条件不被评估。这就是 ||(OR) 在 Java 中使用短路求值概念的工作原理。

            如果您想了解更多关于一般短路的信息,可以参考我在我的博客上写的一篇文章 - http://www.javabrahman.com/programming-principles/short-circuiting-or-short-circuits-in-boolean-evaluations-in-programming-and-java/

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2019-01-07
              • 2014-05-01
              • 1970-01-01
              • 2011-02-01
              • 1970-01-01
              • 2012-11-22
              • 1970-01-01
              相关资源
              最近更新 更多