1. 程式人生 > >建議 3:三元操作符的型別務必一致

建議 3:三元操作符的型別務必一致

三元操作符是if---else的簡化寫法,在專案中使用她的地方很多,也非常好用,但是好用又簡單的東西並不表示可以隨便使用(老實人也不是可以隨便欺負的),所以我們來看一下下面這程式碼:

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

我們先分析一下這個程式:i是80,那他自然是小於100的,所以兩者的返回值肯定都是90,再轉成string型別,其值也絕對相等,這是毋庸置疑的。
話到這裡果真是沒有問題的嗎?
先說一下我第一次看到這段程式時的第一反應吧!第一落眼處就放在了100和100.0並且後面還跟著一個equals很明顯的整數型和浮點型(double、float)資料比較。
接下來我們一塊看一下,在變數s中,三元操作符中的第一個運算元(90)和第二個運算元(100)都是int型別,型別相同,返回結果也就是int型別的90,而變數s1的情況就有所不同了,第一個運算元是90(int型別),第二個運算元卻是100.0(浮點型),兩個操作型別不一致,可三元操作符必須要返回一個數據,而且型別要確定,不可能條件為真時返回int型別,條件為假時返回float型別,編譯器是不允許如此的,所以他就會進行型別轉換了,int型轉換為浮點型90.0,也就是說三元操作符的返回值是浮點數90.0,那麼自然與整型的90是不等的。這裡大家可能會有點疑惑,為什麼是整型轉浮點型而不是浮點型轉整型呢?
三元操作符型別的轉換規則:
1、若兩個運算元不可轉換,則不做轉換,返回值為object型別;
2、若兩個運算元是明確型別的表示式(比如變數),則按照正常的二進位制數字轉換,int轉float,float轉long等;
3、若兩個運算元中有一個運算元S,另一個是表示式,且其型別標識為T,那麼,若數字S在T的範圍內,則轉換為T型別;若S超出了T型別的範圍,則T轉換為S型別;
4、若兩個操作符都是直接量數字(literal),則返回值型別為較大者。
所以,這裡我們要注意的是在轉換過程中注意資料型別是否一致。其次,隱隱約約感覺到還要注意一下強轉。