三元运算符

时间:2013-02-10 09:59:32

标签: java ternary

为什么以下代码的输出是9.0而不是9?如果三元运算符只是if-else分支的简短形式,那么为什么java编译器将int提升为double?

public class Ternary
  {
public static void main(String args[])
     {
    int a = 5;
    System.out.println("Value is - " + ((a < 5) ? 9.9 : 9));
     }
  }

5 个答案:

答案 0 :(得分:9)

  

如果三元运算符只是if-else分支的简短形式,那么为什么java编译器将int提升为double?

条件表达式具有单一类型,第二个和第三个操作数都将根据需要进行转换。 JLS给出了确定表达式类型的规则,由于自动取消装箱,这些规则稍微复杂一些。

条件运算符排序只是if / else结构的简写,但不是我认为你预期的那种简写。所以你的代码等同于:

double value;
if (a < 5) {
    value = 9.9;
} else {
    value = 9;
}
System.out.println("Value is - " + value);

简称:

if (a < 5) {
    System.out.println("Value is - " + 9.9);
} else {
    System.out.println("Value is - " + 9);
}

有关详细信息,请参阅section 15.25 of the Java Language Specification

答案 1 :(得分:2)

因为在这种情况下conditional operator(是的,它的条件运算符而不是三元运算符)的类型将是第3个操作数的提升类型,因为第2和第3操作数不是同一类型。

JLS Secion - 15.25明确列出了这一点: -

  

否则,如果第二个和第三个操作数具有类型   convertible(§5.1.8)到数字类型,然后有几种情况:

     
      
  • 如果其中一个操作数是byte或Byte类型而另一个是   类型短或短,&gt;那么条件表达式的类型是   短。

  •   
  • 如果其中一个操作数是T类型,其中T是byte,short或char,   和另外一个   操作数是类型的常量表达式(第15.28节)   int的值可以在类型T中表示,然后是类型   条件表达式是T。

  •   
  • 如果其中一个操作数是T类型,其中T是Byte,Short或   性格和   其他操作数是一个常量表达式(§15.28)   type int,其值可以在类型U中表示   将拆箱转换应用于T的结果,然后是类型   条件表达式是U。

  •   
  • 否则,二进制数字提升(第5.6.2节)将应用于操作数类型,并且   条件表达式的类型是   提升了第二和第三个操作数的类型。

  •   

请参阅最后一点,这是有用的。因此,在这种情况下,作为binary numeric promotion的规则 - 请参阅JLS Section 5.6.2: -

  
      
  • 如果任一操作数的类型为double,则另一个操作数将转换为double。
  •   

答案 2 :(得分:0)

因为整个表达式的类型是double,因为运算符的一个操作数是double。包含三元组的表达式的类型由操作数决定,操作数必须是相同的类型。对于您的表达式,9会被强制转换为double,以使其与9.9的类型相同。

答案 3 :(得分:0)

实际上,三元运算符并不严格地说是if / else的简短形式,因为它在需要时执行类型转换。特别是,在您的情况下,JLS 15.25要求:

  

二进制数字提升(第5.6.2节)应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

如果您点击§5.6.2的链接:

  

如果任一操作数的类型为double,则另一个操作数转换为double。

答案 4 :(得分:0)

Java需要在编译时知道结果的类型。因此,当这个三元运算符可以产生int或double时,编译器会选择double作为结果类型。