在布尔结果已知之后,Java是否评估剩余条件?
也就是说,如果我有一个评估多个条件的语句,比如说这样的一个“或”语句。
if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely()) { ... }
在isVeryLikely()
在运行时返回true的情况下,会执行isSomewhatLikely()
和isHardlyLikely()
吗? 如果不是静态布尔值的方法呢?
||
和&&
运营商是短路。
true || willNeverExecute(); false && willNeverExecute();
首先需要注意的是,Java条件语句只能使用布尔值,而不像C / C ++这样的其他语言,其中任何非零值都将计算为true。
这就是说,有两种types的运营商,第一种被称为shor电路types:
&& and ||
而另一种是非短路types:
& and |
对于短路types,一旦可以find逻辑输出作为expression式的答案,则其他语句将被转储。 对于非短路types,他们将继续评估所有条件。
考虑到这一点,你有什么:
if(isVeryLikely() || isSomewhatLikely() || isHardlyLikely()) { ... }
Java将:
- 首先检查isVeryLikely()是否返回true。 如果属实,那么它将不会继续下去。
- 如果isVeryLikely()返回false,则调用isSomewhatLikely()来查看它是否返回true。 如果是真的,没有别的,如果评估。 如果是假的,转到3。
- isHardlyLikely()被调用。 如果为true,则整个expression式为true,否则为false,整个expression式为false。
你所问的整个概念是“Java如何评估逻辑expression式”。 好问题 :)
希望它有帮助! 干杯!
不,java使用||
对expression式进行短路评估 和&&
。 在这里看到更多的信息。
因为|| 是短路,无论操作数是否为静态,只要语句达到第一个真实条件,该语句就会被评估为真。
总之,如果第一个返回true,则不会评估其他两个函数。
简单的回答是,它会评估,直到有足够的结论是否是T / F。
有一种叫布尔短路的东西。 从本质上讲,它只会尝试和评估它需要的东西(如果你使用&&或||运算符)和假期。 您可以通过几种方式利用这一点:
(a() || b())
-
如果b()会抛出一个exception,如果a()是真的,那么它甚至不会尝试和检查b()。 一种链式检查机制。
-
如果后面的评估是耗费资源的,那么可以将它们移动到评估的最后(例如,b()需要花费10倍的时间)
-
如果最可能的path可以由一个特定的条款来确定,那么把它们放在第一位。 这也会加速执行。
无论是在问题中指定的布尔expression式都是静态布尔值,还是返回布尔值的方法 – 在这两种情况下,expression式评估将从左侧开始,条件将逐个评估。 给出真值的第一个条件会使评估短路。 它将直接给出结果是正确的,剩下的条件没有被评估。 这是||(OR)如何在Java中使用短路评估的概念。
如果你想了解更多关于短路的信息,你可以参考一下我在博客上写的文章 – http://www.javabrahman.com/programming-principles/short-circuiting-or-short-circuits-in-布尔评估,在编程和Java的/