【问题标题】:Java logical operator (&&, ||) short-circuit mechanismJava逻辑运算符(&&、||)短路机制
【发布时间】:2015-07-14 00:14:46
【问题描述】:

在阅读同事的 Java 代码时,我偶然发现了一大堆 if/else 语句。在这些声明中,几个&&|| 操作员在没有括号帮助的情况下互相争斗。我将语句简化为:

if (true || true && false)
  return true;
else
  return false;

你认为结果会是什么?老实说,我以为是false,但似乎短路不像我预期的那样工作。在这种情况下,结果是true。短路机制似乎将整个表达式视为true,当它找到true 后紧跟||

但是逆向表达,结​​果是什么?

if (false && true || true)
  return true;
else
  return false;

如果我们遵循相同的逻辑,它应该是错误的。第一个布尔值是false,紧随其后的是&&,但结果又是true。这对我来说是有道理的,但它似乎与我们之前的实验不兼容。

这是我的理论:

如果我们找到true 后跟||,那么它就是true,不管接下来会发生什么,即使后面还有一长串其他逻辑运算符。但是如果我们找到false 后跟&&,它只会短路下一个元素,而不是整个语句。

这是我的问题:

我说的对吗?这对我来说似乎有点傻。 truefalse 强吗?

【问题讨论】:

  • docs.oracle.com/javase/tutorial/java/nutsandbolts/… && 的优先级高于||,如现有答案中所述(只是想提供链接)
  • 在这种情况下无论如何你应该让你的同事写括号,以避免有人在这段代码中添加新条件时可能发生的错误!
  • 短循环将永远改变布尔表达式的结果。短循环唯一要做的就是避免执行表达式的其余部分。
  • @Jägermeister,公平地说,如果他们问是否代码应该这样写,这个问题可能会因为主要基于意见而被关闭
  • 不是短路,而是运算符优先级

标签: java logical-operators short-circuiting


【解决方案1】:

只是因为

if (false && true || true)

相当于(&& 有更高的precedence

if ((false && true) || true)

这是

if (false || true)

这是...true

注意:在表达式true || true && false 中,true && false 部分被称为死码,因为它不影响评估的最终结果,因为true || anything 始终是@987654331 @。


值得一提的是,存在&| 运算符可以应用于布尔值,它们很像&&||,只是它们不会短路,这意味着如果你有以下表达式:

if (someMethod() & anotherMethod())

并且someMethod 返回falseanotherMethod 仍然可以到达!但是if 不会被执行,因为最终结果将被评估为false

【讨论】:

  • 好的,所以它的工作方式类似于“1 + 1 * 2 = 3”。我不知道这样的事情(优先级),存在于 && 和 ||运营商。非常感谢:)
  • @JasonBerger false && true || true0 * 1 + 1 非常相似,详见Boolean Algebra
  • if (someMethod() & anotherMethod()) - 不要鼓励编写这样的代码。那应该分成多行。
  • 如果你真的想要这两个方法都被执行(也许是因为它们有副作用),它们不应该在 if 中。这真是令人难以置信的混乱。
  • 我愿意承认它可能有用(尽管我必须亲眼看到它才能相信它),但是“它可以被使用”是一个非常弱的论点,除非你认为Java是一门完美的语言。我个人认为这些运算符的存在是 Java 中的一个缺陷。
【解决方案2】:

&& 的操作优先级高于||,因此它获胜。

【讨论】:

    【解决方案3】:

    由于&& 优先于||(true || true && false) 这将被评估为(true || (true && false)) -> (true || (false)) -> true

    查看优先规则:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

    【讨论】:

      【解决方案4】:

      对于&&

      假 && ... => 假

      对于||

      真|| ... => 是的。

      并且&& 的优先级高于||

      查看更多:Operator Precedence in Java

      【讨论】:

        【解决方案5】:

        根据Java tutorials&&的优先级高于||

        因此您的true || true && false 将被评估为true || (true && false)

        您的false && true || true 将被评估为(false && true) || true

        在这两种情况下都会输出true

        【讨论】:

          【解决方案6】:

          我明白你在做什么,但在操作括号之前,最好先把语言规范放在手边。我认识一些程序员,他们甚至在墙上保留了重要的部分,比如运算符优先级。

          第二部分是了解你的改变是否会对你工作场所的其他人产生任何影响;如果删除括号会损害操作对其他处理代码的人的意义,那么它最终可能是有害的。

          优化器通常会为您处理好它,因此如果有疑问,请将它们留在那里。

          【讨论】:

            猜你喜欢
            • 2012-02-04
            • 2013-06-02
            • 1970-01-01
            • 1970-01-01
            • 2019-05-07
            相关资源
            最近更新 更多