條件運算符優(yōu)先級高于賦值、逗號運算符,低于其他運算符。
條件運算符是什么
運算符
表達式為:表達式1?表達式2:表達式3
先求解表達式1,
若其值為真(非0)則將表達式2的值作為整個表達式的取值,否則(表達式1的值為0)將表達式3的值作為整個表達式的取值。
例如:
1、max=(a》b)?a:b
就是將a和b二者中較大的一個賦給max。
2、min=(a《b)?a:b
就是將a和b二者中較小的一個賦給min。
優(yōu)先級
條件運算符優(yōu)先級高于賦值、逗號運算符,低于其他運算符
例如:
?、?m《n ? x : a+3
等價于:(m《n) ?(x) :(a+3)
⑵ a++》=10 && b--》20 ? a : b
等價于:(a++》=10 && b--》20) ? a : b
?、?x=3+a》5 ? 100 : 200
等價于:x= (( 3+a》5 ) ? 100 : 200 )
結合性
條件運算符具有右結合性
當一個表達式中出現(xiàn)多個條件運算符時,應該將位于最右邊的問號與離它最近的冒號配對,并按這一原則正確區(qū)分各條件運算符的運算對象。
例如:
w《x ? x+w : x《y ? x : y
與 w《x ? x+w : ( x《y ? x : y) 等價
與 (w《x ? x+w : x《y) ? x : y 不等價
JAVA語言:
形式
關系表達式 ? 表達式1 : 表達式2
求值規(guī)則
求解關系表達式,根據(jù)關系表達式的布爾值決定取值:關系表達式的值為true時取表達式1的值;關系表達式的值為false時取表達式2的值。
說明
1、條件運算符的優(yōu)先級低于關系運算符和算術運算符,高于賦值運算符。
2、JAVA中條件運算表達式中的關系表達式值的類型必須為布爾類型,只能是true或false。
3、結合性也是右結合性。
4、與C語言不同的是,JAVA中條件表達式的值必須參與運算。運算符妙用:
——用條件表達式判斷輸出單詞的單復數(shù)。
程序示例:ChooseDemo05.java
程序中會自動根據(jù)apples的個數(shù)來輸出單詞的單數(shù)或復數(shù)。
當然,還有其他的應用:
1、 在某些地方使用“他”還是“她”。
2、日期輸出時決定使用后綴“st”、“nd”等。
條件運算符有哪些
1. 關系運算符
關系運算實際上是邏輯比較運算,它是邏輯運算中的一種。關系運算符的作用是確定兩個數(shù)據(jù)之間是否存在某種關系。C語言規(guī)定的6種關系運算符及其有關的說明見表3-6。
表3-6 算術運算符
運算符 含義 運算對象個數(shù) 結合方向 簡例
》 大于 雙目運算符 自左至右 a》b,3》8
》 = 大于等于 雙目運算符 自左至右 a》=b,3》=2
《 小于 雙目運算符 自左至右 a 《 = 小于等于 雙目運算符 自左至右 a《=b,3《=b
??! = 不等于 雙目運算符 自左至右 a!=b,3!=5%7
= = 恒等于 雙目運算符 自左至右 a==b,3==5*a
關系運算符都是雙目運算符,其結合性是從左到右結合。優(yōu)先級分為兩級:
高級:<、<=、>、>=
低級:==、!=
關系運算符的優(yōu)先級低于算術運算符。
2. 關系表達式
用關系運算符將兩個表達式連接起來的式子稱為關系表達式。它的一般形式為:
表達式1 關系運算符 表達式2
其中,關系運算符指明了對表達式所實施的操作?!氨磉_式1”和“表達式2”是關系運算的對象,它們可以是算術表達式、關系表達式、邏輯表達式、 賦值表達式和字符表達式。但一般關系運算要求關系運算符連接的兩個運算對象為同類型數(shù)據(jù)。例如:
a+b》3*c 兩個算術表達式的值作比較
?。╝=b)《(b=10%c) 兩個賦值表達式的值作比較
?。╝《=b)==(b》c) 兩個關系表達式的值作比較
‘A’!=‘a(chǎn)’ 兩個字符表達式的值作比較
關系式只有兩種可能的結果:或者它所描述的關系成立,或者這個關系不成立,所以說一個關系表達式描述的是一種邏輯判斷。若關系成立,說明關系式表述的關系是“真”的,稱邏輯值為“真”,用1表示;若關系不成立,說明關系式表述的關系是“假”的,稱邏輯值為“假”,用0表示。所以關系表達式的運算結果一定是邏輯值。
進行關系運算時,先計算表達式的值,然后再進行關系比較運算。例如:
a=2,b=3,c=4,則上述關系表達式的值為:
a+b》3*c (5》12)關系不成立 表達式結果值為0(假)
(a+=b)《(b*=10%c) (5《6) 關系成立 表達式結果值為1 (真)
?。╝《=b)==(b》c) (1==0)關系不成立 表達式結果值為0(假)
‘A’!=‘a(chǎn)’ (65!=97)關系成立 表達式結果值為1(真)
以關系表達式“a+b》3*c”為例,因為算術運算的優(yōu)先級高于關系運算,所以先計算a+b和3*c的值,結果分別為5和12,再將5和12進行關系比較,其運算結果為0。
在表達式中連續(xù)使用關系運算符時,要注意正確表達含義,注意運算優(yōu)先級和結合性。
例如,變量x的取值范圍為“0≤x≤20”時,不能寫成“0《=x《=20”。因為關系表達式“0《=x《=20”的運算過程是:按照優(yōu)先級,先求出“0《=x”的結果,再將結果1或0作“《=9”的判斷,這樣無論x取何值,最后表達式一定成立,結果一定為1。這顯然違背了原來的含義。此時,就要運用下面介紹的邏輯運算符進行連接,即應寫為:“0《=x && x《=9”。
3.4.2 邏輯運算符與邏輯表達式
1.邏輯運算符
?。谜Z言規(guī)定的3種邏輯運算符及其有關的說明見表3-7。
表3-7 邏輯運算符
運算符 含義 運算對象個數(shù) 結合方向 簡例
&& 邏輯與 雙目運算符 自左向右 a&&b,3》8&&a==b
|| 邏輯或 雙目運算符 自左向右 a||b,3《=b8||a==b
! 邏輯非 單目運算符 自右向左 !a,!a==b
邏輯運算要求運算對象為“真”(非0)或“假”(0)。這三種邏輯運算符的運算規(guī)則可用表3-8的真值表表示:
表3-8 邏輯運算真值表
?。?b a&&b a||b !a !b
0 0 0 0 1 1
0 非0 0 1 1 0
非0 0 0 1 0 1
非0 非0 1 1 0 0
在一個邏輯表達式中,可以含有多個邏輯運算符,其優(yōu)先級是:“!”最高,“&&”次之,“||”最低;邏輯運算優(yōu)先級低于所有關系運算,而“!”優(yōu)先級高于所有算術運算。
例如:某程序中有如下說明:int a=3,b=1, x=2, y=0;則:
① (a》b) && (x》y) 的值為1。
② a》b && x》y 的值為1。
注意:①②兩式是等價的,因為“&&”運算優(yōu)先級低于關系運算,故括號可以省略。
?、?(y||b) && (y||a) 的值為1。
?、?y||b && y||a 的值為1。
注意:③④兩式結果雖然一樣,但兩式的含義不同。③式中由于括號的優(yōu)先級高于“&&”,因此,先計算“y||b”和“y||a”后,再將兩個結果進行“&&”運算。而④式由于“&&”的優(yōu)先級高于“||”,故要先計算“b&&y”,其結果為0,再計算“y||0”,其值也為0,最后計算“0||a”,結果為1。由此可見,運算符的優(yōu)先級制約著表達式的計算次序。
?、?!a || a》b 的值為1。
此式中“!”的優(yōu)先級高于“>”,而 “>”的優(yōu)先級高于“||”,故先計算“!a”,其值為0,再計算“a》b”,其值為1,最后計算“0||1”,值為1。
3.4.3 條件運算符與條件表達式
條件運算符是C語言中唯一具的三目運算符,就是說它有三個運算對象。條件運算符的形式是“? :”由它構成的表達式稱為條件表達式。其形式為:
表達式1 ? 表達式2 : 表達式3
條件運算符的“?”個“:”總是成對出現(xiàn)的。條件表達式的運算功能是:先計算表達式1的值,若值為非0,則計算表達式2的值,并將表達式2的值作為整個條件表達式的結果;若表達式1的值為0,則計算表達式3的值,并將表達式2的值作為整個條件表達式的結果。例如有以下條件表達式:
?。╝》b)?a+b:a-b
當a=8,b=4,c=3時,求解條件表達式的過程如下:
先計算關系式a》b,結果為1,因其值為真,則計算a+b的結果為12,這個12就是整個條件表達式的結果。請?zhí)貏e注意,此時不再計算表達式a-b了。如果關系式a》b的結果為0,就不再計算表達式a+b了。這一點在應用中很重要。
條件表達式的優(yōu)先級高于賦值運算,但低于所有關系運算、邏輯運算和算術運算。其結合性是自右向左結合,當多個條件表達式嵌套使用時,每個后續(xù)的“:”總與前面最近的、沒有配對的“?”相聯(lián)系。例如在條件表達式“a》0 ? a/b:a《0 ? a+b:a-b”中,出現(xiàn)兩個條件表達式的嵌套,求解這個表達式時先計算后面一個條件表達式“a《0 ? a+b:a-b”的值,然后再與前面的“a》0 ? a/b:”組合。
使用條件表達式可以使程序簡潔明了。例如,賦值語句“z=(a》b)?a:b ”中使用了條件表達式,很簡潔地表示了判斷變量a與b的最大值并賦給變量z的功能。所以,使用條件表達式可以簡化程序
例3-8:定義高等數(shù)學中常用的符號函數(shù)sign的數(shù)學定義如下。
對應的C函數(shù)定義如下:
/* L3_8.C */
double sign(double x)
{ return x》0 ? 1:(x==0 ? 0:-1);
}
評論