三目運算子<運算式1>?<運算式2>:<運算式3>; "?"運算子的含義是: 先求運算式1的值, 如果為真, 則執行運算式2,並返回運算式2的結果 ; 如果運算式1的值為假, 則執行運算式3 ,並返回運算式3的結果.
以上是三目運算子的基本定義與使用。表面上看來,應該是比較簡單。在《Java程式員面試寶典》這本書裡,我們見到了了兩道比較有意思的題目。
題目1:【中國東北著名軟體公司D2009年3月筆試題】
int a=5;
System.out.println("a="+((a<5)?10.9:9));
A. 編譯錯誤
B. 10.9
C. 9
D. 以上答案都不對
也許和大多數人一樣,剛開始想當然的以為a<5為false,那麼結果就是9了,選C嘛。
仔細想想,這就是題目設定的陷阱。在運算式=(a<5)?10.9:9中有一個10.9,這是java就會根據運算子的精度進行自動類型的轉換,由於前面是10.9,那麼後面的9也就跟著變為9.0了!
題目2:【中國東北著名軟體公司D2009年3月筆試題】
char x='x';
int i=10;
System.out.println(false?i:x);
System.out.println(false?100:x);
A. 120 x
B. 120 120
C. x 120
D. 以上答案都不對
答案為A
解析:System.out.println(false?i:x)與上個題目1相同,x被提升為int類型,所以輸出x的ASCII碼
而對於第二行,由於100是一個常量運算式。若三目運算子中的兩個運算式有一個是常量運算式,另一個是類型T(本題中為char)的運算式,且常量運算式可以被T表示,則輸出結果是T類型。因此輸出是字元
核心思想:
1.若三目運算子中的兩個運算式有一個是常量運算式,另一個是類型T的運算式,且常量運算式可以被T表示,則輸出結果是T類型。
2.如果都是常量運算式,用向上類型轉換
進入習題模式:
(1)
char x='x';
int i=10;、
System.out.println(false?10000:x);
系統輸出:x
好的,如果修改一下呢
char x='x';
int i=10;、
System.out.println(false?100000:x);
系統輸出是怎樣呢。120。
解析:【核心思想1】10000可以被本題的T類型表示,所以輸出結果為T類型,輸出x;但是換成100000就不行了,因為它超過了ASCII碼範圍。那麼就是就輸出x的ASCII碼值
繼續延伸
char x='x';
System.out.println(true?100:x);
這個呢。
解析:同樣適用【核心思想1】,true之後進入condition1.100可以被T類型表示,那麼輸入將是T類型(char 類型),100對應ASCII為d,那麼輸出d.
(2)
char x='x';
System.out.println(true?x:10);
System.out.println(true?x:10.0);
好的,第一行應該輸出是x,這個沒有問題。那麼第二行呢。結果:120.0
解析:適用【核心思想1】,但是10.0不能被T類型,那麼輸出將不是T類型。120將升級為double類型變為120.0
(3)
System.out.println(fasle?9:10.0);
System.out.println(true?9:10.0);
結果:10.0 9.0
解析:適用【核心思想2】,第一行fasle的結果就是最高類型;第二行9將升級為double類型變為9.0