为什么以下代码的输出是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));
}
}
答案 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);
}
答案 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作为结果类型。