Java逻辑运算符(&&,||)短路机制

Java logical operator (&&, ||) short-circuit mechanism

当我阅读一位同事的 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强吗?

只是因为

if (false && true || true)

相当于(&&有更高的precedence

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

这是

if (false || true)

这是...true.

注意:在表达式true || true && false中,true && false部分被称为死代码,因为它不影响计算的最终结果, 因为 true || anything 总是 true.


值得一提的是,存在可应用于布尔值的 &| 运算符,它们与 &&|| 非常相似,只是它们不't short circuit,意思是如果你有下面的表达式:

if (someMethod() & anotherMethod())

someMethodreturnsfalseanotherMethod还是会达成!但是 if 不会被执行,因为最终结果将被评估为 false

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

由于 &&|| 上的优先级,(true || true && false) 将被评估为 (true || (true && false)) -> (true || (false)) -> true

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

对于 &&:

false && ... => false

对于 ||:

true || ... => true.

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

查看更多:Operator Precedence in Java

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

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

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

在这两种情况下都会产生 true 的输出。

我明白你想做什么,但在对括号进行操作之前,最好先准备好语言规范。我认识一些程序员,他们甚至把重要的部分(比如运算符优先级)挂在墙上。

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

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