java - 为什么条件运算符出现意外行为

标签 java conditional-statements

我有一段代码如下

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,您会看到一条波浪线(此处为虚线)和警告,如“比较相同的表达式”。现在请注意波浪线的开头。

为什么不同?

最佳答案

因为三元运算符 (?:) 具有较低的 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的建议一致。

关于java - 为什么条件运算符出现意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8901121/

相关文章:

java - Java中执行表达式 "+++++ +",编译器没有报错,可以正确执行?

sql - 仅当第一个选择为空时才选择

c++ - 在条件语句前放置 "!"

SQL计数一列中的重复项,但重复项的条件不仅仅是一个固定值

java - 将 PNG 加载到 OpenGL 性能问题 - Java 和 JOGL 比 C# 和 Tao.OpenGL 慢得多

java - 响应监听器内部的字符串数组在监听器类外部提供空值

java - 为什么 HashMap 有自己的 hashCode() 内部实现,称为 hash()?

java - 通过 Socket 流发送对象的最有效方法是什么?

C++:仅在未设置时设置 bool 值

C "if"结构