[英]Why does this not short circuit?
public static void main(String args[]){
String s = null;
if(false && false || s.equalsIgnoreCase("x")) { //throws an exception
System.out.println("true");
} else {
System.out.println("false");
}
}
我原以为这会遇到短路故障,但事实并非如此。 这是为什么? 我假设如果您有错误,则无需继续下一个&&。 请帮助我理解。
因为这:
a && b || c
等效于此:
(a && b) || c
||
的lhs 为假,因此对c
求值。
&&
运算符的优先级高于||
操作员 。 因此,条件等于
if( (false && false) || s.equalsIgnoreCase("x")) { //throws an exception
然后评估离开:
if(false || s.equalsIgnoreCase("x")) { //throws an exception
这不会短路。 要使其短路,请使用括号:
if(false && (false || s.equalsIgnoreCase("x"))) { // fine
和具有较高的优先级,因此将其括起来
((false && false) || s.equalsIgnoreCase("x"))
(false && false)
减少为false
,不会因||
短路 。
值得记住的是, &
有点像*
( 1 & 1 = 1
和0 * 1 = 1
),而+
有点像|
因此&
具有更高的优先级。 在数学中,有时+
用作or,而&
和*
。 逻辑运算的优先级与二进制运算的优先级相同,因此&&
优先级高于||
。
为什么要短路? || 仅当LH操作数为true时才短路。 如果LH操作数为false,则&&短路。 在这里,您有一个短路&&和一个非短路||。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.