好的,所以我在java中遇到了一个奇怪的问题,我很确定这对大多数语言都很常见,但这是我第一次遇到这样的事情。假设你有两种方法。
private boolean foo(int param){ /*some arbitrary stuff*/ }
private boolean bar(int param){ /*some arbitrary stuff*/ }
这些方法中的每一种都需要参数,并根据参数的内容,根据事件是否发生,返回true
或false
。现在我要把它们投入使用。
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
}
这解决了我的问题。我的问题是,是否有人知道为什么会发生这种情况,或者是否有其他做法可以确保在需要时评估条件的全部内容?
答案 0 :(得分:3)
你的问题是短路。一旦找到一个真值,使用||
会导致操作短路。您可以使用|
来评估两个表达式,即使第一个表达式为真。在评估为false时,&&
和&
也是如此。
if (true || someMethod()) { }
在上面的这个陈述中,永远不会调用someMethod(),因为true
会使结果短路。
if (true | someMethod()) { }
在这里,someMethod()将被调用,即使它是true或false与整个布尔表达式的评估无关。有关Java中的短路的更多信息,请参见此处:Java logical operator short-circuiting
答案 1 :(得分:0)
这称为短路。
逻辑运算符一旦知道结果将会停止评估它们的操作数。