是否在Java条件下对所有布尔值进行了评估?

时间:2013-09-29 23:37:16

标签: java conditional-operator

好的,所以我在java中遇到了一个奇怪的问题,我很确定这对大多数语言都很常见,但这是我第一次遇到这样的事情。假设你有两种方法。

private boolean foo(int param){ /*some arbitrary stuff*/ }
private boolean bar(int param){ /*some arbitrary stuff*/ }

这些方法中的每一种都需要参数,并根据参数的内容,根据事件是否发生,返回truefalse。现在我要把它们投入使用。

if(foo(21) || bar(321)){

    //do some other stuff

}

这里的想法是运行foo()bar(),如果其中任何一个返回true,请执行其他操作。

它看起来很好,它编译,但当我运行代码的东西很时髦。当bar()返回foo()时,几乎就好像true没有运行。因此,我意识到我重写了代码的逻辑可能性。

boolean a = foo(21);
boolean b = bar(321);

if(a || b){

    //do some other stuff

}

这解决了我的问题。我的问题是,是否有人知道为什么会发生这种情况,或者是否有其他做法可以确保在需要时评估条件的全部内容?

2 个答案:

答案 0 :(得分:3)

你的问题是短路。一旦找到一个真值,使用||会导致操作短路。您可以使用|来评估两个表达式,即使第一个表达式为真。在评估为false时,&&&也是如此。

if (true || someMethod()) { }

在上面的这个陈述中,永远不会调用someMethod(),因为true会使结果短路。

if (true | someMethod()) { }

在这里,someMethod()将被调用,即使它是true或false与整个布尔表达式的评估无关。有关Java中的短路的更多信息,请参见此处:Java logical operator short-circuiting

答案 1 :(得分:0)

这称为短路

逻辑运算符一旦知道结果将会停止评估它们的操作数。