与运算符优先级相关的混淆

Confusion related to operator precedence

public class A{
    public static void main(){
        boolean result = true || 3 < 5/0 && false;
        System.out.println(result);
    }
}

我编译了这个程序。它按预期完美编译。但是当我运行这个程序时,它给出了一个输出-

true

好吧,这件事让我很困扰,因为除法 (/) 运算符显然具有最高优先级。然后是小于 (<) 运算符,然后是 AND(&&) 运算符,然后是 OR(||) 运算符。所以根据我的说法,应该遵循的第一步如下 -

true || 3 < (5/0) && false

此时它本身应该引发异常。但这不会发生。好吧,我认为计算机对这个表达式的评估如下 -

(true) || 3 < 5/0 && false

然后它没有看到需要评估 || 的右侧因为短路评估。但是 ||其中优先级最低!!谁能解释一下这个表达式是如何一步步执行的,以及 && 的优先级是如何高于 || 的。我会很感激。感谢阅读到这里:)

你的代码相当于短路

System.out.println(true);

因为如果您不对条件进行分组,那么它将自动分组为

 boolean result = true || ((3 < (5 / 0)) && false);

使条件的右侧实际上是死代码......甚至没有评估(这就是为什么你不事件得到 ArithmeticException 当 div 为零时)

来自https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.24

The conditional-or operator || operator is like | (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is false.

在你的例子中,左边的操作数是 true,所以显然右边的操作数根本没有计算。

true || ((3 < (5 / 0)) && false);

OR 运算符的右侧仅在 LHR 计算为 false 时才会计算,否则结果变量将被分配为 true。

所以在你的情况下 3 < 5/0 && false 永远不会被计算。

在这里java按顺序执行这个逻辑。 执行真|| 3 < 5/0 然后结果为 && false。

既然你用了|| before 和第一个参数是 true 它不检查其他条件。

您可以通过如下修改代码进行测试。

public class A{
    public static void main(){
        boolean result = true || toOperaion() && false;
        System.out.println(result);
    }

    private static boolean toOperaion() {
        System.out.println("In Operation");
        return 3 < 5 / 0;
    }
}