Java是否在知道布尔结果后评估剩余条件?

时间:2011-06-15 01:50:52

标签: java

也就是说,如果我有一个评估多个条件的陈述,比如说'或'这样的陈述。

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

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

7 个答案:

答案 0 :(得分:45)

||&&运营商正在短路。

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

答案 1 :(得分:11)

首先需要注意的是,Java条件语句只能采用布尔值,与其他语言(如C / C ++)不同,其中任何非零值都将计算为true。

话虽如此,有两种类型的运算符,第一种称为shor-circuit类型:

&& and ||

而另一种是非短路类型:

& and |

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

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

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

Java将:

  1. 首先检查isVeryLikely() 返回true。如果是真的,那么它会 不要再继续了。
  2. 如果isVeryLikely()返回false, 然后调用isSomewhatLikely()来 看看它是否返回true。如果是真的, 如果评估,别无其他。如果是假的, 转到3。
  3. isHardlyLikely()被调用。如果 是的,整个表达都是真的, 否则是假的,整个 表达是假的。
  4. 您要问的整个概念是“Java如何评估逻辑表达式”。好问题:)

    希望它有所帮助!干杯!

答案 2 :(得分:2)

不,java使用||&&对表达式进行短路评估。有关详细信息,请参阅here

答案 3 :(得分:2)

因为||在短路时,无论操作数是否为静态,语句一旦达到第一个真实条件就会被评估为真。

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

答案 4 :(得分:1)

简短的回答是,它会评估,直到有足够的结论是否是T / F.

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

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

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

  3. 如果最可能的路径可以由某个条款确定,请将它们放在第一位。这也会加快执行速度。

答案 5 :(得分:1)

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

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

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

答案 6 :(得分:0)

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

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