JAVA 條件表示式 陷阱

2021-07-03 01:08:13 字數 1595 閱讀 4176

mapmap = new hashmap();    

map.put("count", null);

integer it = map == null ? 0 : map.get("count");

public class dosequis    

}

這個程式由兩個變數宣告和兩個print語句構成。第乙個print語句計算條件表示式(true ? x : 0)並列印出結果,這個結果是char型別變數x的值』x』。而第二個print語句計算表示式(false ? i : x)並列印出結果,這個結果還是依舊是』x』的x,因此這個程式應該列印xx。

然而,如果你執行該程式,你就會發現它列印出來的是x88。這種行為看起來挺怪的。第乙個print語句列印的是x,而第二個列印的卻是88。它們的不同行為說明了什麼呢?

答案就在規範有關條件表示式部分的乙個陰暗的角落裡。請注意在這兩個表示式中,每乙個表示式的第二個和第三個運算元的型別都不相同:x是char型別的,而0和i都是int型別的。混合型別的計算會引起混亂,而這一點比在條件表示式中比在其它任何地方都表現得更明顯。你可能考慮過,這個程式中兩個條件表示式的結果型別是相同的,就像它們的運算元型別是相同的一樣,儘管運算元的順序顛倒了一下,但是實際情況並非如此。

確定條件表示式結果型別的規則過於冗長和複雜,很難完全記住它們,但是其核心就是一下三點:

1、如果第二個和第三個運算元具有相同的型別,那麼它就是條件表示式的型別。換句話說,你可以通過繞過混合型別的計算來避免**煩。

2、如果乙個運算元的型別是t,t表示byte、short或char,而另乙個運算元是乙個int型別的常量表示式,它的值是可以用型別t表示的,那麼條件表示式的型別就是t。

3、否則,將對運算元型別運用二進位制數字提公升,而條件表示式的型別就是第二個和第三個運算元被提公升之後的型別。

2、3兩點是關鍵。在程式的兩個條件表示式中,乙個運算元的型別是char,另乙個的型別是int。在兩個表示式中,int運算元都是0,它可以被表示成乙個char。然而,只有第乙個表示式中的int運算元是常量(0),而第二個表示式中的int運算元是變數(i)。因此,第2點被應用到了第乙個表示式上,它返回的型別是char,而第3點被應用到了第二個表示式上,其返回的型別是對int和char運用了二進位制數字提公升之後的型別,即int。

條件表示式的型別將確定哪乙個過載的print方法將被呼叫。對第乙個表示式來說,print(char)將被呼叫,而對第二個表示式來說,printstream.print(int)將被呼叫。前乙個過載方法將變數x的值作為unicode字元(x)來列印,而後乙個過載方法將其作為乙個十進位制整數(88)來列印。

總之,通常最好是在條件表示式中使用型別相同的第二和第三運算元。否則,你和你的程式的讀者必須要徹底理解這些表示式行為的複雜規範。

對 語言設計者來說,也許可以設計乙個犧牲掉了部分靈活性,但是增加了簡潔性的條件操作符。例如,要求第二和第三運算元必須就有相同的型別,這看起來就很合 理。或者,條件操作符可以被定義為對常量沒有任何特殊處理。為了讓這些選擇對程式設計師來說更加容易接受,可以提供用來表示所有原始型別字面常量的語法。這也 許確實是乙個好注意,因為它增加了語言的一致性和完備性,同時又減少了對轉型需求。

**:

Java 條件表示式

size medium public class sanyuantest 輸出結果為 x88 88 9090.0 條件運算子規則 1 如果第2個和第三個有相同的型別,那麼它就是條件表示式的型別。2 如果乙個運算元的型別是t,t為byte short char,而另乙個運算元是乙個int型別的 col...

表示式中的陷阱

表示式 1.表示式是一種運算子和運算元合成在一起組成的式子 運算子需要的運算元數量不相同 a b a b a 運算子需要的運算元類別不相同 a b a 1 1 1 a 1 2.表示式都有乙個結果值 賦值運算 int a 1 a 2 system.out.println a int a 1 syste...

pgsql條件表示式

postgresql 8.1 中文文件 prev fast backward chapter 9.函式和操作符 fast forward next 本節描述在 postgresql 裡可以用的sql相容的條件表示式。sqlcase 表示式是一種通用的條件表示式,類似於其它語言中的 if else 語...