2012-01-17 26 views
1

我有一段代码如下一样为什么意外行为为条件运算

​​

输出为false。如果你使用的是Eclipse,你会得到一个波浪形(这里是虚线)并且警告像“比较相同的表达式”。注意波浪线的开始。

我改变了代码为以下

   public class Test{ 
       public static void main(String[] args) { 
        System.out.println((true?false:true) == (true?false:true)); 
            --------------------------------------- 
       } 
      } 

输出是true。如果你使用的是Eclipse,你会得到一个波浪形(这里是虚线)并且警告像“比较相同的表达式”。现在注意波浪线的开始。

为什么区别?

+0

我不确定你的问题是什么。正如消息所说,你正在比较两个相同的表达式。你期望发生什么? – 2012-01-17 20:17:46

+2

我不需要短暂的时间。没有窍门。 – Nanne 2012-01-17 20:19:05

+0

看到最后的结果。它在两种情况下都是差异 – 2012-01-17 20:21:31

回答

1

如果您的问题是结果的差异,这是因为您使用的操作符的优先顺序。详情请查询here。根据优先顺序:

true ? false : true == true ? false : true 

是一样的:

true ? false : ((true == true) ? false : true) 

所以它总是为。你可以把任何东西放在冒号后面,因为它从来没有被评估(如果我没有记错,三元操作符使用懒惰评估);这样做的原因是,

true ? A : B 

始终计算为A.


在另一方面,

(true ? false : true) == (true ? false : true) 

将有比较操作符两边都是==值为false ,所以

false == false 

这是一个声明。

所以这里的区别是操作符被评估的顺序,这是由你使用的圆括号决定的,如果有不明确的地方不能被圆括号解决,那么这些操作符的优先顺序是用过的。


一般情况下,三元运算符 “?:” 是这样的

A ? B : C 

如果A为真,评估为B,否则评估为C. A必须是一个布尔表达式,B C可以是任何你想要的;你必须处理类型不匹配,尽管如果你想分配评估值给一个变量并且它们是不同类型的。

1

这是因为条件相等运算符(==)优先于三元条件?:。因此,在a?b:xy?z:t之前评估a?b:x==y?z:tx==y?z:t

3

由于三元运算符(?:)比等号运算符(==)的priority更低。这意味着:

true?false:true == true?false:true 

实际上是解释为:

​​

这,轮流,被评估为:

true?false:((true == true)?false:true) 

续:

true?false:(true?false:true) 

。最终:

true?false:(false) 

,并最终:

true?false:false 

而且很明显这解释了第一个代码段的输出。 Eclipse正确识别运算符优先级并突出显示可能不正确的语句

UPDATE:感谢您的所有意见。事实上,我忘记了左侧的运算符优先级。

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建议是一致的:我使用下面的程序检查的确切行为。

+0

为什么(true == true?false:true)在步骤1中减少为(true == false)。我想你在这里违反了你在第一行中谈到的优先顺序。只是一个想法.. – 2012-01-17 20:26:08

+1

@Tomasz Nurkiewicz,Saurabh库马尔是正确的那一个;第三步没有冒号评估后的部分(true == false),它只是计算为(false)。 – 2012-01-17 20:30:24

+1

'(true == true?false:true)'在步骤3中评估为'(true == true)?false:true',其变为'true?false:true',最终变为'false',导致第四步:'true?false:false'。 – 2012-01-17 20:35:25

2

这里没有什么意外的,答案是运算符优先级。 在第一种情况下,它是:
true?false:(true == true?false:true)
而在第二种情况下,您的遗传项会覆盖优先规则。