1

好的,所以我在 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

}

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

4

2 回答 2

3

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

if (true || someMethod()) { }

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

if (true | someMethod()) { }

在这种情况下, someMethod() 将被调用,即使它是 true 或 false 与整个布尔表达式的评估无关。有关 Java 中短路的更多信息,请参见此处:Java 逻辑运算符短路

于 2013-09-29T23:37:45.487 回答
0

这称为短路

一旦知道结果是什么,逻辑运算符将停止计算其操作数。

于 2013-09-29T23:38:20.843 回答