在布尔结果已知之后,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将:

  1. 首先检查isVeryLikely()是否返回true。 如果属实,那么它将不会继续下去。
  2. 如果isVeryLikely()返回false,则调用isSomewhatLikely()来查看它是否返回true。 如果是真的,没有别的,如果评估。 如果是假的,转到3。
  3. isHardlyLikely()被调用。 如果为true,则整个expression式为true,否则为false,整个expression式为false。

你所问的整个概念是“Java如何评估逻辑expression式”。 好问题 :)

希望它有帮助! 干杯!

不,java使用||对expression式进行短路评估 和&& 。 在这里看到更多的信息。

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

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

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

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

 (a() || b()) 
  1. 如果b()会抛出一个exception,如果a()是真的,那么它甚至不会尝试和检查b()。 一种链式检查机制。

  2. 如果后面的评估是耗费资源的,那么可以将它们移动到评估的最后(例如,b()需要花费10倍的时间)

  3. 如果最可能的path可以由一个特定的条款来确定,那么把它们放在第一位。 这也会加速执行。

无论是在问题中指定的布尔expression式都是静态布尔值,还是返回布尔值的方法 – 在这两种情况下,expression式评估将从左侧开始,条件将逐个评估。 给出真值的第一个条件会使评估短路。 它将直接给出结果是正确的,剩下的条件没有被评估。 这是||(OR)如何在Java中使用短路评估的概念。

如果你想了解更多关于短路的信息,你可以参考一下我在博客上写的文章 – http://www.javabrahman.com/programming-principles/short-circuiting-or-short-circuits-in-布尔评估,在编程和Java的/