为什么条件运算符的意外行为

时间:2012-01-17 20:15:24

标签: java conditional

我有一段代码如下

public class Test{
               public static void main(String[] args) {
                  System.out.println(true?false:true == true?false:true);
                                                -----------------------
               }
            }

输出为false。如果您正在使用Eclipse,那么您将获得一条波浪线(此处为虚线)和“比较相同表达式”之类的警告。注意波浪线的开始。

我将代码更改为以下

              public class Test{
               public static void main(String[] args) {
                  System.out.println((true?false:true) == (true?false:true));
                                     ---------------------------------------
               }
            }

输出为true。如果您正在使用Eclipse,那么您将获得一条波浪线(此处为虚线)和“比较相同表达式”之类的警告。请注意现在波浪线的开始。

为什么会有差异?

4 个答案:

答案 0 :(得分:3)

因为三元运算符(?:)比等于运算符(==)低priority。这意味着:

true?false:true == true?false:true

实际上解释为:

true?false:(true == true?false:true)

这反过来评估为:

true?false:((true == true)?false:true)

续:

true?false:(true?false:true)

......最终:

true?false:(false)

并最终:

true?false:false

显然,这解释了第一个代码段的输出。 Eclipse正确识别运算符优先级并突出显示可能不正确的语句。

更新:感谢所有评论。实际上我忘记了左侧的运算符优先级。我使用以下程序检查了确切的行为:

public static boolean a(char label, boolean result) {
    System.out.println(label);
    return result;
}

public static void main(String[] args) {
    System.out.println(
        a('a', true) ? a('b', false) : a('c', true) == a('d', true) ? a('e', false) : a('f', true)
    );
}

结果与 @Milad Naseri 建议一致。

答案 1 :(得分:2)

这里没有任何意外,答案是运营商优先。 在第一种情况下是:
true?false:(true == true?false:true)
而在第二种情况下,你的paretheses覆盖了优先规则。

答案 2 :(得分:1)

这是因为条件等式运算符(==)优先于三元条件?:。因此,a?b:x==y?z:t x==y?z:ta?b:xy?z:t之前进行评估。

答案 3 :(得分:1)

如果您的问题是结果的差异,这是因为您使用的运算符的优先顺序。有关详细信息,请查看here。按照优先顺序:

true ? false : true == true ? false : true

与此相同:

true ? false : ((true == true) ? false : true)

所以它总是会评估为 false 。你可以在冒号之后放任何东西,因为它从来没有被评估过(如果我没记错的话,三元运算符使用惰性评估);原因是

true ? A : B

始终评估为A.


另一方面,

(true ? false : true) == (true ? false : true)

将比较运算符的两侧==计算为false,所以

false == false

这是 true 语句。

因此,这里的差异是运算符的计算顺序,这是由您使用的括号确定的,如果存在未通过括号解析的歧义,则使用所使用的运算符的优先顺序


通常,三元运算符“?:”的工作原理如下

A ? B : C

如果A为真,则求值为B,否则求值为C. A必须是布尔表达式,B和C可以是您想要的任何值;如果要将评估值分配给变量并且它们的类型不同,则必须处理类型不匹配。