【问题标题】:Are all booleans in a OR conditional evaluated in Java?是否在 Java 中评估了 OR 条件中的所有布尔值?
【发布时间】:2013-09-29 23:37:16
【问题描述】:

好的,所以我在 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,则执行其他操作。

它看起来很好,它编译了,但是当我运行代码时,事情变得很时髦。每当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 行代码。这是一个非常有启发性的发现。

标签: java conditional-operator


【解决方案1】:

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

if (true || someMethod()) { }

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

if (true | someMethod()) { }

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

【讨论】:

  • 出色的答案,感谢您提供的所有额外信息!我不敢相信这是我第一次遇到这种情况。当我被允许时,我会接受这个答案。
  • @rosscowar 很高兴我能帮上忙。
【解决方案2】:

这称为短路

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

【讨论】:

    猜你喜欢
    • 2011-09-15
    • 1970-01-01
    • 2019-01-07
    • 2018-02-18
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    相关资源
    最近更新 更多