我运行以下代码段
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,等式运算符的优先级高于三元运算符,因此必须在之前对等式运算符求值。三元一。
这种代码行为的原因是什么?
答案 0 :(得分:7)
条件运算符在语法上是右关联的(它从右到左分组)。因此,a?b:c?d:e?f:g表示与a b相同:(c?d:(e?f:g))。
在你的情况下:
T1() ? F1() : (T2() == T3() ? F2() : T4())
a b c d e
T1()
的计算结果为true,返回true,因此接下来仅评估F1()
。
答案 1 :(得分:1)
您似乎误解了优先级意味着什么。 ==具有比三元运算符更高优先级的事实并不意味着在表达式中首先评估所有==子表达式。优先权仅仅是在某些情况下省略括号的一种方式。
例如,表达式
a == b ? c : d
可以等同于(a==b) ? c : d
或a == (b ? c : d)
。 ==具有更高优先级的事实意味着它实际上等同于第一个。
在表达式
中a ? b : c == d
没有歧义,它总是等同于a ? b : (c == d)
。由于三元运算符被延迟评估,如果a
成立,则永远不会评估c == d
。
答案 2 :(得分:0)
永远不会评估T2() == T3()
。您的代码等于:
if(T1()) {
System.out.println(F1());
}
else {
if(T2() == T3()) {
System.out.println(F2());
}
else {
System.out.println(T4());
}
}
在这里,您清楚地了解为什么永远不会对其进行评估 - 因为T1()
为真且永远不会输入else
块。