Java 为什么条件运算符会出现意外行为
我有一段代码如下Java 为什么条件运算符会出现意外行为,java,conditional,Java,Conditional,我有一段代码如下 public class Test{ public static void main(String[] args) { System.out.println(true?false:true == true?false:true); ----------------------- }
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,则会得到一条波浪线(此处为虚线)和类似“比较相同表达式”的警告。现在请注意波浪线的起点
为什么会有差异?这是因为条件相等运算符(
==
)优先于三元条件运算符?:
。因此,在a?b:x==y?z:t
中,在a?b:x
和y?z:t
之前先计算x==y?z:t
。这是因为条件等式运算符(=
)优先于三元条件?:
。因此,在a?b:x==y?z:t
中,在a?b:x
和y?z:t
之前先计算x==y?z:t
。因为三元运算符(?:
)比相等运算符(=/code>)低。这意味着:
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
最终:
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的建议一致。因为三元运算符(?:
)比相等运算符(==
)低。这意味着:
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
最终:
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的建议一致。这里没有什么意外,答案是运算符优先。
第一种情况是:
true?false:(true==true?false:true)
在第二种情况下,parethes覆盖优先规则。这里没有什么意外,答案是运算符优先。
第一种情况是:
true?false:(true==true?false:true)
而在第二种情况下,您的parethes覆盖优先规则。如果您的问题是结果的差异,这是因为您使用的运算符的优先顺序。查看详细信息。根据优先顺序:
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
这是一个正确的语句
所以这里的区别是运算符的求值顺序,这取决于使用的括号,如果括号不能解决歧义,则取决于使用的运算符的优先顺序
通常,三元运算符“?:”的工作方式如下
A ? B : C
如果A为真,则求值为B,否则求值为C。A必须是布尔表达式,B和C可以是任意值;如果要将计算值分配给不同类型的变量,则必须处理类型不匹配。如果问题是结果不同,这是因为使用的运算符的优先级顺序不同。查看详细信息。根据优先顺序:
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
这是一个正确的语句
所以这里的区别是运算符的求值顺序,这取决于使用的括号,如果括号不能解决歧义,则取决于使用的运算符的优先顺序
通常,三元运算符“?:”的工作方式如下
A ? B : C
如果A为真,则求值为B,否则求值为C。A必须是布尔表达式,B和C可以是任意值;如果要将求值赋值给不同类型的变量,则必须处理类型不匹配问题。我不确定您的问题是什么。正如消息所说,您正在比较两个相同的表达式。你期望发生什么?你不需要做空二郎汤It’不要犹豫,看最后的结果。这两种情况都不一样我不确定你的问题是什么。正如消息所说,您正在比较两个相同的表达式。你期望发生什么?你不需要做空二郎汤It’不要犹豫,看最后的结果。在这两种情况下都是不同的。为什么步骤1中的(true==true?false:true)会减少为(true==false)。我认为你违反了你在第一行说的优先顺序。只是一个想法。@Tomasz Nurkiewicz,Saurabh Kumar在这一点上是正确的;第三步不起作用