概念
形式:关系表达式 ? 表达式1 : 表达式2
求值规则:求解关系表达式,根据关系表达式的布尔值决定取值;关系表达式的值为true时取表达式1的值;关系表达式的值为false时取表达式2的值。
举例:
int a = 1;
int b = 2;
System.out.println(a > b ? a : b);
输出:2
类型转换导致的问题
Case 1和Case 2比较大小相同类型不同的值
Case 1:
double d = 1.0;
long l = 1L;
System.out.println(d > l ? d : l);
输出:1.0
反编译代码如下
double d = 1.0D;
long l = 1L;
System.out.println(d > (double)l ? d : (double)l);
Case 2:
double d = 1.0;
long l = 1L;
System.out.println(false ? d : l);
输出:1.0
反编译代码如下
double d = 1.0D;
long l = 1L;
System.out.println((double)l);
分析
根据上述两个case可以看出,关系表达式、表达式1 : 表达式2内容编译后会转换为相同类型数据。
因此在条件运算符中使用不同类型数据时,注意类型转换操作,避免影响使用。
注意
在条件运算符使用时同样需要注意装箱和拆箱带来的影响,汇总一句为运算符要求数据类型统一。
Case 3:赋值运算符
long l = 1L;
double d = l;
System.out.println(d);
输出:1.0
反编译代码如下
long l = 1L;
double d = (double)l;
System.out.println(d);
Case 4:双目运算符
double d = 1.0;
long l = 1L;
System.out.println(d == l);
输出:true
反编译代码如下
double d = 1.0D;
long l = 1L;
System.out.println(d == (double)l);
分析
关系运算符比较不同类型数据时,需进行类型转换,类型转换分为自动转换和强制转换两种,自动类型转换顺序如下:
byte -> short \
int -> long -> float -> double
char /