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

标签 java logical-operators short-circuiting

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

如果按照同样的逻辑,应该是错误的。第一个 boolean 值是 false,紧接着是 &&,但结果还是 true。这对我来说很有意义,但它似乎与我们之前的实验不相符。

所以这是我的理论:

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

这是我的问题:

我说的对吗?这对我来说似乎有点傻。 true 是否比 false 强?

最佳答案

只是因为

if (false && true || true)

相当于(&& 有一个更高的 precedence )

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

这是

if (false || true)

这是... true

注意:在表达式true || true && falsetrue && false 部分被称为死代码 因为它不影响评估的最终结果,因为 true ||任何东西 总是true


值得一提的是,&| 运算符可以应用于 boolean 值,它们很像 && >|| 除了它们不会短路,这意味着如果您有以下表达式:

if (someMethod() & anotherMethod())

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

关于Java逻辑运算符(&&、||)短路机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033035/

相关文章:

java - SQLite JDBC 包装器和 matchinfo()

具有 4 个变量的 PHP 逻辑运算符

ruby - Ruby 中的 "and"、 "or"运算符背后有什么智慧吗?

c# - C# 中的 OR 运算符

java - log4j 如何避免 "unknown source"消息

java - Elasticsearch (Java) 禁用日志记录

java - TreeMap 未按我的比较器排序

.net - "IsFalse"和 "IsTrue"基本上只是隐式转换为 bool 值吗?

recursion - 短路运算符和尾递归

perl - 短路并给出不正确的结果?