2011-06-15 29 views
23

也就是说,如果我有一个评估多个条件,比方说像这样一个“或”陈述的陈述..在布尔结果已知之后,Java是否评估其余条件?

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

在在运行时isVeryLikely()返回true,将isSomewhatLikely()isHardlyLikely()执行的情况?如果不是方法他们是静态布尔值呢?

回答

36

||&&运营商短路。

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

否,Java使用使用||&&表达式短路评价。有关更多信息,请参阅here

+2

并非所有“布尔表达式”;你可以使用'&'和'|'与布尔值,而不是短路。 – 2011-06-15 01:53:49

+0

@Chris - 好点。我编辑了我的答案。 – highlycaffeinated 2011-06-15 01:57:05

2

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

总之,没有其它两个功能将不被如果第一返回true评价。

10

,你需要注意的第一件事是Java条件语句只能采取布尔,不像在C/C++,其中任何非零值的值为true其他语言。

这就是说,有2种类型的运营商的,第一是被称为肖尔电路类型:

&& and || 

而另一个是所述非短路类型:

& and | 

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

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

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

Java将:

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

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

希望它有帮助!干杯!

0

简而言之,它会评估,直到有足够的结论是否是T/F。

有一种叫做布尔短路。从本质上讲,它只会尝试和评估它需要的东西(如果你使用的是& &或||运营商)和假期。你可以利用这个在几个方面:

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

  2. 如果是后者的评价是消耗资源,你可以将它们移动到评估结束(如B()花费的10倍)

  3. 如果最可能的路径可以通过一定的决定条款,把他们放在第一位。这也会加速执行。

0

无论在问题指定布尔表达式是静态的布尔值,或者它们是返回一个布尔值的方法,在这两种情况下 - 表达评价将来自左开始和条件将被评估一个接一个。给出真值的第一个条件会使评估短路。它将直接给出结果为真,其余条件未被评估。这就是||(OR)如何使用短路评估的概念在Java中工作的方式。

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