有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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,相等运算符的优先级高于三元运算符,因此必须在计算三元运算符之前计算相等运算符

这种代码行为的原因是什么


共 (3) 个答案

  1. # 1 楼答案

    从不计算T2() == T3()。您的代码等于:

    if(T1()) {
      System.out.println(F1());
    }
    else {
      if(T2() == T3()) {
        System.out.println(F2());
      }
      else {
        System.out.println(T4());
      }
    }
    

    在这里,您可以清楚地看到为什么从来没有计算过它——因为T1()是真的,而且else块从来没有被输入

  2. # 2 楼答案

    JLS 15.25

    The conditional operator is syntactically right-associative (it groups right-to-left). Thus, a?b:c?d:e?f:g means the same as a?b:(c?d:(e?f:g)).

    对你来说:

    T1() ? F1() : (T2() == T3() ? F2() : T4())
      a     b            c         d       e
    

    T1()的计算结果为true,返回true,因此接下来只计算F1()

  3. # 3 楼答案

    你似乎误解了优先权的含义。==具有比三元运算符更高的优先级,这并不意味着在一个表达式中,所有==子表达式都是先求值的。优先权只是在某些情况下省略括号的一种手段

    例如,表达式

    a == b ? c : d
    

    可以相当于(a==b) ? c : da == (b ? c : d)。==具有更高的优先级意味着它实际上等同于第一个优先级

    在表达式中

    a ? b : c == d
    

    没有歧义,它总是等同于a ? b : (c == d)。由于三元运算符是延迟求值的,如果a保持不变,则c == d永远不会求值