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
后跟 &&
,它只会短路下一个元素,而不是整个语句。
这是我的问题:
我说得对吗?这对我来说似乎有点傻。 true
比false
强吗?
只是因为
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())
和someMethod
returnsfalse
、anotherMethod
还是会达成!但是 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.
并且 &&
的优先级高于 ||
。
根据 Java tutorials &&
的优先级高于 ||
因此您的 true || true && false
将被评估为 true || (true && false)
而您的 false && true || true
将被评估为 (false && true) || true
在这两种情况下都会产生 true
的输出。
我明白你想做什么,但在对括号进行操作之前,最好先准备好语言规范。我认识一些程序员,他们甚至把重要的部分(比如运算符优先级)挂在墙上。
第二部分是了解您的更改是否对您工作场所的其他人有意义;如果删除括号会损害操作对处理代码的其他人的意义,那么它最终可能是有害的。
优化器通常会为您处理,所以如有疑问,请将它们留在那里。
当我阅读一位同事的 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
后跟 &&
,它只会短路下一个元素,而不是整个语句。
这是我的问题:
我说得对吗?这对我来说似乎有点傻。 true
比false
强吗?
只是因为
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())
和someMethod
returnsfalse
、anotherMethod
还是会达成!但是 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.
并且 &&
的优先级高于 ||
。
根据 Java tutorials &&
的优先级高于 ||
因此您的 true || true && false
将被评估为 true || (true && false)
而您的 false && true || true
将被评估为 (false && true) || true
在这两种情况下都会产生 true
的输出。
我明白你想做什么,但在对括号进行操作之前,最好先准备好语言规范。我认识一些程序员,他们甚至把重要的部分(比如运算符优先级)挂在墙上。
第二部分是了解您的更改是否对您工作场所的其他人有意义;如果删除括号会损害操作对处理代码的其他人的意义,那么它最终可能是有害的。
优化器通常会为您处理,所以如有疑问,请将它们留在那里。