繁体   English   中英

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

[英]Priority of equality and conditional operators in 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文档 ,等式运算符的优先级高于三元运算符,因此必须在三元运算符之前对等式运算符求值。

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

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

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

你似乎误解了优先级意味着什么。 ==具有比三元运算符更高优先级的事实并不意味着在表达式中首先评估所有==子表达式。 在某些情况下,优先级仅仅是省略括号的一种方法。

例如,表达式

a == b ? c : d

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

在表达中

a ? b : c == d

没有歧义,它总是相当于a ? b : (c == d) a ? b : (c == d) 由于三元运算符被懒惰地评估,如果a持有, c == d从未评估。

永远不会评估T2() == T3() 您的代码等于:

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

在这里你清楚地看到为什么它永远不会被评估 - 因为T1()为真,而且从不输入else块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM