梅州網(wǎng)站建seo外鏈平臺(tái)熱狗
大家好啊,我是小象?(?òωó?)?
我的博客:Xiao Xiangζ?????
很高興見(jiàn)到大家,希望能夠和大家一起交流學(xué)習(xí),共同進(jìn)步。*
這一節(jié)內(nèi)容很多,文章字?jǐn)?shù)達(dá)到了史無(wú)前例的一萬(wàn)一,我們要來(lái)學(xué)習(xí)分支與循環(huán)結(jié)構(gòu)中的分支,學(xué)習(xí)if和switch語(yǔ)句,了解各種操作符和運(yùn)算符的使用…
文章目錄
- 開篇
- 一、if語(yǔ)句
- 1.1if
- 1.2 else
- 1.3 分支中包含多條語(yǔ)句
- 1.4 嵌套if
- 1.5 懸空else問(wèn)題
- 2.關(guān)系操作符
- 3.條件操作符
- 4.邏輯操作符:&& , || , !
- 4.1 邏輯取反運(yùn)算符 !
- 4.2 邏輯與運(yùn)算符
- 4.3 邏輯或運(yùn)算符
- 來(lái)個(gè)小練習(xí):判斷閏年
- 4.4 短路
- 二、switch 語(yǔ)句
- 5.1 if語(yǔ)句和switch語(yǔ)句的對(duì)比
- 5.2 switch語(yǔ)句中的break
- 來(lái)個(gè)練習(xí)
- 5.3 switch語(yǔ)句中的default
- 5.4 switch語(yǔ)句中的case和default的順序問(wèn)題
- 結(jié)尾
開篇
前面我們說(shuō)過(guò),C語(yǔ)言是結(jié)構(gòu)化的程序設(shè)計(jì)語(yǔ)言,這里的結(jié)構(gòu)指的是順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),C語(yǔ)言是能夠?qū)崿F(xiàn)這三種結(jié)構(gòu)的。
我們可以使用 if 、 switch 實(shí)現(xiàn)分支結(jié)構(gòu),使用 for 、 while 、 do while 實(shí)現(xiàn)循環(huán)結(jié)構(gòu)。
一、if語(yǔ)句
if語(yǔ)句是C語(yǔ)言中用于條件判斷和控制程序流程的基本結(jié)構(gòu)之一,理解并熟練使用if語(yǔ)句對(duì)于編寫有效的C語(yǔ)言程序至關(guān)重要。
1.1if
if 語(yǔ)句的語(yǔ)法形式如下:
if ( 表達(dá)式 )語(yǔ)句
表達(dá)式成立(為真),則語(yǔ)句執(zhí)行,表達(dá)式不成立(為假),則語(yǔ)句不執(zhí)行
之前在布爾類型說(shuō)過(guò),在C語(yǔ)言中,0為假,非0表示真,也就是表達(dá)式的結(jié)果如果是0,則語(yǔ)句不執(zhí)行,表達(dá)式的結(jié)果如果不是0,則語(yǔ)句執(zhí)行。
例?:輸入一個(gè)整數(shù),判斷是否為奇數(shù)
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num % 2 == 1)printf("%d 是奇數(shù)\n", num);return 0;
}
舉個(gè)例子:
1.2 else
如果一個(gè)數(shù)不是奇數(shù),那就是偶數(shù)了,如果任意一個(gè)整數(shù),我們要清楚的判斷是奇數(shù)還是偶數(shù)怎么表示呢?
這里就需要 if…else… 語(yǔ)句了,語(yǔ)法形式如下:
if ( 表達(dá)式 )語(yǔ)句1
else語(yǔ)句2
例子:判斷整數(shù)是否為偶數(shù),是的話打印偶數(shù),否則奇數(shù)
很簡(jiǎn)單:
# include <stdio.h>
int main()
{int num = 0;scanf("%d", &num); if (num % 2 == 0) 注意if第一句不能有逗號(hào)printf("%d 為偶數(shù)\n", num);elseprintf("%d 為奇數(shù)\n", num);return 0;
}
練習(xí):輸入一個(gè)年齡,>= 18歲就輸出:成年,否則就輸出:未成年
參考代碼:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
1.3 分支中包含多條語(yǔ)句
默認(rèn)在 if 和 else 語(yǔ)句中默認(rèn)都只控制一條語(yǔ)句,比如:
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18)printf("成年了\n");printf("太好了\n");return 0;}
上面的代碼,你會(huì)發(fā)現(xiàn)輸入的值不管是>=18 還是<18,“太好了” 都會(huì)打印在屏幕上。
這是因?yàn)?if 語(yǔ)句只能控制一條語(yǔ)句,就是 printf(“成年了\n”); ,if語(yǔ)句為真,則打印成年了,if語(yǔ)句為假,則不打印,對(duì)于 printf(“太好了\n”); 是獨(dú)立存在的,不管if語(yǔ)句的條件的真假,都會(huì)被執(zhí)行。那如果我們要if語(yǔ)句同時(shí)控制2條語(yǔ)句,怎么辦呢?那就要使用 { } 將代碼括起來(lái),else 后也可以跟上大括號(hào)。如下:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使?{} 控制多條語(yǔ)句-這個(gè)塊也叫:程序塊,或者復(fù)合語(yǔ)句
{
printf("成年了\n");
printf("太好了\n");
}
return 0;
}
當(dāng)然,我們還能再優(yōu)化一下:
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age >= 18) //if 后使用{} 控制多條語(yǔ)句-這個(gè)塊也叫:程序塊,或者復(fù)合語(yǔ)句{printf("成年了\n");printf("太好了\n");}else //else 后使用{}控制多條語(yǔ)句-這個(gè)塊也叫:程序塊,或者復(fù)合語(yǔ)句{printf("未成年\n");printf("心碎?\n");}return 0;
}
1.4 嵌套if
在 if else 語(yǔ)句中, else 可以與另一個(gè) if 語(yǔ)句連用,構(gòu)成多重判斷。
比如:要求輸入一個(gè)整數(shù),判斷輸入的整數(shù)是0,還是正數(shù)或者負(fù)數(shù)。請(qǐng)看如下代碼:
我們來(lái)看第一種寫法:
int main()
{int num = 0;//輸入scanf("%d", &num);if (num == 0)printf("輸入的整數(shù)是0\n");else //正數(shù)或者負(fù)數(shù){if (num > 0)printf("輸入的整數(shù)是正數(shù)\n");elseprintf("輸入的整數(shù)是負(fù)數(shù)\n");}return 0;
}
我們也可以把else和if整合到一起,形成一條語(yǔ)句,第二種寫法:
#include <stdio.h>
int main()
{int num = 0;scanf("%d", &num);if(num == 0)printf("輸?的數(shù)字是0\n");else if(num > 0) //這?的if 相當(dāng)于嵌套在else語(yǔ)句中,形成了嵌套結(jié)構(gòu)printf("輸?的數(shù)字是正數(shù)\n");elseprintf("輸?的數(shù)字是負(fù)數(shù)\n");return 0;
}
上圖中else后面的代碼就是嵌套在前面的 else 子句中的,構(gòu)成了嵌套的if語(yǔ)句。
再比·如:
輸入一個(gè)整數(shù),如果是正數(shù),再判斷是奇數(shù)還是偶數(shù),并輸出;如果不是正數(shù)則輸出:非正數(shù)。
int main()
{int num = 0;scanf("%d", &num);if (num > 0)//正數(shù){if (num % 2 == 1)printf("奇數(shù)\n");elseprintf("偶數(shù)\n");}else{printf("非正數(shù)\n");}return 0;
}
我們可以再來(lái)看一個(gè)練習(xí):
輸入一人的年齡
如果年齡<18歲,打印"少年"
如果年齡在18歲至44歲打印"青年"
如果年齡在45歲至59歲打印"中老年"
如果年齡在60歲至89歲打印"老年"
如果90歲及以上打印"老壽星"
我們給大家兩種參考做法:
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age<18)printf("少年\n");else if(age<=44)printf("青年\n");else if(age<=59)printf("中老年\n");else if(age<=89)printf("老年\n");elseprintf("老壽星\n");return 0;
}
第二種:
int main()
{int age = 0;//輸入scanf("%d", &age);if (age < 18)printf("少年\n");else //>=18{if (age <= 44)//18~44printf("青年\n");else //>=45{if (age <= 59) //45~59printf("中老年\n");else //>=60{if (age <= 89)//60~89printf("老年\n");elseprintf("老壽星\n");}}}return 0;
}
1.5 懸空else問(wèn)題
如果有多個(gè) if 和 else ,可以記住這樣一條規(guī)則
else 總是跟最接近的 if 匹配。
我們首先從下面代碼開始
#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");else printf("haha\n");return 0;
}
程序運(yùn)行的結(jié)果是啥?
很多新手,上來(lái)以判斷 a 是 0,不等于 1 ,那就執(zhí)行 else 子句,打印 haha
但是當(dāng)你去運(yùn)行代碼,輸出的結(jié)果是:啥都不輸出。
為什么呢?
這就是懸空 else 的問(wèn)題,如果有多個(gè) if 和 else ,可以記住這樣?條規(guī)則, else 總是跟最接近的 if 匹配。
上面的代碼排版,讓 else 和第?個(gè) if 語(yǔ)句對(duì)齊,讓我們以為 else 是和第一個(gè)if匹配的,當(dāng) if語(yǔ)句不成立的時(shí)候,自然想到的就是執(zhí)行 else 子句,打印 haha ,但實(shí)際上 else 是和第二個(gè) if進(jìn)行匹配的,這樣后邊的 if…else 語(yǔ)句是嵌套在第一個(gè) if 語(yǔ)句中的,如果第一個(gè) if 語(yǔ)句就不成立,嵌套 if 和 else 就沒(méi)機(jī)會(huì)執(zhí)行了,最終啥都不打印。
如果代碼改成下面這樣就更加容易理解了
#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1){if (b == 2)printf("hehe\n");elseprintf("haha\n");}return 0;
}
或者如果我們希望else確實(shí)和第一個(gè)if匹配,可以這樣修改代碼:
#include <stdio.h>
int main()
{int a = 0;int b = 2;if (a == 1){if (b == 2)printf("hehe\n");}else{printf("haha\n");}return 0;
}
只要帶上適當(dāng)?shù)拇罄ㄌ?hào),代碼的邏輯就會(huì)更加的清晰,所以大家以后在寫代碼的時(shí)候要注意括號(hào)的使用,讓代碼的可讀性更高。
2.關(guān)系操作符
在C語(yǔ)言中,關(guān)系操作符(也稱為關(guān)系運(yùn)算符)用于比較兩個(gè)值之間的關(guān)系,并根據(jù)**比較結(jié)果返回布爾值(真或假)(重要,要記住)。
C 語(yǔ)言用于比較的表達(dá)式,稱為 “關(guān)系表達(dá)式”(relational expression)**,里面使用的運(yùn)算符就稱為“關(guān)系運(yùn)算符”(relational operator),主要有下面6個(gè)。
? > 大于運(yùn)算符
? < 小于運(yùn)算符
? >= 大于等于運(yùn)算符
? <= 小于等于運(yùn)算符
? == 相等運(yùn)算符
? != 不相等運(yùn)算符
下面是一些例子。
a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;
關(guān)系表達(dá)式通常返回 0 或 1 ,表示真假
C 語(yǔ)言中, 0 表示假,所有非零值表示真,比如, 20 > 12 返回 1 , 12 > 20 返回 0 。
關(guān)系表達(dá)式常用于 if 或 while 結(jié)構(gòu)。
**
注意:相等運(yùn)算符 == 與賦值運(yùn)算符 = 是兩個(gè)不?樣的運(yùn)算符,不要混淆。有時(shí)候,可能會(huì)不小心寫出下面的代碼,它可以運(yùn)行,但很容易出現(xiàn)意料之外的結(jié)果。
**
if (x = 3) ...
上面例子中,原意是 x == 3 ,但是不小心寫成 x = 3 。這個(gè)式子表示對(duì)變量 x 賦值 3 ,它的返回值為 3 ,所以 if 判斷總是為真。
為了防止出現(xiàn)這種錯(cuò)誤,有的程序員喜歡將變量寫在等號(hào)的右邊。
if (3 == x) ...
這樣的話,如果把 == 誤寫成 = ,編譯器就會(huì)報(bào)錯(cuò)。
/* 報(bào)錯(cuò) */
if (3 = x) ...
另一個(gè)需要避免的錯(cuò)誤是:多個(gè)關(guān)系運(yùn)算符不宜連用。
舉個(gè)例子:
a < b < c
上面例子中,連續(xù)使用兩個(gè)小于運(yùn)算符。雖然這樣不會(huì)報(bào)錯(cuò),但是通常達(dá)不到想要的結(jié)果,即不是保證變量 b 的值在 a 和 c 之間。因?yàn)?mark>關(guān)系運(yùn)算符是從左到右計(jì)算,賦值是從右向左,所以實(shí)際執(zhí)行的是下面的表達(dá)式。
(a < b) < c
上面式子中, a < b 返回 0 或 1 ,所以最終是 0 或 1 與變量 k 進(jìn)行比較。如果想要判斷變量 b的值是否在 a 和 c 之間,應(yīng)該使用下面的寫法。
a < b && b < c
&&這個(gè)符后面會(huì)講到,這里是并且的意思
比如:我們輸入一個(gè)年齡,如果年齡在18歲~36歲之間,我們輸出?年。
如果我們這樣寫‘
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (18 <= age <= 36){printf("?年\n");}return 0;
}
當(dāng)我們輸入9的時(shí)候,依然輸出青年,如下圖:
這是因?yàn)?#xff0c;我們先拿18和age中存放的9比較,表達(dá)式18<=9為假, 18<=age 的結(jié)果是0,再拿0和36比較,0<=36為真,所以打印了青年 ,所以即使當(dāng)age是9的時(shí)候,也能打印青年 ,邏輯上是有問(wèn)題,這個(gè)代碼應(yīng)該怎么寫呢?
正確寫法:
#include<stdio.h>
int main()
{int age = 0;scanf("%d", &age);if (age >= 18 && age <= 36)printf("青年\n");return 0;
}
以上就是關(guān)于操作符,我們需要掌握的,剩下的只要按照字面意思理解使用就行,沒(méi)有特別注意的。
3.條件操作符
在C語(yǔ)言中,條件操作符(也稱為三元操作符)是唯一的三目操作符,它**允許根據(jù)一個(gè)條件的真假來(lái)選擇兩個(gè)值中的一個(gè)。
條件操作符需要接受三個(gè)操作數(shù)的**,形式如下:
exp1 ? exp2 : exp3
條件操作符的計(jì)算邏輯是:如果 exp1 為真, exp2 計(jì)算,計(jì)算的結(jié)果是整個(gè)表達(dá)式的結(jié)果;如果exp1 為假, exp3 計(jì)算,計(jì)算的結(jié)果是整個(gè)表達(dá)式的結(jié)果。
舉個(gè)例子:
#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d", &a);b = a > 5 ? 3 : -3;printf("%d",b);return 0;
}
練習(xí)2:使用條件表達(dá)式實(shí)現(xiàn)找兩個(gè)數(shù)中較大值。
#include <stdio.h>
int main()
{int a = 0; int b = 0;scanf("%d%d", &a, &b);//%d空格中間不用空格,但輸入的時(shí)候要用空格分隔int m = a > b ? a : b;printf("%d\n", m);return 0;
}
4.邏輯操作符:&& , || , !
在C語(yǔ)言中,邏輯操作符用于執(zhí)行邏輯運(yùn)算,它們通常用于控制流語(yǔ)句中(如if和while循環(huán)),以根據(jù)給定的條件邏輯來(lái)決定程序的執(zhí)行路徑。
邏輯運(yùn)算符提供邏輯判斷功能,用于構(gòu)建更復(fù)雜的表達(dá)式,主要有下面三個(gè)運(yùn)算符。
? ! :邏輯取反運(yùn)算符(改變單個(gè)表達(dá)式的真假)。
? && :邏輯與運(yùn)算符,就是并且的意思(兩側(cè)的表達(dá)式都為真,則為真,否則為假)。
? || :邏輯或運(yùn)算符,就是或者的意思(兩側(cè)至少有一個(gè)表達(dá)式為真,則為真,否則為假)。
注意:C語(yǔ)言中零為假,非零為真
4.1 邏輯取反運(yùn)算符 !
比如,我們有一個(gè)變量叫 flag ,如果flag為假,要做一個(gè)什么事情,就可以這樣寫代碼:
#include <stdio.h>
int main()
{int flat = 0;if (!flat)printf("xiaofeixiang\n");return 0;}
如果 flag 為真, !flag 就是假,如果 flag 為假, !flag 就是真
所以上面的代碼的意思就是 flag 為假,執(zhí)行if語(yǔ)句中的代碼。
4.2 邏輯與運(yùn)算符
有假則為假,只有兩個(gè)同時(shí)為真,才為真
&& 就是與運(yùn)算符,也是并且的意思, && 是一個(gè)雙目操作符,使用的方式是 a&&b
&& 兩邊的表達(dá)式都是真的時(shí)候,整個(gè)表達(dá)式才為真,只要有一個(gè)是假,則整個(gè)表達(dá)式為假。
舉個(gè)例子:用代碼實(shí)現(xiàn)月份屬于3月到5月,是春天
#include <stdio.h>
int main()
{int month = 0;scanf("%d", &month);if (month >= 3 && month <= 5)printf("春季\n");return 0;
}
這里表達(dá)的意思就是month既要大于等于3,又要小于等于5,必須同時(shí)滿足。
4.3 邏輯或運(yùn)算符
有真則為真,同假才為假
|| 就是或運(yùn)算符,也就是或者的意思, || 也是?個(gè)雙目操作符,使用的方式是 a || b
||兩邊的表達(dá)式只要有一個(gè)是真,整個(gè)表達(dá)式就是真,兩邊的表達(dá)式都為假的時(shí)候,才為假。
比如:我們說(shuō)一年中月份是12月或者1月或者2月是冬天,那么我們?cè)趺词褂么a體現(xiàn)呢?
#include <stdio.h>
int main()
{int year = 0;scanf("%d", &year);if (year == 12 || year == 1 || year == 2);printf("冬季\n");return 0;
}
來(lái)個(gè)小練習(xí):判斷閏年
輸入一個(gè)年份year,判斷year是否是閏年
閏年判斷的規(guī)則:
- 能被4整除并且不能被100整除是閏年
- 能被400整除是閏年
#include<stdio.h>
int main()
{int year = 0;scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)printf("%d 是閏年\n", year);elseprintf("%d 不是閏年", year);return 0;}
4.4 短路
在C語(yǔ)言中,**短路(short-circuit)**是 邏輯運(yùn)算符&&(邏輯與)和||(邏輯或) 的一個(gè)特性。這種特性使得在邏輯表達(dá)式的求值過(guò)程中,如果根據(jù)已經(jīng)求值的部分就能夠確定整個(gè)表達(dá)式的結(jié)果,那么就不再對(duì)表達(dá)式的其余部分進(jìn)行求值。
C語(yǔ)言邏輯運(yùn)算符還有一個(gè)特點(diǎn),它總是先對(duì)左側(cè)的表達(dá)式求值,再對(duì)右邊的表達(dá)式求值,這個(gè)順序是保證的。
重要:如果左邊的表達(dá)式滿足邏輯運(yùn)算符的條件,就不再對(duì)右邊的表達(dá)式求值。這種情況稱為“短路”。
如前面的代碼:
if(month >= 3 && month <= 5)
表達(dá)式中&& 的左操作數(shù)是 month >= 3 ,右操作數(shù)是 month <= 5 ,當(dāng)左操作數(shù) month >= 3 的結(jié)果是0的時(shí)候,即使不判斷 month <= 5 ,整個(gè)表達(dá)式的結(jié)果也是0(不是春季)。
所以,對(duì)于&&操作符來(lái)說(shuō),左邊操作數(shù)的結(jié)果是0的時(shí)候,右邊操作數(shù)就不再執(zhí)行,簡(jiǎn)單來(lái)說(shuō),就是**前面的條件只要不符合就不再執(zhí)行了**
對(duì)于 || 操作符是怎么樣呢?我們結(jié)合前面的代碼:
if(month == 12 || month==1 || month == 2)
如果month == 12,則不用再判斷month是否等于1或者2,整個(gè)表達(dá)式的結(jié)果也是1(是冬季)。
所以, || 操作符的左操作數(shù)的結(jié)果不為0時(shí),就需執(zhí)行右操作數(shù),簡(jiǎn)單來(lái)說(shuō),即當(dāng)前面的條件為真時(shí),就不用再看后面的條件了
像這種僅僅根據(jù)左操作數(shù)的結(jié)果就能知道整個(gè)表達(dá)式的結(jié)果,不再對(duì)右操作數(shù)進(jìn)行計(jì)算的運(yùn)算稱為短路求值。
二、switch 語(yǔ)句
除了 if 語(yǔ)句外,C語(yǔ)言還提供了 switch 語(yǔ)句來(lái)實(shí)現(xiàn)分支結(jié)構(gòu),switch語(yǔ)句是一種多分支選擇結(jié)構(gòu),它允許程序根據(jù)一個(gè)變量的值執(zhí)行不同的代碼塊。switch語(yǔ)句通常用于替代多個(gè)if-else if-else語(yǔ)句,以使代碼更加簡(jiǎn)潔和易于維護(hù)。
switch 語(yǔ)句是一種特殊形式的 if…else 結(jié)構(gòu),用于判斷條件有多個(gè)結(jié)果的情況。它把多重的 else if 改成更易用、可讀性更好的形式。
switch (expression)
{case value1: statementcase value2: statementdefault: statement
}
上面代碼中,根據(jù)表達(dá)式 expression 不同的值,執(zhí)行相應(yīng)的 case 分支。如果找不到對(duì)應(yīng)的值,就執(zhí)行 default 分支。
注:
? switch 后的 expression 必須是整型表達(dá)式
? case 后的值,必須是整形常量表達(dá)式
5.1 if語(yǔ)句和switch語(yǔ)句的對(duì)比
練習(xí):輸入任意一個(gè)整數(shù)值,計(jì)算除3之后的余數(shù)
如果使用if語(yǔ)句完成,如下:
#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);if (n % 3 == 0)printf("整除,余數(shù)為0\n");else if (n % 3 == 1)printf("余數(shù)是1\n");elseprintf("余數(shù)是2\n");return 0;
}
如果使用switch語(yǔ)句改寫,就可以是這樣的:
#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);switch (n % 3){case 0:printf("整除,余數(shù)為0\n");break;case 1:printf("余數(shù)是1\n");break;case 2:printf("余數(shù)是2\n");break;}return 0;
}
上述的代碼中,我們要注意的點(diǎn)有:
- case 和后邊的數(shù)字之間必須有空格
- 每一個(gè) case 語(yǔ)句中的代碼執(zhí)行完成后,需要加上 break ,才能跳出這個(gè)switch語(yǔ)句。
3.case 后面用的是冒號(hào),不是分號(hào)
5.2 switch語(yǔ)句中的break
前面的代碼中,如果我們?nèi)サ鬰ase語(yǔ)句中的break,會(huì)出現(xiàn)什么情況呢?
#include <stdio.h>
int main()
{int n = 0;scanf("%d", &n);switch (n % 3){case 0:printf("整除,余數(shù)為0\n");case 1:printf("余數(shù)是1\n");case 2:printf("余數(shù)是2\n");}return 0;
}
輸一組數(shù)據(jù)看看結(jié)果:
我們發(fā)現(xiàn),7除以3本來(lái)余數(shù)是1,但是我們發(fā)現(xiàn)程序運(yùn)行的結(jié)果多了一行“余數(shù)是2”的打印。
這是為什么呢?
原因是 switch 語(yǔ)句也是分支效果的,
只有在 switch 語(yǔ)句中使用 break 才能在跳出 switch 語(yǔ)句
如果某一個(gè) case 語(yǔ)句的后邊沒(méi)有 break語(yǔ)句,代碼會(huì)繼續(xù)往下執(zhí)行,有可能執(zhí)行其他 case語(yǔ)句中的代碼,直到遇到 break 語(yǔ)句或者 switch 語(yǔ)句結(jié)束。
就比如上面的代碼就執(zhí)行了 case 2 中的語(yǔ)句。
所以在 switch 語(yǔ)句中 break 語(yǔ)句是非常重要的,能實(shí)現(xiàn)真正的分支效果。
當(dāng)然, break 也不是每個(gè) case 語(yǔ)句都得有,這就得根據(jù)實(shí)際情況來(lái)看了。
來(lái)個(gè)練習(xí)
輸入?個(gè)1~7的數(shù)字,打印對(duì)應(yīng)的星期幾
例如:
輸入:1 輸出:星期一
輸入:2 輸出:星期二
輸入:3 輸出:星期三
輸入:4 輸出:星期四
輸入:5 輸出:星期五
輸入:6 輸出:星期六
輸入:7 輸出:星期天
看看操作:
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:printf("星期?\n");break;case 2:printf("星期?\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;}return 0;
}
如果需求發(fā)生變化,變?yōu)?#xff1a;
- 輸?1~5,輸出的是“工作日”;
- 輸?6~7,輸出“休息日”
那參考代碼如下:
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\(chéng)n");break;case 6:case 7:printf("休息日\(chéng)n");break;}return 0;
}
上面的練習(xí)中,我們發(fā)現(xiàn)應(yīng)該根據(jù)實(shí)際的情況,來(lái)在代碼中覺(jué)得是否使用 break ,或者在哪里使用break ,才能正確完成實(shí)際的需求。
5.3 switch語(yǔ)句中的default
在使用 switch 語(yǔ)句的時(shí)候,我們經(jīng)常可能遇到?種情況,比如 switch 后的表達(dá)式中的值無(wú)法匹配代碼中的 case 語(yǔ)句的時(shí)候,這時(shí)候要不就不做處理,要不就得在 switch 語(yǔ)句中加入default 子句。
switch (expression) {case value1: statementcase value2: statementdefault: statement
}
switch 后邊的 expression 的結(jié)果不是 value1 ,也不是 value2 的時(shí)候,就會(huì)執(zhí)行default子句。
就比如前面做的打印星期的練習(xí),如果 day 的輸入不是1~7的值,如果我們要提示:輸入錯(cuò)誤,則可以這樣完成代碼:
#include <stdio.h>
int main()
{int day = 0;scanf("%d", &day);switch (day){case 1:case 2:case 3:case 4:case 5:printf("工作日\(chéng)n");break;case 6:case 7:printf("休息日\(chéng)n");break;default:printf("輸入錯(cuò)誤\n");break;}return 0;
}
5.4 switch語(yǔ)句中的case和default的順序問(wèn)題
在 switch 語(yǔ)句中 case 子句和 default 子句有要求順序嗎? default 只能放在最后嗎?
其實(shí),
在 switch 語(yǔ)句中 case 語(yǔ)句和 default 語(yǔ)句是沒(méi)有順序要求的,只要你的順序是滿足實(shí)際需求的就可以。
不過(guò)我們**通常是把 default 子句放在最后處理的**。
結(jié)尾
這一課的內(nèi)容就到這里了,下節(jié)課繼續(xù)學(xué)習(xí)C語(yǔ)言的循環(huán)
如果內(nèi)容有什么問(wèn)題的話歡迎指正,有什么問(wèn)題也可以問(wèn)我!