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

时间:2017-05-29 09:07:48

标签: java compiler-errors boolean runtime operator-precedence

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

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

true

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

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

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

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

然后它没有看到评估||右侧的必要性因为短路评估。但是||这些中的优先级最低!!有人可以解释这个表达式是如何逐步执行的,以及&amp;&amp;的优先级如何超过||。我会很感激。感谢您阅读,直到这里:)

4 个答案:

答案 0 :(得分:2)

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

  

条件或运算符||运算符就像| (§15.22.2),但仅在其左侧操作数的值为假时才计算其右侧操作数。

在你的情况下,左手操作数是true,所以很明显右手操作数根本没有被评估。

答案 1 :(得分:0)

您的代码是等同于

的短路
System.out.println(true);

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

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

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

答案 2 :(得分:0)

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

如果LHR计算为false,则仅计算OR运算符的右侧,否则结果变量将被指定为true。

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

答案 3 :(得分:0)

在这里java执行这个逻辑顺序。 执行true || 3&lt; 5/0然后结果与此&amp;&amp;假。

因为你使用||之前和第一个参数是真的它不检查其他条件。

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

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;
    }
}