为什么这不短路?

时间:2014-01-17 00:44:24

标签: java

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 ;. 请帮我理解。

4 个答案:

答案 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 = 10 * 1 = 1)而+有点像|因此&具有更高的优先级。在数学中,+&有时使用*作为或不使用&&。逻辑运算具有与二进制运算相同的优先级,因此||具有高于{{1}}的优先级。

答案 3 :(得分:0)

为什么要短路? ||如果LH操作数为真,则仅短路。 &安培;&安培;如果LH操作数为假,则短路。在这里你有一个短路&&和非短路的||。