三目运算符一些奇怪的现象
这是我在牛客上刷的一道题,大家可以先看一下:
public static void main(String[] args) {
Object o1 = true ? new Integer(1) : new Double(2.0);
Object o2;
if (true) {
o2 = new Integer(1);
} else {
o2 = new Double(2.0);
}
System.out.print(o1);
System.out.print(" ");
System.out.print(o2);
}
结果是:
1.0 1
结果对我来说是很出乎意料的,因为在做这道之前,我一直是这样认为的:
三目运算符也称三元一次运算符,他的规则是 x?y:z,其中x是boolean值,也就是个判断,如果为真(true)值就取y,如果为假(false),值就取z,他也可以写成if(x){y}esle{z};再来看你这里的Object o1 = true ? new Integer(1) : new Double(2.0);其实你这里面包含一个三元一次运算符和一个赋值运算,因为三目运算符的优先级高于赋值运算符,所以先运行三目运算符,得到new Integer(1) ,等式就变成了Object o1 =new Integer(1) ,就得到o1new了个Integer对象,赋值为1,所以打印的就是1。(当然这个结论肯定是错误的,因为上面那个结果是我自己通过IDEA跑出来的)
其实上面忽略了一个三目运算符中一个关键的概念:就是三目运算符中左右两个数据类型应该是一样的,如果不一样,三目运算符在进行运算时,会先将小的数据类型转换大的数据类型,即在上面的那段程序中,三目运算符会优先将Integer转换为Double,然后再进行剩下的运算或者说进行if-else的判断。