三元操作符类型的转换规则

1年前 (2017-07-08) wang JAVA 0评论 已收录 208℃ 浏览数:101

(1)若两个操作数不可转换,则全部返回Object类型。

这个比较好理解,无法转换所以返回Object。

(2)若两个操作数是明确的类型的表达式,则按照正常的二进制数来进行转换。int转为long,或者long转为float。

这个我没怎么看懂。查了也没看到相关的资料。等以后有机会再了解吧。

(3)若两个操作数有一个是常量表达式,另外一个表达式,且类型标识为T,那么如果常量表达式在T的范围内,转换为S类型,反之转换为T类型。

public class Test {  
    public static void main(String[] args) {  
        char x = 'x';  
        int i = 10;  
        System.out.println(false?i:x);  
        System.out.println(false?10:x);  
    }  

我们来看看这个会输出什么。结果是:120  x 为什么会这样?
char 是字符类型,Java语言对字符采用Unicode字符编码。java语言把字符同时作为无符号整数对待,取值范围是0-65535。所以第一个的输出'x'就被自动转换为int类型了。输出120

第二个的输出就涉及到以上规则。当两个操作数有一个是常量表达式(上面指10),另外一个类型是T(上面指char)时,而常量表达式可以被T表示时,输出结果是T类型。所以输出‘x’

如果

public class Test {  
    public static void main(String[] args) {  
        char x = 'x';  
        int i = 10;  
        System.out.println(true?i:x);  
        System.out.println(true?10:x);  
    }  

这样会输出什么? 10 ' ' 这是什么意思?第一个输出10没问题,第二个输出什么?输出空格,为什么?因为输出的10会转换为char类型,ASCII码中的10就是换行符。这样更能加深理解。

(4)若两个操作数都是数字,则返回值类型为范围较大者。

这个比较有意思,如果不了解可能会中陷阱。我们来看个实例。

public class yunsuanfu {
    public static void main(String[] args) {
        int a = 5;
        System.out.println("value is "+((a<5) ? 10.9 : 9));
    }
}

这个是个很简单的面试题。a=5 a<5 是false 所以应该返回 9 ,所以控制台会打印 9 吗? 答案是9.0 。为什么,因为两个操作数都是数字,一个是10.9,一个是9。10.9是浮点数,而9是int值。因为浮点数的范围大,所以9会自动转换为浮点数,所欲返回9.0

public class Client {  
     public static void main(String[] args) {  
           int i = 80;  
           String s = String.valueOf(i&amp;lt;100?90:100);  
           String s1 = String.valueOf(i&amp;lt;100?90:100.0);  
           System.out.println("两者是否相等:"+s.equals(s1));  
     }  
} 

这个同理。第一个返回的是90,第二个由于第二个操作数是100.0,所以会返回90.0 90和90.0不相等,所以返回false。

博主

Just do it. Now or never.

相关推荐

嗨、骚年、快来消灭0回复。