6

为什么以下代码的输出是 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));
     }
  }
4

5 回答 5

9

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

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

条件运算符只是/构造的简写,但不是我认为您期望的那种简写所以你的代码相当于这个:ifelse

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);
}

有关更多详细信息,请参阅Java 语言规范的第 15.25 节

于 2013-02-10T10:02:52.767 回答
2

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

这在JLS 部分 - 15.25中明确列出: -

否则,如果第二个和第三个操作数具有可转换(第 5.1.8 节)为数字类型的类型,则有以下几种情况:

  • 如果其中一个操作数是 byte 或 Byte 类型,而另一个是 short 或 Short 类型,> 则条件表达式的类型是 short。

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

  • 如果其中一个操作数是 T 类型,其中 T 是 Byte、Short 或 Character,而另一个操作数是 int 类型的常量表达式(第 15.28 节),其值可在 U 类型中表示,这是应用拆箱的结果转换为 T,则条件表达式的类型为 U。

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

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

  • 如果任一操作数是 double 类型,则另一个操作数将转换为 double。
于 2013-02-10T10:03:39.197 回答
1

因为整个表达式的类型是double,因为运算符的操作数之一是 a double。包含三元的表达式的类型由操作数决定,它们必须是相同的类型。在您的表达式的情况下,将9强制转换为 adouble以使其与9.9.

于 2013-02-10T10:02:19.447 回答
0

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

于 2013-02-10T10:03:12.037 回答
0

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

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

如果您点击§5.6.2的链接:

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

于 2013-02-10T10:02:30.930 回答