【零基礎(chǔ)學(xué)C語言】知識(shí)總結(jié)四:if-else判斷語句和switch-case選擇語句

1、if-else判斷語句
一個(gè)基本的if語句由一個(gè)關(guān)鍵字if開頭,跟上在括號(hào)()里邊的是表示邏輯條件的表達(dá)式,然后是一對(duì)大括號(hào){}中間是若干條語句,如果條件的邏輯表達(dá)式的結(jié)果不是零,那么就執(zhí)行大括號(hào)中間的語句,否則就跳過不執(zhí)行。
if的返回值為真或假,可以用bool型變量進(jìn)行存儲(chǔ),占用一字節(jié)。
當(dāng)if的條件滿足或者不滿足的時(shí)候要執(zhí)行的語句也可以是一條或者多條if-else 語句,這時(shí)候叫嵌套的if語句,而else 總是和最接近的 if 匹配。
tips:
在if或else后面總加上{}大括號(hào),即使只有一條語句的時(shí)候。風(fēng)格就是三觀。常見的錯(cuò)誤:忘了大括號(hào),if后面的分號(hào),錯(cuò)誤使用 == 和 = ,沒有匹配或令人困惑的else
例子題目:
描述請(qǐng)判斷它能否被 3,5,7 整除,并輸出以下信息:
能同時(shí)被 3, 5, 7 整除(直接輸出3 5 7,每個(gè)數(shù)中間一個(gè)空格);
只能被其中兩個(gè)數(shù)整除(輸出兩個(gè)數(shù),小的在前,大的在后。例如:3 5或者3 7或者5 7,中間用空格分隔);
只能被其中一個(gè)數(shù)整除(輸出這個(gè)除數(shù));
不能被任何數(shù)整除,輸出小寫字符'n',不包括單引號(hào)。:
如:
輸入? 105
輸出? 3 5 7
解決答案:
2、switch-case選擇語句
switch語句是多分支選擇語句.用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)
Switch 函數(shù)圓括號(hào)的參數(shù)列表可由多對(duì)表達(dá)式和數(shù)值組成,ANSI標(biāo)準(zhǔn)允許它為任何類型.,表達(dá)式是由左至右加以計(jì)算的,而數(shù)值則會(huì)在第一個(gè)相關(guān)的表達(dá)式為 True 時(shí)返回。如果其中有部分不成對(duì),則會(huì)產(chǎn)生一個(gè)運(yùn)行錯(cuò)誤。
當(dāng)表達(dá)式的值與某一個(gè)case后面的常量表達(dá)式的值相等時(shí),就執(zhí)行此case后面的語句,若所有的case中的常量表達(dá)式的值都沒有與表達(dá)式的匹配的,就執(zhí)行default后面的語句,每一個(gè)case的常量表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)互相矛盾的現(xiàn)象,(對(duì)表達(dá)式的同一個(gè)值,有兩種或多種執(zhí)行方案),當(dāng)沒有一個(gè)表達(dá)式為 True,或者第一個(gè)為 True 的表達(dá)式的對(duì)應(yīng)值為 Null時(shí),Switch 會(huì)返回一個(gè)Null值。
switch 后面的表達(dá)式不能跟double,float,long,String ,boolean,可以接int,short,byte,char,
返回值:
switch(表達(dá)式, 值1, 結(jié)果1, 值2, 結(jié)果2, ...)
如果表達(dá)式的結(jié)果是值1,整個(gè)函數(shù)返回結(jié)果1
如果表達(dá)式的結(jié)果是值2,整個(gè)函數(shù)返回結(jié)果2
如果表達(dá)式的結(jié)果是值3,整個(gè)函數(shù)返回結(jié)果3
雖然它只返回其中的一個(gè)值,但是 Switch會(huì)計(jì)算所有的表達(dá)式。因此應(yīng)該注意到其所產(chǎn)生的副作用。例如,只要其中一個(gè)表達(dá)式導(dǎo)致被零除錯(cuò)誤,則運(yùn)行就會(huì)發(fā)生錯(cuò)誤。
例子: //請(qǐng)輸入一個(gè)數(shù)字n,然后輸出相應(yīng)的星期幾
說明:
在使用switch-case函數(shù)時(shí),在語句完畢后加上break函數(shù)表示將不再執(zhí)行下面的語句直接結(jié)束switch函數(shù)了。如果什么也不加,則是繼續(xù)執(zhí)行。
一:從“優(yōu)缺點(diǎn)”分析
if…else
優(yōu)點(diǎn):使用靈活,代碼空間小 ;
缺點(diǎn):效率低,因?yàn)?if else 必須遍歷所有的可能值;
switch…case
優(yōu)點(diǎn):代碼結(jié)構(gòu)清晰,效率高;
缺點(diǎn):
1、不夠靈活,switch 僅支持 int, char, unsigned char 等基本類型。
2、代碼空間大,因?yàn)樗商?,特別是當(dāng) case 常量分布范圍很大但實(shí)際有效值又比較少的情況,switch…case 的空間利用率將變得很低。對(duì)于 switch,實(shí)際上是根據(jù) case 最小值與最大值,維系了一段連續(xù)的內(nèi)存空間,以空間換取時(shí)間;

