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