【发布时间】:2013-09-29 23:37:16
【问题描述】:
好的,所以我在 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,则执行其他操作。
它看起来很好,它编译了,但是当我运行代码时,事情变得很时髦。每当foo() 返回true 时,就好像bar() 没有运行。所以意识到我重写了我的代码的逻辑可能性。
boolean a = foo(21);
boolean b = bar(321);
if(a || b){
//do some other stuff
}
这解决了我的问题。我的问题是,有谁知道为什么会发生这种情况,或者是否有其他做法可以确保在需要时评估整个条件?
【问题讨论】:
-
这是一个很好的例子,说明了为什么避免表达式中的副作用是好的:) 请注意,您可以使用
bool | bool,它不会短路。但见上文。 -
拥有像
||这样的运算符很重要的原因是你可以写像if (index >= myArray.length || myArray[index] == 0)这样的东西。如果总是计算右边部分,即使索引太大,你也不能这样做——它会得到一个越界异常,即使我们已经从左边部分知道整个表达式将是true。 (我以前用 Pascal 编程,它没有短路,解决起来真的很痛苦。)它不仅仅是数组索引。有很多种用途。 -
@ajb 是的,在现在了解这一点后,我已经从我的一门课程中删减了大约 16 行代码。这是一个非常有启发性的发现。