JavaSE:三目运算符与隐式类型转换

环境

  • 操作系统:Ubuntu-24.04
  • JDK:Zulu 21.0.3

原题

以下程序运行后输出结果是()?

1
2
3
4
5
6
public class a {
  public static void main(String[] args){
    int x = 4;
    System.out.println("value is " + ((x > 4) ? 99.9 : 9));
  }
}
  • A、输出结果为:value is 99.9
  • B、输出结果为:value is 9
  • C、输出结果为:value is 9.0
  • D、编译错误

思考

三目运算符的原理是如果?左边为真,则执行:左边,否则执行右边,那么这里的x > 4false,肯定就是执行右边了,根据瞪眼法得出结论为B。 实际运行一下,What???

1
2
> java a.java
value is 9.0 # ???

为什么会是 9.0 呢?因为三目运算符会尽量保持两个操作数的类型一致,避免出现异常。如果两边都是基础数据类型且不为同一个类型,则小的类型会自动提升至大的类型,也就是隐式类型转换,他们的排序如下:byte < short(char) < int < long < float < double。题目中的99.9float9int,那么,三目运算符会将 9 转为 9.0,所以正确答案是C

引申

以下程序运行后会输出什么呢?

1
2
3
4
5
6
public class a {
  public static void main(String[] args){
    int x = 4;
    System.out.println("value is " + ((x > 4) ? 99.9 : 'A'));
  }
}