当我阅读一位同事的 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 && false
,true && false
部分被称为死代码 因为它不影响评估的最终结果,因为 true ||任何东西
总是true
。
值得一提的是,&
和 |
运算符可以应用于 boolean 值,它们很像 &&
和 >||
除了它们不会短路,这意味着如果您有以下表达式:
if (someMethod() & anotherMethod())
和someMethod
返回false
,anotherMethod
仍然会到达!但是 if
不会被执行,因为最终结果将被评估为 false
。
关于Java逻辑运算符(&&、||)短路机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30033035/