1、多重if
前面討論了簡(jiǎn)單的條件結(jié)構(gòu)。條件結(jié)構(gòu)用于實(shí)現(xiàn)需要判斷的情況,它以一個(gè)邏輯條件成立與否為條件,決定一個(gè)操作的執(zhí)行或不執(zhí)行,或執(zhí)行兩個(gè)不同的操作。前面介紹的if和if-else結(jié)構(gòu),它是C語(yǔ)言中實(shí)現(xiàn)判斷的兩種方法,可以實(shí)現(xiàn)一個(gè)邏輯條件的判斷。在某些情況下,需要檢查多重條件,解決這種情況可用多重if、嵌套if或switch結(jié)構(gòu)來(lái)解決,本節(jié)將具體介紹多重if結(jié)構(gòu)。
C語(yǔ)言的多重if語(yǔ)句是一種條件控制結(jié)構(gòu),它允許在代碼中檢查多個(gè)條件,并根據(jù)條件的結(jié)果執(zhí)行相應(yīng)的操作。多重if結(jié)構(gòu)的語(yǔ)法如下:
if(< 條件1 >)
< 語(yǔ)句塊 >
else if(< 條件2 >)
< 語(yǔ)句塊 >
else if(< 條件3 >)
< 語(yǔ)句塊 >
……
else
< 語(yǔ)句塊 >
這種結(jié)構(gòu)是從上到下逐個(gè)對(duì)條件進(jìn)行判斷,一旦發(fā)現(xiàn)條件滿足就執(zhí)行與該條件相關(guān)的語(yǔ)句,并跳過(guò)其他的條件判斷;若沒(méi)有一個(gè)條件滿足,則執(zhí)行最后一個(gè)else后的語(yǔ)句塊;如果沒(méi)有最后的else語(yǔ)句,則不執(zhí)行任何操作,執(zhí)行該結(jié)構(gòu)后面的語(yǔ)句。同樣,語(yǔ)句塊中包含多條語(yǔ)句時(shí),必須使用“{”和“}”把多條語(yǔ)句括起來(lái)。
下面是一段示例代碼:
#include
int main() {
int x = 10;
if (x > 0) {
if (x > 5) {
printf("x is greater than 0 and 5n");
}
}
return 0;
}
在這個(gè)例子中,我們首先定義了一個(gè)整數(shù)變量x并將其初始化為10。接下來(lái),我們使用兩個(gè)嵌套的if語(yǔ)句來(lái)檢查x的值。首先,外部if語(yǔ)句檢查x是否大于0。如果這個(gè)條件為真,那么它就會(huì)執(zhí)行內(nèi)部if語(yǔ)句,檢查x是否大于5。如果這個(gè)條件也為真,那么就會(huì)打印一條消息表示x同時(shí)大于0和5。
需要注意的是,在C語(yǔ)言中,if語(yǔ)句后面的條件必須用括號(hào)括起來(lái),并且每個(gè)條件后面都必須是花括號(hào)用于包含條件為真時(shí)要執(zhí)行的代碼塊。如果條件為假,則跳過(guò)該代碼塊并繼續(xù)執(zhí)行下一條if語(yǔ)句,可以根據(jù)需要嵌套多個(gè)if語(yǔ)句來(lái)檢查多個(gè)條件。但是要注意避免嵌套層次過(guò)多,否則會(huì)使代碼難以閱讀和維護(hù)。
2、嵌套if結(jié)構(gòu)
嵌套IF是一個(gè)條件語(yǔ)句的結(jié)構(gòu),它用于在編程或邏輯過(guò)程中進(jìn)行多層級(jí)的條件判斷。它根據(jù)一系列的條件表達(dá)式進(jìn)行決策,根據(jù)不同的情況執(zhí)行不同的操作。
嵌套IF語(yǔ)句由兩個(gè)或更多的IF語(yǔ)句組成,每個(gè)IF語(yǔ)句中都有一個(gè)或多個(gè)條件表達(dá)式作為判斷條件。當(dāng)且僅當(dāng)每個(gè)IF語(yǔ)句中的條件都為真時(shí),該嵌套IF語(yǔ)句才執(zhí)行其內(nèi)部的語(yǔ)句塊。
舉個(gè)例子,假設(shè)我們要寫一個(gè)程序,該程序根據(jù)用戶輸入的成績(jī),判斷學(xué)生是否及格和優(yōu)秀。我們可以使用嵌套IF語(yǔ)句來(lái)實(shí)現(xiàn)這個(gè)功能,偽代碼如下:
IF score >= 60 THEN
IF score >= 80 THEN
PRINT "The student is excellent."
ELSE
PRINT "The student is pass."
END IF
ELSE
PRINT "The student is failed."
END IF
在上面的例子中,外層IF語(yǔ)句判斷學(xué)生是否及格,內(nèi)層IF語(yǔ)句判斷學(xué)生是否優(yōu)秀。如果學(xué)生及格,就會(huì)進(jìn)入內(nèi)層IF語(yǔ)句中進(jìn)行優(yōu)秀與否的判斷;如果學(xué)生不及格,就不會(huì)進(jìn)入內(nèi)層IF語(yǔ)句,直接輸出失敗信息。通過(guò)這樣的嵌套結(jié)構(gòu),我們可以實(shí)現(xiàn)更為復(fù)雜的邏輯判斷和操作。
C語(yǔ)言嵌套if結(jié)構(gòu)的語(yǔ)法如下:
在編寫嵌套if結(jié)構(gòu)時(shí),有時(shí)會(huì)引發(fā)一些疑問(wèn),下面是一個(gè)例子:
if( x > 0 )
if( y > 1 )
z=1;
else /*這個(gè)else部分屬于哪個(gè)if?*/
z=2;
按條件語(yǔ)句的語(yǔ)法形式,上面的例子似乎有兩種可能的解釋,第一種理解:外層的if是一個(gè)沒(méi)有else部分的條件語(yǔ)句,最后的else部分屬于內(nèi)層的if語(yǔ)句;第二種理解:內(nèi)層if是一個(gè)不帶else部分的條件語(yǔ)句,最后的else屬于外層的if條件語(yǔ)句。
為了避免這種二義性,C語(yǔ)言規(guī)定,每個(gè)else部分總是屬于前面最近的那個(gè)缺少對(duì)應(yīng)的else部分if語(yǔ)句。根據(jù)這一規(guī)定,上面的例子第一種解釋是正確的,第二種解釋是不正確的。
因此,在編寫代碼時(shí),盡量把嵌入的if語(yǔ)句塊用“{”和“}”括起來(lái),避免發(fā)生理解上的二義性。如果我們真的需要寫出具有第二種意義的嵌套條件語(yǔ)句,那么,就應(yīng)該采用下面的寫法:
if( x > 0 )
{
if( y > 1 )
z=1;
}
else /*這個(gè)else部分屬于哪個(gè)if?*/
z=2;
C語(yǔ)言中的嵌套IF結(jié)構(gòu)是一種在條件語(yǔ)句中嵌套另一個(gè)條件語(yǔ)句的語(yǔ)法結(jié)構(gòu)。它允許在更復(fù)雜的情況下進(jìn)行條件控制,通過(guò)嵌套的條件語(yǔ)句可以更好地處理多個(gè)條件之間的關(guān)系。
例如:我們可以使用if語(yǔ)句來(lái)檢查一個(gè)條件是否滿足,如果滿足,則執(zhí)行一些操作。
if (condition1) {
// 執(zhí)行操作1
}
再如:我們可以嵌套另一個(gè)if語(yǔ)句來(lái)檢查另一個(gè)條件是否滿足,如果滿足,則執(zhí)行另一些操作。
if (condition1) {
// 執(zhí)行操作1
if (condition2) {
// 執(zhí)行操作2
}
}
在這個(gè)例子中,如果condition1為真,則執(zhí)行操作1,如果condition2也為真,則執(zhí)行操作2。如果任何條件不滿足,則不會(huì)執(zhí)行相應(yīng)的操作。
還可以使用嵌套if結(jié)構(gòu)來(lái)檢查多個(gè)條件,并在每個(gè)級(jí)別上執(zhí)行不同的操作。例如,以下示例展示了如何使用嵌套if結(jié)構(gòu)來(lái)檢查三個(gè)條件:
if (condition1) {
// 執(zhí)行操作1
if (condition2) {
// 執(zhí)行操作2
if (condition3) {
// 執(zhí)行操作3
}
}
}
在這個(gè)例子中,如果condition1為真,則執(zhí)行操作1。然后,如果condition2也為真,則執(zhí)行操作2。最后,如果condition3也為真,則執(zhí)行操作3。如果任何條件不滿足,則不會(huì)執(zhí)行相應(yīng)的操作。
采用嵌套結(jié)構(gòu)實(shí)質(zhì)上是為了進(jìn)行多分支選擇,判斷兩個(gè)數(shù)值的大小實(shí)際上有三種選擇,即num1=num2、num1num2,這種問(wèn)題用if-else-if結(jié)構(gòu)也可以完成,而且程序更加清晰。因此,在一般情況下,較少使用if的嵌套結(jié)構(gòu),以使程序更便于閱讀和理解。
在編寫代碼時(shí),如果要使用嵌套if結(jié)構(gòu),盡量把嵌入的if語(yǔ)句塊用“{”和“}”括起來(lái),一方面可以提高代碼的可理解性和易讀性;另一方面也可以預(yù)防因if和else匹配錯(cuò)誤,使程序發(fā)生不可預(yù)知的結(jié)果,增加程序調(diào)試難度。
3、switch結(jié)構(gòu)
在判斷過(guò)程中,有時(shí)需要判斷多個(gè)條件,需要使用多個(gè)else語(yǔ)句,而這樣會(huì)導(dǎo)致程序冗長(zhǎng)乏味,而且還會(huì)影響可讀性。C語(yǔ)言提供了另一種用于多分支選擇的switch結(jié)構(gòu)。如果程序必須進(jìn)行很多的判斷,而且所有判斷都取決于同一變量的值,則建議使用switch結(jié)構(gòu)代替一系列的if-else-if結(jié)構(gòu)。
switch結(jié)構(gòu)的語(yǔ)法如下:
switch (表達(dá)式){
case 常量表達(dá)式 1:
語(yǔ)句塊1;
break;
case 常量表達(dá)式 2:
語(yǔ)句塊2;
break;
case 常量表達(dá)式 3:
語(yǔ)句塊3;
break;
………
default:
語(yǔ)句塊n;
break;
}
其中,switch關(guān)鍵字后的表達(dá)式必須是一個(gè)整型表達(dá)式,即計(jì)算后其值為int類型,或可以轉(zhuǎn)換為int的類型,如char等。Case關(guān)鍵字后面的常量表達(dá)式要求是整型常量組成的表達(dá)式,通常是字符、數(shù)字等。
switch選擇結(jié)構(gòu)的執(zhí)行過(guò)程如下:
先計(jì)算并獲得switch后面小括號(hào)里的表達(dá)式的值,然后將計(jì)算結(jié)果順序與每個(gè)case后的常量表達(dá)式的值進(jìn)行比較,當(dāng)找到可匹配的case項(xiàng)后,執(zhí)行這個(gè)case塊中的代碼,直到遇到break語(yǔ)句,break語(yǔ)句可在執(zhí)行要求的操作之后,跳出switch語(yǔ)句。
如果任何情況都不滿足,則執(zhí)行switch末尾部分的default語(yǔ)句。該default語(yǔ)句不是必選項(xiàng),但如果不指定該語(yǔ)句,在任何情況都不滿足的情況下,整個(gè)switch結(jié)構(gòu)不做任何操作。
在使用switch結(jié)構(gòu)時(shí),應(yīng)注意以下幾點(diǎn):
在case后的常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤;
- 在case后,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái);
- 每個(gè)case子句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果;
- default語(yǔ)句可以省略。
4、條件運(yùn)算符
前面內(nèi)容介紹了條件結(jié)構(gòu),并通過(guò)示例探討了該結(jié)構(gòu)的各種不同方法。C語(yǔ)言還提供了一種稱為“條件運(yùn)算符”的特殊運(yùn)算符,它可以用于條件表達(dá)式中,以提供與if-else等同的結(jié)構(gòu)。此運(yùn)算符是?和:符號(hào)的組合,它是一個(gè)三目運(yùn)算符,即具有三個(gè)參與運(yùn)算的操作數(shù),其語(yǔ)法規(guī)則如下:
表達(dá)式1 ? 表達(dá)式2:表達(dá)式3
其中,表達(dá)式1返回1(真)或0(假),其值可以為真,也可以為假。如果表達(dá)式1的值為真,則以表達(dá)式2的值作為整個(gè)條件表達(dá)式的值。否則,以表達(dá)式3的值作為整個(gè)條件表達(dá)式的值。條件運(yùn)算符通常用于賦值語(yǔ)句中。其工作原理可以用圖片形式進(jìn)行描述,如下圖所示。
圖 4-1條件運(yùn)算符的工作原理
例如,要找出兩個(gè)數(shù)字中的最大值,可以編寫:
max = num1 > num2 ? num1:num2;
可以看出,條件運(yùn)算符需要三個(gè)操作數(shù),一個(gè)是需要被賦值的操作數(shù),另外兩個(gè)是參與比較運(yùn)算的操作數(shù)。該語(yǔ)句首先檢查表達(dá)式num1>num2,判斷其值是真還是假。如果此表達(dá)式的值為真,即num1>num2,則將num1賦值給max,否則,將num2的值賦值給max。
此運(yùn)算符等同于如下的if-else結(jié)構(gòu)
if(exprt1)
{
exprt2;
}
else
{
exprt3;
}
上述求較大值的示例等同于:
if(num1 >num2)
max = num1;
else
max=num2;
如果在條件語(yǔ)句中,只執(zhí)行單個(gè)的賦值語(yǔ)句時(shí),則可使用條件表達(dá)式來(lái)實(shí)現(xiàn)。不但使程序簡(jiǎn)潔,也提高了運(yùn)行效率。
條件運(yùn)算符練習(xí)
編程要求: 編寫一個(gè)程序,要求用戶輸入基本工資,計(jì)算稅后工資。
個(gè)人所得稅收取規(guī)定:工資大于3500元的部分將扣除個(gè)人所得稅。小于3500元的部分不扣除個(gè)人所得稅。
程序清單 sample.c
#include
int main()
{
double sal;
double rate;
printf("請(qǐng)輸入基本工資:");
//接收用戶輸入的基本工資
scanf("%lf",&sal);
rate = ( sal < 3500 ) ? 0 : 0.05;
//計(jì)算稅后工資
sal = sal - ( sal-3500 ) * rate;
printf("n 稅后工資為:%7.2f n",sal);
}
評(píng)論
查看更多