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