【问题标题】:Does it run both arguments when using OR operator? [duplicate]使用 OR 运算符时是否同时运行两个参数? [复制]
【发布时间】:2012-08-27 11:54:32
【问题描述】:

可能重复:
&& (AND) and || (OR) in Java IF statements

if(foo || bar) {

}

foo 为真时,它甚至会进入 bar 吗?

【问题讨论】:

  • 如果foo 为真,bar 将被忽略。这是短路评估。
  • 这样的问题没什么意义。为什么不只是try
  • @Karolis:因为尝试会向您展示您现在正在运行的 Java VM 的行为,而不一定是指定的行为。
  • @jarnbjo 但是,如果 JVM 的行为与 Java 语言规范中指定的不同,那么它的行为就会损坏。尤其是如果像这样的基本功能不起作用,它会非常非常糟糕。
  • @Jesper:问题是什么?如果指定了某些行为,那么它当然可以在任何 VM 中工作,前提是 VM 没有损坏。但是,如果您在一个 VM 上观察到某种行为,则无法得出相反的结论并假设该行为已被指定并且在所有其他 VM 上都是相同的。

标签: java if-statement operators


【解决方案1】:

不,|| 使用所谓的short-circuit evaluation,也称为最小计算,一旦找到计算结果为true 的表达式(从左起),它将停止计算条件向右)。

来自JLS

15.24。条件或运算符 ||

条件或运算符 ||运算符就像 | (§15.22.2),但是 仅当其左手的值 操作数为假。

&& 的操作方式类似:

15.23。条件与运算符 &&

条件与运算符 && 类似于 & (§15.22.2),但计算 仅当其左侧操作数的值为 真的。

【讨论】:

    【解决方案2】:

    &&|| 在知道结果后立即停止评估。比如:

    if (a == null || a.get() == null)
    

    效果很好,因为如果 a 为 null,则不会评估第二部分,并且您不会冒 NullPointerException 的风险。

    如果您希望两个表达式都被计算,您可以使用无条件的&|

    if (a == null | a.get() == null)
    

    将评估两个条件,无论第一个是否为真。

    This thread 提供了您可能希望发生这种情况的示例。

    【讨论】:

      【解决方案3】:

      ||&& 都是短路逻辑运算符。

      当两个表达式用 OR (||) 连接时,如果第一个为真,则答案始终为真。

      ||      true     false
      true    true     true
      false   true     false
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-21
        相关资源
        最近更新 更多