java中的相等和条件运算符的优先级

a3d*_*fcv 2 java operators

我运行以下代码片段

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; }
Run Code Online (Sandbox Code Playgroud)

我得到了输出

true1
false1
false
Run Code Online (Sandbox Code Playgroud)

评估等式运算符之前,已对第一个三元运算符进行了求值,但根据oracle文档,等式运算符的优先级高于三元运算符,因此必须在三元运算符之前对等式运算符求值.

这样的代码行为的原因是什么?

Era*_*ran 7

JLS 15.25

条件运算符在语法上是右关联的(它从右到左分组).因此,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
Run Code Online (Sandbox Code Playgroud)

T1()被评估为true,返回true,因此仅F1()接下来评估.