当我阅读一位同事的 Java 代码时,我偶然发现了一大堆 if/else 语句。在这些声明中,有几&&
and ||
运算符在没有任何括号帮助的情况下互相争斗。我将这些陈述简化为:
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
其次是&&
,它仅短路下一个元素,而不是整个语句。
这是我的问题:
我对吗?对我来说这似乎有点傻。是true
比...强大false
?
这只是因为
if (false && true || true)
相当于 (&&
具有较高的优先级 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)
if ((false && true) || true)
which is
if (false || true)
这是...true
.
注:表达式中true || true && false
, 那个部分true && false
被称为死代码因为它不影响最终的评估结果,因为true || anything
总是true
.
值得一提的是,存在&
and |
可以应用于布尔值的运算符,它们很像&&
and ||
除了它们不会短路,这意味着如果您有以下表达式:
if (someMethod() & anotherMethod())
and someMethod
回报false
, anotherMethod
还是会达到的!但是if
不会被执行,因为最终结果将被评估为false
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)