我有一段代码如下
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/