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;的优先级如何超过||。我会很感激。感谢您阅读,直到这里:)
答案 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;
}
}