一、案例編號(hào):
U02C09
二、案例名稱:
使用條件運(yùn)算符的陣痛
三、關(guān)鍵詞:
條件運(yùn)算符、三目運(yùn)算符、三元運(yùn)算符、類型轉(zhuǎn)換
四、案例情景描述:
條件運(yùn)算符有三個(gè)操作數(shù)。它的形式是:boolean-exp?exp1:exp2。它首先計(jì)算boolean表達(dá)式的值,如果為true那么整個(gè)表達(dá)式的值就是表達(dá)式exp1的值,如果boolean表達(dá)式的值為false,那么整個(gè)表達(dá)式的值就是exp2的值。
intk=(2>3)?23:45;因?yàn)閎oolean表達(dá)式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)
/*
*假設(shè)Test是已經(jīng)定義的某個(gè)類
*/
Testt=flase?newObject():newTest();
五、案例理論分析:
1、我們先看第一個(gè)代碼片段:三個(gè)輸出語(yǔ)句會(huì)輸出什么結(jié)果呢?
你也行會(huì)認(rèn)為輸出結(jié)果是:
'A'
'A'
'A'
當(dāng)你運(yùn)行一下這段代碼,它的真正結(jié)果是:
'A'
65
65
為什么會(huì)有這樣的結(jié)果呢?實(shí)質(zhì)上這就是條件運(yùn)算符對(duì)于運(yùn)算結(jié)果類型的限制:
(1)如果表達(dá)式1和表達(dá)式2具有相同的類型,那么整個(gè)條件運(yùn)算符結(jié)果的類型就是這個(gè)類型。
(2)如果一個(gè)表達(dá)式的類型是T,T是byte或short或char,另一個(gè)表達(dá)式的類型是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值是可以用類型T表示的(也就是說(shuō),常量表達(dá)式的值是在類型T的取值范圍之內(nèi)),那么整個(gè)條件運(yùn)算符結(jié)果的類型就是T。
(3)除以上情況外,如果表達(dá)式1和表達(dá)式2的類型不同,那么將進(jìn)行類型提升,整個(gè)條件運(yùn)算符結(jié)果的類型就是提升后的類型。
System.out.println(true?x:0); //line3。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值0可以用char類型來(lái)表示,因此整個(gè)條件運(yùn)算符結(jié)果的類型就應(yīng)當(dāng)是char類型,所以輸出的結(jié)果就是'A'。
System.out.println(true?x:1111111110); //line4。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,但是這個(gè)常量表達(dá)式的值已經(jīng)超出了char類型的取值范圍,因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型了,所以輸出的結(jié)果是65(字符A的ASCII碼)。
System.out.println(false?i:x); //line5。表達(dá)式1是int類型的變量,表達(dá)式2是char類型的變量,沒有常量表達(dá)式。因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型。所以輸出結(jié)果就是65。
2、我們?cè)倏吹诙€(gè)代碼片段,它的結(jié)果是在編譯階段引發(fā)錯(cuò)誤。為什么?
Testt=flase?newObject():newTest();我們看到表達(dá)式1是Object類型,表達(dá)式2是Test類型。沒有常量表達(dá)式,類型不同,因此要進(jìn)行類型提升的。要把Test類型提升為Object類型,因此整個(gè)條件運(yùn)算符結(jié)果的類型應(yīng)當(dāng)是Object類型。當(dāng)在賦值的時(shí)候要把Object類型賦值給Test類型的變量,當(dāng)然會(huì)引發(fā)編譯錯(cuò)誤。
U02C09
二、案例名稱:
使用條件運(yùn)算符的陣痛
三、關(guān)鍵詞:
條件運(yùn)算符、三目運(yùn)算符、三元運(yùn)算符、類型轉(zhuǎn)換
四、案例情景描述:
條件運(yùn)算符有三個(gè)操作數(shù)。它的形式是:boolean-exp?exp1:exp2。它首先計(jì)算boolean表達(dá)式的值,如果為true那么整個(gè)表達(dá)式的值就是表達(dá)式exp1的值,如果boolean表達(dá)式的值為false,那么整個(gè)表達(dá)式的值就是exp2的值。
intk=(2>3)?23:45;因?yàn)閎oolean表達(dá)式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)
/*
*假設(shè)Test是已經(jīng)定義的某個(gè)類
*/
Testt=flase?newObject():newTest();
五、案例理論分析:
1、我們先看第一個(gè)代碼片段:三個(gè)輸出語(yǔ)句會(huì)輸出什么結(jié)果呢?
你也行會(huì)認(rèn)為輸出結(jié)果是:
'A'
'A'
'A'
當(dāng)你運(yùn)行一下這段代碼,它的真正結(jié)果是:
'A'
65
65
為什么會(huì)有這樣的結(jié)果呢?實(shí)質(zhì)上這就是條件運(yùn)算符對(duì)于運(yùn)算結(jié)果類型的限制:
(1)如果表達(dá)式1和表達(dá)式2具有相同的類型,那么整個(gè)條件運(yùn)算符結(jié)果的類型就是這個(gè)類型。
(2)如果一個(gè)表達(dá)式的類型是T,T是byte或short或char,另一個(gè)表達(dá)式的類型是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值是可以用類型T表示的(也就是說(shuō),常量表達(dá)式的值是在類型T的取值范圍之內(nèi)),那么整個(gè)條件運(yùn)算符結(jié)果的類型就是T。
(3)除以上情況外,如果表達(dá)式1和表達(dá)式2的類型不同,那么將進(jìn)行類型提升,整個(gè)條件運(yùn)算符結(jié)果的類型就是提升后的類型。
System.out.println(true?x:0); //line3。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,而且這個(gè)常量表達(dá)式的值0可以用char類型來(lái)表示,因此整個(gè)條件運(yùn)算符結(jié)果的類型就應(yīng)當(dāng)是char類型,所以輸出的結(jié)果就是'A'。
System.out.println(true?x:1111111110); //line4。表達(dá)式1是char類型,表達(dá)式2是int類型的常量表達(dá)式,但是這個(gè)常量表達(dá)式的值已經(jīng)超出了char類型的取值范圍,因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型了,所以輸出的結(jié)果是65(字符A的ASCII碼)。
System.out.println(false?i:x); //line5。表達(dá)式1是int類型的變量,表達(dá)式2是char類型的變量,沒有常量表達(dá)式。因此要進(jìn)行類型提升,把char類型提升為int類型,整個(gè)條件運(yùn)算符結(jié)果的類型就是int類型。所以輸出結(jié)果就是65。
2、我們?cè)倏吹诙€(gè)代碼片段,它的結(jié)果是在編譯階段引發(fā)錯(cuò)誤。為什么?
Testt=flase?newObject():newTest();我們看到表達(dá)式1是Object類型,表達(dá)式2是Test類型。沒有常量表達(dá)式,類型不同,因此要進(jìn)行類型提升的。要把Test類型提升為Object類型,因此整個(gè)條件運(yùn)算符結(jié)果的類型應(yīng)當(dāng)是Object類型。當(dāng)在賦值的時(shí)候要把Object類型賦值給Test類型的變量,當(dāng)然會(huì)引發(fā)編譯錯(cuò)誤。