三元操作符的型別務必一致

2021-09-07 16:04:45 字數 1087 閱讀 1057

三元操作符是if-else的簡化寫法,在專案中使用它的地方很多,也非常好用,但是好用又簡單的東西並不表示就可以隨便用,我們來看看下面這段**:

public

class

client

}

分析一下這段程式:i是80,那它當然小於100,兩者的返回值肯定都是90,再轉成string型別,其值也絕對相等,毋庸置疑的。恩,分析得有點道理,但是變數s中三元操作符的第二個運算元是100,而s1的第二個運算元是100.0,難道沒有影響嗎?不可能有影響吧,三元操作符的條件都為真了,只返回第乙個值嘛,與第二個值有一毛錢的關係嗎?貌似有道理。

果真如此嗎?我們通過結果來驗證一下,執行結果是:「兩者是否相等:false」,什麼?不相等,why?

問題就出在了100和100.0這兩個數字上,在變數s中,三元操作符中的第乙個運算元(90)和第二個運算元(100)都是int型別,型別相同,返回的結果也就是int型別的90,而變數s1的情況就有點不同了,第乙個運算元是90(int型別),第二個運算元卻是100.0,而這是個浮點數,也就是說兩個運算元的型別不一致,可三元操作符必須要返回乙個資料,而且型別要確定,不可能條件為真時返回int型別,條件為假時返回float型別,編譯器是不允許如此的,所以它就會進行型別轉換了,int型轉換為浮點數90.0,也就是說三元操作符的返回值是浮點數90.0,那這當然與整型的90不相等了。這裡可能有讀者疑惑了:為什麼是整型轉為浮點,而不是浮點轉為整型呢?這就涉及三元操作符型別的轉換規則:

若兩個運算元不可轉換,則不做轉換,返回值為object型別。

若兩個運算元是明確型別的表示式(比如變數),則按照正常的二進位制數字來轉換,int型別轉換為long型別,long型別轉換為float型別等。

若兩個運算元中有乙個是數字s,另外乙個是表示式,且其型別標示為t,那麼,若數字s在t的範圍內,則轉換為t型別;若s超出了t型別的範圍,則t轉換為s型別(可以參考「建議22」,會對該問題進行展開描述)。

若兩個運算元都是直接量數字(literal),則返回值型別為範圍較大者。

知道是什麼原因了,相應的解決辦法也就有了:保證三元操作符中的兩個運算元型別一致,即可減少可能錯誤的發生

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

編寫高質量 改善j a程式的151個建議 如下 public class client 輸出結果 false s1 90 s2 90.0 三元操作符型別轉換規則 1.若兩個操作符不可轉換,則不做轉換,返回值為object型別。2.若兩個運算元是明確的型別表示式 比如變數 則按照正常的二進位制數字來轉...

模擬三元操作符和真正三元操作符的區別

更新 2019.9.7 在第二個運算元為真的情況下 lua的 a and b or c 與 a?b c是等價的.1 三元操作符是用來處理簡單的判斷的 2 a b?a b 3 寫成if的情況 4if a b 5returna 6 else 7returnb 8 9 或許用and和or來模擬 10 a ...

js 三元操作符

作為乙個不務正業的前端,現在資料庫是玩的越來越溜了。比如資料庫我又學了幾種特殊的用法,select的四捨五入,這個一定要記下來。update a set lat cast lat as decimal 25,9 25 和 9 分別是原來的位數和四捨五入之後的位數,這條語句就是可以四捨五入到小數點後9...