使用AND和OR进行表达式评估的Java顺序

kor*_*doo 1 java expression operators

    boolean a = false;
    boolean b = false;
    boolean c = false;
    boolean bool = (a = true) || (b = true) && (c = true);
    System.out.println("" + a + b + c);
Run Code Online (Sandbox Code Playgroud)

prceding代码打印truefalsefalse.但是,&&操作员的优先级高于||操作员,应首先进行评估,为什么不打印truetruetrue呢?

Jon*_*eet 8

相信你问题的症结在于这一部分:

但是,&&运算符的优先级高于|| 操作员,应首先评估

不会.优先顺序不会影响执行顺序.这是有效的包围.所以你的表达相当于:

boolean bool = (a = true) || ((b = true) && (c = true));
Run Code Online (Sandbox Code Playgroud)

...仍然a = true首先执行.此时,由于结果肯定是true并且||正在短路,因此右手操作数||不会被执行,因此b并且c是错误的.

JLS第15.7.1节:

在评估右侧操作数的任何部分之前,似乎完全评估了二元运算符的左侧操作数.

优先权与此无关.