评估尊重括号和优先权 - java

ana*_*ema 3 java

根据Java语言规范:

评估尊重括号和优先顺序

除了使用数学运算之外:

int i = 3;
int j =  3 * (9 + 3);
System.out.println(j); //results to 36
Run Code Online (Sandbox Code Playgroud)

该规则是否适用于其他任何示例?我试过用

int i = 0;
int z = 0;
if(i++ < 5 || (++z <0 && 5 > z++) || 6 < ++i){
  System.out.println("Routed here");
}
System.out.println("i: " + i);
System.out.println("z: " + z);
Run Code Online (Sandbox Code Playgroud)

但结果是i:1和z:0.似乎对该示例的评估仍然是从左到右.

nIc*_*cOw 5

借助||,Java在评估表达式时使用了短路的概念.因此,在这:

if(i++ < 5 || (++z <0 && 5 > z++) || 6 < ++i){
Run Code Online (Sandbox Code Playgroud)

因为第一个表达式i++ < 5返回true,因此表达式的其余部分将不会被评估,即从未被访问过,因此只会在值中发生更改i而不会发生其他任何事情.

来自Java Docs的引用:

条件运算符&&和|| 运算符对两个布尔表达式执行条件AND和条件OR运算.这些运算符表现出"短路"行为,这意味着仅在需要时才评估第二个操作数.&& Conditional-AND || Conditional-OR以下程序ConditionalDemo1测试这些运算符:
class ConditionalDemo1 {

    public static void main(String[] args){
        int value1 = 1;
        int value2 = 2;
        if((value1 == 1) && (value2 == 2))
            System.out.println("value1 is 1 AND value2 is 2");
        if((value1 == 1) || (value2 == 1))
            System.out.println("value1 is 1 OR value2 is 1");
    }
}
Run Code Online (Sandbox Code Playgroud)