Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么条件运算符会出现意外行为_Java_Conditional - Fatal编程技术网

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在这一点上是正确的;第三步不起作用