文章目录
三目运算符,从代码逻辑上看,其实就是if-else条件判断语句的简化版。
一、三目运算符的类型务必一致
观察以下代码案例,看看两者是否相等
- 答案是:
false
public static void main(String[] args) {
int i = 100;
String s = String.valueOf(i < 100 ? 90 : 100);
String s1 = String.valueOf(i < 100 ? 90 : 100.0);
System.out.println("两者是否相等:" + s.equals(s1));
}
从直观第一感觉来看,
i < 100
这一表达式的结果在此处肯定为true
,那么它自然会走第二个操作数表达式,返回的都是90
,再转成String类型,两者的值应该是相等的。分析地确实有道理。不过,第三个操作数表达式分别是
100
和100.0
,它们真的就不会影响到我们返回的结果吗?不会吧不会吧。
案例分析
对于
String.valueOf(i < 100 ? 90 : 100)
,第二个操作数表达式和第三个操作数表达式都是int类型
,类型相同
,那么返回的结果就是int类型的90
。对于
String.valueOf(i < 100 ? 90 : 100.0)
,第二个操作数表达式为int类型
,第三个操作数表达式为浮点数
,两个操作数表达式类型不一致。但是三目运算符要求我们
返回一个值
,并且是类型确定的
,不会出现当条件为true时返回int类型,条件为false时返回float类型的情况,编译器是不会允许我们这么做的,此时就会进行类型转换
,将int类型90
转换为浮点数90.0
,并返回。自然就和
String.valueOf(i < 100 ? 90 : 100)
情况下得到的返回值不一样。
- 为何是整型转换为浮点数类型,而不是浮点数转为整型呢?
我们通过解读
Java Language Specification
语言规范,来探究三目运算符的转换规则。
二、代码案例分析
- 代码案例1
public static void main(String[] args) {
int a = 1;
int b = 1;
// int类型(9)转换为double类型(9.0D)
System.out.println(a == b ? 9.9 : 9);
// (98)在char取值范围内,转换为对应ASCII码
System.out.println