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");
}
}
我期待这次遇到错误的短路,但事实并非如此。 这是为什么?我假设你有一个假,没有必要继续下一个&&amp ;. 请帮我理解。
答案 0 :(得分:2)
因为:
a && b || c
相当于:
(a && b) || c
||
的lhs为false,因此c
会被评估。
答案 1 :(得分:2)
&&
operator has higher precedence than the ||
operator。所以,条件相当于
if( (false && false) || s.equalsIgnoreCase("x")) { //throws an exception
然后评估离开:
if(false || s.equalsIgnoreCase("x")) { //throws an exception
不会短路。要使其短路,请使用括号:
if(false && (false || s.equalsIgnoreCase("x"))) { // fine
答案 2 :(得分:1)
并且具有更高的优先级,因此它被置于括号内,如
((false && false) || s.equalsIgnoreCase("x"))
(false && false)
缩小为false
,||
不会短路。
值得记住的是,&
有点像*
(1 & 1 = 1
和0 * 1 = 1
)而+
有点像|
因此&
具有更高的优先级。在数学中,+
和&
有时使用*
作为或不使用&&
。逻辑运算具有与二进制运算相同的优先级,因此||
具有高于{{1}}的优先级。
答案 3 :(得分:0)
为什么要短路? ||如果LH操作数为真,则仅短路。 &安培;&安培;如果LH操作数为假,则短路。在这里你有一个短路&&和非短路的||。