运算符优先级相关的困惑

3
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

然后因为短路评估,它不再需要评估 || 的右侧。但是 || 在这些运算符中优先级最低!!有人能解释一下这个表达式是如何逐步执行的,以及为什么 && 的优先级高于 || 吗?非常感谢您的阅读 :)


&& has a higher priority than ||: (true || ((3 < 5/0) && false)) - Dmitry Bychenko
4个回答

2

0
你的代码是一个等效于短路的表达式。
System.out.println(true);

因为如果您不分组条件,那么它会自动分组为

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

将条件语句的右侧设置为死代码...甚至不进行计算(这就是为什么在除以零时你甚至不会得到ArithmeticException异常)


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

OR 运算符的右侧只有在左侧计算结果为 false 时才会被计算,否则结果变量将被赋值为 true。

因此,在您的情况下,3 < 5/0 && false 永远不会被计算。


0

Java 在这里是按顺序执行逻辑的。

执行 true || 3 < 5/0,结果是这个 && false。

由于你在第一个参数前使用了 ||,而且该参数为 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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接