【问题标题】:short circuit operators give me different result [duplicate]短路运算符给我不同的结果[重复]
【发布时间】:2014-05-04 20:52:17
【问题描述】:

在使用短路运算符 &&|| 时,我得到了意想不到的结果。

    if(false && false || true) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }

它给了我true,但根据短路规则,如果第一个操作数是false,那么就没有必要评估第二个操作数。谁能解释一下我遗漏了什么。

【问题讨论】:

  • 如果你写if(false && (false || true))是对的
  • 但是为什么我得到了意想不到的结果。请帮助
  • @Qadir 你真的看过ZouZou的评论吗?
  • 如果以下答案之一有帮助,最好将其中一个标记为正确,以便未来的读者也可以受益:)

标签: java


【解决方案1】:
(false && false) || true

首先被评估。短路给出false,因此|| 不能短路,因此被完全评估,

【讨论】:

    【解决方案2】:

    我的解释是,由于&& 运算符的优先级高于||(根据this table),因此该语句被解释为(false && false) || true

    然后计算结果为false || true,当然是true。我可能是错的,但这似乎是正在发生的事情。

    【讨论】:

      【解决方案3】:

      您没有正确阅读短路规则。

      您所说的规则仅适用于 AND (&&) 操作。显然,第一次操作的结果是错误的。现在您需要执行第二个操作 OR (||)。 OR 的规则正好相反,如果第一个操作数为 TRUE,则不需要计算第二个操作数。在你的情况下,第一个操作数是假的,所以 || 的第二个操作数需要评估。第二个操作数的结果为真。所以整个表达式的结果为真。

      【讨论】:

        【解决方案4】:

        我认为从 JDK 7 开始,短路规则已被重新定义,因为当我尝试在 JDK 6 中运行时,它给了我正确的答案,但是当我在 JDK 7 中运行它时,它给了我意想不到的结果。

        【讨论】:

        • 我对 Java 6 和 7 很满意。
        • 短路规则不能以表达式给出不同结果的方式重新定义。它们只是优化的捷径。您必须注意它们的原因是您在表达式中使用的方法是否有副作用,这是一种非常糟糕的编码风格。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        相关资源
        最近更新 更多