條件運(yùn)算符的用法
條件運(yùn)算符優(yōu)先級(jí)高于賦值、逗號(hào)運(yùn)算符,低于其他運(yùn)算符。
C語言
運(yùn)算符表達(dá)式為:表達(dá)式1?表達(dá)式2:表達(dá)式3
先求解表達(dá)式1,
若其值為真(非0)則將表達(dá)式2的值作為整個(gè)表達(dá)式的取值,否則(表達(dá)式1的值為0)將表達(dá)式3的值作為整個(gè)表達(dá)式的取值。
例如:
1、max=(a>b)?a:b
就是將a和b二者中較大的一個(gè)賦給max。
2、min=(a
就是將a和b二者中較小的一個(gè)賦給min。
優(yōu)先級(jí)
條件運(yùn)算符優(yōu)先級(jí)高于賦值、逗號(hào)運(yùn)算符,低于其他運(yùn)算符
例如:
⑴ m
⑵ a++>=10 && b-->20 ? a : b
等價(jià)于:(a++>=10 && b-->20) ? a : b
⑶ x=3+a>5 ? 100 : 200
等價(jià)于:x= (( 3+a>5 ) ? 100 : 200 )
結(jié)合性
條件運(yùn)算符具有右結(jié)合性
當(dāng)一個(gè)表達(dá)式中出現(xiàn)多個(gè)條件運(yùn)算符時(shí),應(yīng)該將位于最右邊的問號(hào)與離它最近的冒號(hào)配對(duì),并按這一原則正確區(qū)分各條件運(yùn)算符的運(yùn)算對(duì)象。
例如:
w
與 w
與 (w
形式關(guān)系表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2
求值規(guī)則
求解關(guān)系表達(dá)式,根據(jù)關(guān)系表達(dá)式的布爾值決定取值:關(guān)系表達(dá)式的值為true時(shí)取表達(dá)式1的值;關(guān)系表達(dá)式的值為false時(shí)取表達(dá)式2的值。
說明
1、條件運(yùn)算符的優(yōu)先級(jí)低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,高于賦值運(yùn)算符。
2、JAVA中條件運(yùn)算表達(dá)式中的關(guān)系表達(dá)式值的類型必須為布爾類型,只能是true或false。3、結(jié)合性也是右結(jié)合性。
4、與C語言不同的是,JAVA中條件表達(dá)式的值必須參與運(yùn)算。
publicstaticvoidmain(String[]args){
inta=10,b=20,y;
a>b?(y=a):(y=b);//1,這樣寫是錯(cuò)誤的
y=a>b?a:b;//2,這樣寫是正確的
y=a
}
}
以上程序中,1處錯(cuò)誤是由于條件表達(dá)式的值沒有參與運(yùn)算,不能構(gòu)成語句。3處(b《c?a:c)先結(jié)合,再將這個(gè)值參與到另一個(gè)條件運(yùn)算中去,是合法的,這也說明了條件運(yùn)算符的右結(jié)合性。
運(yùn)算符妙用
——用條件表達(dá)式判斷輸出單詞的單復(fù)數(shù)。
程序示例:ChooseDemo05.java
程序中會(huì)自動(dòng)根據(jù)apples的個(gè)數(shù)來輸出單詞的單數(shù)或復(fù)數(shù)。
publicclassChooseDemo05{
publicstaticvoidmain(String[]args){
intapples=1;//蘋果的個(gè)數(shù)
System.out.println(“Ihave”+apples+“apple”+(apples==1?“。”:“s.”));
}
}
當(dāng)然,還有其他的應(yīng)用:
1、 在某些地方使用“他”還是“她”。
2、日期輸出時(shí)決定使用后綴“st”、“nd”等。
在標(biāo)準(zhǔn)C語言的文檔里,對(duì)操作符的結(jié)合性并沒有作出非常清楚的解釋。一個(gè)滿分的回答是:它是仲裁者,在幾個(gè)操作符具有相同的優(yōu)先級(jí)時(shí)決定先執(zhí)行哪一個(gè)。
每個(gè)操作符擁有某一級(jí)別的優(yōu)先級(jí),同時(shí)也擁有左結(jié)合性或右結(jié)合性。優(yōu)先級(jí)決定一個(gè)不含括號(hào)的表達(dá)式中操作數(shù)之間的“緊密”程度。例如,在表達(dá)式a*b+c中,乘法運(yùn)算的優(yōu)先級(jí)高于加法運(yùn)算符的優(yōu)先級(jí),所以先執(zhí)行乘法a*b,而不是加法b+c。
但是,許多操作符的優(yōu)先級(jí)都是相同的。這時(shí),操作符的結(jié)合性就開始發(fā)揮作用了。在表達(dá)式中如果有幾個(gè)優(yōu)先級(jí)相同的操作符,結(jié)合性就起仲裁的作用,由它決定哪個(gè)操作符先執(zhí)行。像下面這個(gè)表達(dá)式:
int a, b=1, c=2;
a=b=c;
我們發(fā)現(xiàn),這個(gè)表達(dá)式只有賦值符,這樣優(yōu)先級(jí)就無法幫助我們決定哪個(gè)操作先執(zhí)行,是先執(zhí)行b=c呢,還是先執(zhí)行a=b?如果按前者,a的結(jié)果為2,如果按后者,a的結(jié)果為1。 所有的賦值符(包括復(fù)合賦值)都具有右結(jié)合性,就是說在表達(dá)式中最右邊的操作最先執(zhí)行,然后從右到左依次執(zhí)行。這樣,c先賦值給b,然后b再賦值給a,最終a的值是2。類似地,具有左結(jié)合性的操作符(如位操作符“&”和“|”)則是從左至右依次執(zhí)行。
所以,遇到一個(gè)表達(dá)式時(shí),先根據(jù)運(yùn)算符的優(yōu)先級(jí)將表達(dá)式拆分成幾個(gè)子表達(dá)式,然后在每個(gè)子表達(dá)式中根據(jù)運(yùn)算符的結(jié)合性來進(jìn)一步確定執(zhí)行的順序。
【特殊情況】 看下面這個(gè)C表達(dá)式:
a+++b;
結(jié)果是(a++)+b還是a+(++b)呢?答案是前者,因?yàn)樵谟龅竭@種情況時(shí),C編譯器會(huì)將表達(dá)式按照從左往右的順序盡量匹配出一個(gè)子表達(dá)式,所以當(dāng)C編譯器遇到a且后面有3個(gè)+號(hào)時(shí),會(huì)首先嘗試匹配a+++,當(dāng)然這是沒有意義的,所以接著嘗試a++發(fā)現(xiàn)這是有意義的匹配,因此確定a++為第一個(gè)子表達(dá)式,然后再接著匹配+號(hào)和b。因此結(jié)果是(a++)+b。
這種情況不能算是上面所討論的運(yùn)算符優(yōu)先級(jí)和結(jié)合性的特例,因?yàn)樗l(fā)生在優(yōu)先級(jí)和結(jié)合性判斷之前,但確實(shí)具有一些迷惑性,所以建議在遇到這種情況時(shí)給其加上括號(hào),以增加可讀性且避免可能發(fā)生的不必要的錯(cuò)誤。
JAVA語言
C運(yùn)算符的結(jié)合方向
評(píng)論
查看更多