程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2SE >> J2SE綜合:使用條件運算符的陣痛

J2SE綜合:使用條件運算符的陣痛

編輯:J2SE

一、案例編號:

U02C09

二、案例名稱:

使用條件運算符的陣痛

三、關鍵詞:

條件運算符、三目運算符、三元運算符、類型轉換

四、案例情景描述:

條件運算符有三個操作數。它的形式是:boolean-exp?exp1:exp2。它首先計算boolean表達式的值,如果為true那麼整個表達式的值就是表達式exp1的值,如果boolean表達式的值為false,那麼整個表達式的值就是exp2的值。

intk=(2>3)?23:45;因為boolean表達式2>3為false,所以k的值是45。

上述都是關於條件運算符值的確定,那麼條件運算符值的類型又是怎麼確定的呢?看下述代碼:

(1)

charx=‘A’;  //line1

inti=0;  //line2

System.out.println(true?x:0);  //line3

System.out.println(true?x:1111111110);  //line4

System.out.println(false?i:x);  //line5

(2)

/*

*假設Test是已經定義的某個類

*/

Testt=flase?newObject():newTest();


五、案例理論分析:

1、我們先看第一個代碼片段:三個輸出語句會輸出什麼結果呢?

你也行會認為輸出結果是:

'A'

'A'

'A'

當你運行一下這段代碼,它的真正結果是:

'A'

65

65

為什麼會有這樣的結果呢?實質上這就是條件運算符對於運算結果類型的限制:

(1)如果表達式1和表達式2具有相同的類型,那麼整個條件運算符結果的類型就是這個類型。

(2)如果一個表達式的類型是T,T是byte或short或char,另一個表達式的類型是int類型的常量表達式,而且這個常量表達式的值是可以用類型T表示的(也就是說,常量表達式的值是在類型T的取值范圍之內),那麼整個條件運算符結果的類型就是T。

(3)除以上情況外,如果表達式1和表達式2的類型不同,那麼將進行類型提升,整個條件運算符結果的類型就是提升後的類型。

System.out.println(true?x:0);  //line3。表達式1是char類型,表達式2是int類型的常量表達式,而且這個常量表達式的值0可以用char類型來表示,因此整個條件運算符結果的類型就應當是char類型,所以輸出的結果就是'A'。

System.out.println(true?x:1111111110);  //line4。表達式1是char類型,表達式2是int類型的常量表達式,但是這個常量表達式的值已經超出了char類型的取值范圍,因此要進行類型提升,把char類型提升為int類型,整個條件運算符結果的類型就是int類型了,所以輸出的結果是65(字符A的ASCII碼)。

System.out.println(false?i:x);  //line5。表達式1是int類型的變量,表達式2是char類型的變量,沒有常量表達式。因此要進行類型提升,把char類型提升為int類型,整個條件運算符結果的類型就是int類型。所以輸出結果就是65。

2、我們再看第二個代碼片段,它的結果是在編譯階段引發錯誤。為什麼?

Testt=flase?newObject():newTest();我們看到表達式1是Object類型,表達式2是Test類型。沒有常量表達式,類型不同,因此要進行類型提升的。要把Test類型提升為Object類型,因此整個條件運算符結果的類型應當是Object類型。當在賦值的時候要把Object類型賦值給Test類型的變量,當然會引發編譯錯誤。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved