java中等式和条件运算符的优先级
我运行以下代码段
System.out.println(T1() ? F1() : T2() == T3() ? F2() : T4());
public static boolean T1() { System.out.println("true1"); return true; }
public static boolean T2() { System.out.println("true2"); return true; }
public static boolean T3() { System.out.println("true3"); return true; }
public static boolean T4() { System.out.println("true4"); return true; }
public static boolean F1() { System.out.println("false1"); return false; }
public static boolean F2() { System.out.println("false2"); return false; }
我得到输出
true1
false1
false
第一个三元运算符在计算相等运算符之前已计算,但根据oracle documentation,相等运算符的优先级高于三元运算符,因此必须在计算三元运算符之前计算相等运算符
这种代码行为的原因是什么
# 1 楼答案
从不计算
T2() == T3()
。您的代码等于:在这里,您可以清楚地看到为什么从来没有计算过它——因为
T1()
是真的,而且else
块从来没有被输入# 2 楼答案
JLS 15.25
对你来说:
T1()
的计算结果为true,返回true,因此接下来只计算F1()
# 3 楼答案
你似乎误解了优先权的含义。==具有比三元运算符更高的优先级,这并不意味着在一个表达式中,所有==子表达式都是先求值的。优先权只是在某些情况下省略括号的一种手段
例如,表达式
可以相当于
(a==b) ? c : d
或a == (b ? c : d)
。==具有更高的优先级意味着它实际上等同于第一个优先级在表达式中
没有歧义,它总是等同于
a ? b : (c == d)
。由于三元运算符是延迟求值的,如果a
保持不变,则c == d
永远不会求值