三目運算符詳解
對于有些選擇分支結構,可以使用簡單的條件運算符來代替. 如:
if(a<b)
min=a;
else
min=b;
可以用下面的條件運算符來處理
min=(a<b)?a:b;
其中"(a<b)?a:b"是一個"條件表達式",它是這樣執行的: 如果a<b為真,則表達式取a值,否則取b值.
條件運算符由兩個符号組成"?“和”:", 要求有3個操作對象,是以也叫它三目運算符,它是C語言中唯一的三目運算符.
它的一般形式為:
表達式1?表達式2:表達式3;
以下是關于條件運算符的幾點說明:
(1) 表達式1是關系表達式或邏輯表達式,用于描述條件,表達式2和表達式3可以是常量,變量或表達式.如:
(x==y)?‘Y’:‘N’
(d=bb-4a*c)>=0?sqrt(d):sqrt(-d)
ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch
以上均為合法的條件表達式.
(2) 執行順序:先求解表達式1,若值為非0,表示條件為真,則求表達式2,此時表達式2的值就作為整個條件表達式的值;
若表達式1的值為0,表示條件為假,則求解表達式3,表達式3的值就是整個條件表達式的值.例如:
(a>=0)?a:-a 執行結果是a的絕對值.
(3) 在程式中,通過把條件表達式的值直接賦予某個變量.例如:
min=(a<b)?a:b 執行結果就是将條件表達式的值賦予變量min,即将a和b二者中較小的數賦給min.
(4) 條件表達式的優先級别僅高于指派運算符,而低于前面遇到過的所有運算符.
是以,min=(a<b)?a:b括号可以不要,可直接寫成,min=a<b?a:b如果有x<y?x+1:y-1等效于x<y(x+1):(y-1)而不等效于(x<y?x+1:y)-1
(5) 條件運算符的結合方向為"自右至左".
(6) 條件表達式允許嵌套,即允許條件表達式中的表達式2和表達式3又是一個條件表達式.例如:
x>0?1:x<0?-1:0
上述條件表達式中,表達式3部分又是一個條件表達式.根據條件表達式的結合性,上述條件表達式等價于:
x>0?1:(x<0?-1:0)
其作用是判斷x的符号情況.當x為正數時,該條件表達式的值為1;當x為負數時,該條件表達式的值為-1;當x為0時,該條件表達式的值為0.
(7) 條件表達式僅當if語句中内嵌的語句為指派語句(且兩個分支都給同一變量指派)時才能代替if語句.如:
if(a%2==0)
printf(“even/n”);
else
printf(“odd/n”);
不能寫成:
(a%2==0)?printf(“even/n”):printf(“odd/n”);
但可以用下面語句代替:
printf("%s/n",(a%2==0?“even”:“odd”);
該語句的作用是:若 a 為偶數,輸出 even;若 a 為奇數,輸出odd.
(8) 表達式1,表達式2,表達式3的類型可以不同.此時條件表達式的值的類型為它們中較高的類型.例如:
main() {
char c1, ch;
ch = getchar();
c1 = ch <= ‘Z’ && ch >= ‘A’ ? ’ @ ’ : ch ;
putchar(c1);
}
該程式的作用是從鍵盤輸入任意一個字元,判别它們是否大寫字母,如果是,輸出一個@;否則按原樣輸出 dot
上例中,程式第6行是關鍵語句,該語句實作輸入字元的判斷,選擇與更換工作.
其執行過程為:先由此語句中的指派号右側的條件運算符對輸入的字元進行判斷和選擇,若ch>=‘A’&&ch<='Z’成立,說明ch是大寫英文字母,
此時選@;否則仍選原字元ch,然後把選擇的結果指派給原變量ch 。