Skip to content

(七十五)关于java && 和 || 优先级的探讨

happyjiatai edited this page Jan 12, 2019 · 2 revisions

1. 网上搜索结果

​​

从搜索结果来看&&的优先级比||高,所以默认下面代码

    System.out.println(false && true || true);    //true 因为 &&比||优先
    System.out.println(true || true && false);    //true 因为 &&比||优先

等效于

    System.out.println((false && true) || true);
    System.out.println(true || (true && false));

返回结果都是true

但这个不直观,不知道到底判断顺序是不是这样

2.测试

2.1 测试||短路

写个demo:

private static void testBoolean(){
    int i = 0;
    int j = 0;
    int k = 0;
    boolean flag = (++i > 0) || (++j > 0) && (++k > 0);
    System.out.println(i + "--" + j + "---" + k);
}

结果:

flag为true

1--0---0

推断:

    boolean flag = (++i > 0) || (++j > 0) && (++k > 0);

等效于

    boolean flag = (++i > 0) || ((++j > 0) && (++k > 0));

&&优先级虽然比||高,但仍然会被||短路掉,只判断了++i >0,后面被||短路了。

第二个demo

private static void testBoolean2(){
    int i = 0;
    int j = 0;
    int k = 0;
    boolean flag = (++i > 0) && (++j > 0) || (++k > 0);
    System.out.println(i + "--" + j + "---" + k);
}

结果:

flag为true

1--1---0

(k被短路掉了)

2.2 测试&&短路

private static void testBoolean3(){
    int i = 0;
    int j = 0;
    int k = 0;
    boolean flag = (++i < 0) && (++j > 0) || (++k > 0);
    System.out.println(i + "--" + j + "---" + k);
}

结果:

flag为true

1--0---1

(j被&&短路掉了)

3. 总结

虽然&& 优先级比 || 高,但还是受|| 短路影响,&&优先级高不代表其比||先做运算,仍有可能受||短路影响。

PS:既然看代码都要手动/心里加括号,那手动写的时候先加上多好。。。可读性能高上不少,考试不谈。。。