二:從“底層原理”分析
if…else
系統(tǒng)是自上而下逐個(gè)條件去判斷,直到符合條件,所以應(yīng)將機(jī)率大的條件置于最前面。
switch…case
switch 語句根據(jù)一個(gè)整數(shù)索引值進(jìn)行多重分支,底層采用跳轉(zhuǎn)表這種數(shù)據(jù)結(jié)構(gòu)。跳轉(zhuǎn)表是一個(gè)數(shù)組,表項(xiàng) i 對(duì)應(yīng)代碼段的地址。當(dāng) switch 索引值等于表項(xiàng) i 時(shí)采取對(duì)應(yīng)的程序操作。
可簡(jiǎn)單理解為:
執(zhí)行 switch 時(shí)生成一個(gè)長(zhǎng)度為最大 case+1 的數(shù)組,程序首先判斷 switch 變量是否大于最大 case 常量,若大于,則跳到 default 分支處理。否則取得數(shù)組索引號(hào)為 switch 變量值大小,取得數(shù)組對(duì)應(yīng)值即為相應(yīng) case 代碼塊地址,程序接著跳到此地址執(zhí)行,完成分支的跳轉(zhuǎn)。
三:從“選擇性”分析
當(dāng)選擇分支較少時(shí),選用 if else 比 switch…case 的效率要高。一般 3個(gè) 以內(nèi)的分支我會(huì)用 if…else 結(jié)構(gòu),大于3個(gè)的分支我都會(huì)用 switch…case,個(gè)人習(xí)慣,這樣結(jié)構(gòu)看著舒服。
當(dāng)選擇分支較多時(shí),選用switch…case結(jié)構(gòu)會(huì)提高程序的效率。
四:總結(jié)
switch…case 只能處理 case 為常量的情況,對(duì)非常量的情況是無能為力的。
例如 if (x > 1 && x < 100),是無法使用 switch…case 來處理的。
所以,switch 只能是在常量選擇分支時(shí)比 if…else 效率高,但是 if…else 能應(yīng)用于更多的場(chǎng)合,它比較靈活。
作者:Mr_Li_

對(duì)啦對(duì)啦!另外的話為了幫助大家,輕松,高效學(xué)習(xí)C語言/C++,我給大家分享我收集的資源,從最零基礎(chǔ)開始的教程到C語言項(xiàng)目案例,幫助大家在學(xué)習(xí)C語言的道路上披荊斬棘!可以來我粉絲群領(lǐng)取哦~

編程學(xué)習(xí)視頻分享:
