我有一段代码如下
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,那么您将获得一条波浪线(此处为虚线)和“比较相同表达式”之类的警告。请注意现在波浪线的开始。
为什么会有差异?
答案 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:t
在a?b:x
和y?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可以是您想要的任何值;如果要将评估值分配给变量并且它们的类型不同,则必须处理类型不匹配。