本文發(fā)布于微信公眾號(hào):三玹
上一篇講運(yùn)算符中,學(xué)習(xí)了關(guān)系運(yùn)算符和邏輯運(yùn)算符,其中都有談及程序語(yǔ)言中非常重要的結(jié)構(gòu)之一,判斷結(jié)構(gòu)。本篇文章就來(lái)講一講判斷結(jié)構(gòu)。計(jì)算機(jī)語(yǔ)言的運(yùn)行是按照順序結(jié)構(gòu)執(zhí)行的,也就是一條路走到黑。就好比一些游戲,它是有一條主線的,但是結(jié)局是多樣性的,有HE(Happy Ending,完美結(jié)局),也有BE(Bad Ending,悲劇結(jié)局)。至于走向是HE,還是BE,取決于你在游戲中的行為。而這些行為就是判斷條件,如果符合條件,那么就執(zhí)行HE,否則就執(zhí)行BE。
由此可知,判斷結(jié)構(gòu)需要具備兩個(gè)內(nèi)容:判斷條件和判斷結(jié)果。那么程序結(jié)構(gòu)有哪些類(lèi)型?
首先,先說(shuō)一個(gè)之前學(xué)過(guò)的一個(gè)運(yùn)算符,三元運(yùn)算符。它也是屬于一種判斷結(jié)構(gòu)。和其他判斷結(jié)構(gòu)不同的是,它只能表示兩種結(jié)果,要么是,要么不是。
int a = 3 > 4 ? 1 : 0;
3 > 4 是判斷條件;1 或者 0 是判斷結(jié)果。三元運(yùn)算符的結(jié)果除了冒號(hào)前后的兩個(gè)數(shù)據(jù),就不會(huì)有第三種結(jié)果了,這就存在了局限性。如果我有多個(gè)條件,不同的條件所執(zhí)行的結(jié)果也不同,顯然三元運(yùn)算符是不能滿足的。比如還是去網(wǎng)吧的例子,首先得年滿十八歲,且錢(qián)帶足了,才能進(jìn)去玩耍;如果滿十八歲,但是錢(qián)不夠,會(huì)被提醒帶夠錢(qián),然后請(qǐng)出去;如果錢(qián)帶夠了,沒(méi)滿十八歲,會(huì)被提醒未成年禁止進(jìn)入,然后請(qǐng)出去。而三元運(yùn)算符只有一個(gè)條件,兩個(gè)結(jié)果,顯然是無(wú)法完成這樣的案例。那么,我們就需要知道另外的判斷結(jié)構(gòu),if-else 結(jié)構(gòu)和 switch 結(jié)構(gòu)。
在我當(dāng)前的認(rèn)知里面,if-else 結(jié)構(gòu)是使用最多的循環(huán)結(jié)構(gòu)。(很大的原因,是因?yàn)槲蚁葘W(xué)了Python,而Python里面是沒(méi)有switch結(jié)構(gòu)的。)在 if-else 結(jié)構(gòu)中,最少都有兩種結(jié)果。其中 if 是表示如果的意思,else 是表示否則的意思。再說(shuō)一個(gè)可能會(huì)讓大家產(chǎn)生誤解的話:在 if-else 結(jié)構(gòu)中,if 是可以單獨(dú)出現(xiàn)的,else 是可有可無(wú)的,但是必須要和 if 配對(duì)。先來(lái)看一個(gè)有 if 和 else 的結(jié)構(gòu):if(1 > 3){
printf("1比3大");
}
else{
printf("3比1大");
}
其中 if 后面是要跟上條件的,而 else 后面是不用跟條件的。如果 if 后面的條件不滿足,那么自動(dòng)會(huì)找配對(duì)的 else,然后執(zhí)行里面的命令。如果沒(méi)有 else,那就直接跳過(guò),運(yùn)行下面的代碼。那么問(wèn)題來(lái)了,if 和 else 各自執(zhí)行出一個(gè)結(jié)果,那么如果 if 獨(dú)立出來(lái),不就只有一個(gè)結(jié)果。作者你是怎么敢說(shuō)至少兩個(gè)結(jié)果呢?
不!if 單獨(dú)出現(xiàn),雖然只有一個(gè)條件,執(zhí)行的部分也只有一個(gè),但是它的結(jié)果是兩個(gè)的。一個(gè)是滿足條件,執(zhí)行出的有結(jié)果;另一種是不滿足條件,不執(zhí)行出的沒(méi)有結(jié)果。有和沒(méi)有,就是兩種結(jié)果。
到這里,我們就知道了無(wú)論是只有一個(gè) if,還是 if-else 成對(duì)出現(xiàn),結(jié)果都會(huì)是兩個(gè)。但現(xiàn)在,我想要三個(gè)結(jié)果,應(yīng)該怎么做呢?
if-else 之間還有一個(gè)判斷方式,叫做否則如果,寫(xiě)作 else if。這個(gè)判斷方式在 if-else 結(jié)構(gòu)中也不是必須的,除非你有很多條件需要判斷,否則只有一個(gè)判斷條件,就用不到 else if。寫(xiě)一個(gè)去網(wǎng)吧的例子。int age = 21;
double money = 35.00;
if(age >= 18 && money >= 50.00){
printf("歡迎光臨!");
}
else if(age < 18){
printf("小朋友,長(zhǎng)大后才能進(jìn)網(wǎng)吧!");
}
else if(money < 50.00){
printf("不好意思,您的余額已經(jīng)不足!");
}
if 判斷后面的條件實(shí)際上是有 2 個(gè),一個(gè)是判斷年齡,另一個(gè)判斷金錢(qián)。通過(guò)邏輯運(yùn)算符,將兩個(gè)條件合并成一個(gè)布爾表達(dá)式。&&,與運(yùn)算符,兩個(gè)條件同時(shí)滿足時(shí),該表達(dá)式的結(jié)果為真(true),就執(zhí)行下面的內(nèi)容。反之為假(false),跳過(guò) if 包含的代碼塊(跟在條件后面的 {...} 里面的內(nèi)容)。先來(lái)看一下 switch 結(jié)構(gòu)語(yǔ)法:switch(expression){
case constant1:
statements1;
break;
case constant2:
statements2;
break;
default:
statements;
}
認(rèn)識(shí)一下語(yǔ)法中的每個(gè)單詞表示的含義:
1、switch:開(kāi)關(guān)。即這個(gè)循環(huán)結(jié)構(gòu)的開(kāi)關(guān),表示準(zhǔn)備開(kāi)始循環(huán)。2、expression:表達(dá)式。這里可以是一個(gè)變量、但類(lèi)型必須是整形、枚舉類(lèi)型或者class類(lèi)型,其中class中必須要有單獨(dú)的一個(gè)函數(shù)將其轉(zhuǎn)換為整型或者枚舉類(lèi)型。(目前就先記著,類(lèi)型可以是short、int、long的整數(shù),以及 char 的字母。)3、case:案例。相當(dāng)于 if 和 else if。4、contant:常數(shù)。該部分內(nèi)容是判斷的值,且必須和 expression 的類(lèi)型必須是一致的。如果是整型,這個(gè)值就是1、2、3;如果是字符型,這個(gè)值就是a、b、c。這個(gè)值相當(dāng)于是條件。5、statements:語(yǔ)句。這里是指滿足 case 后面的值和 expression 傳遞進(jìn)來(lái)的值是一致的,則要運(yùn)行的內(nèi)容。6、break:終止。代碼塊中碰到 break 關(guān)鍵字則結(jié)束運(yùn)行,剩余的內(nèi)容就不再運(yùn)行了。7、default:默認(rèn)。和 else 的作用是一樣的,如果以上 case 后面的值都不滿足,則執(zhí)行這一塊下面的代碼語(yǔ)句。理論上,default 放在哪里都是可以的,但是需要注意的是,如果放在 case 上面,一定要加上 break 關(guān)鍵字。一般建議是放在代碼的最后。來(lái)看一個(gè) switch 結(jié)構(gòu)的簡(jiǎn)單案例:int a;
scanf("%d", &a);
switch(a){
case 0:
printf("第一關(guān)");
case 1:
printf("第二關(guān)");
break;
default:
printf("結(jié)束游戲!");
}
當(dāng)輸入 0 給 a,這段代碼的運(yùn)行結(jié)果是:第一關(guān)第二關(guān)。
這個(gè)結(jié)果顯然不是想要的。之所會(huì)出現(xiàn)這種情況,就因?yàn)樯倭艘粋€(gè) break。switch 不會(huì)像 if-else 結(jié)構(gòu)一樣,滿足哪個(gè)條件,就執(zhí)行哪部分內(nèi)容,執(zhí)行完就直接跳出。switch 代碼塊的內(nèi)容都是一個(gè)整體,如果沒(méi)有 break 關(guān)鍵字,就會(huì)發(fā)生穿透,也就是代碼會(huì)按順序執(zhí)行下來(lái)。直到碰到了 break,或者全部運(yùn)行完,才會(huì)跳出判斷。嵌套就是套娃行為,嵌套循環(huán)就是判斷里面還有判斷。例如:去網(wǎng)吧首先要對(duì)年齡進(jìn)行判斷,符合規(guī)定才能允許進(jìn)去。進(jìn)去后還要根據(jù)你繳交的錢(qián),判斷你是開(kāi)的豪華包廂,可以玩高配電腦;還是在氛圍賊好的大堂,玩普通配置的電腦。
用 if-else 嵌套結(jié)構(gòu)實(shí)現(xiàn):int age;
double money;
if(age >= 18){
if(money > 500.00){
print("貴賓一位,豪華包廂安排起來(lái)!");
}
else{
printf("顧客一名,隨便找個(gè)機(jī)子玩玩!");
}
}
else{
printf("小朋友,長(zhǎng)大后才能進(jìn)來(lái)的!");
}
switch 結(jié)構(gòu)一般是對(duì)幾個(gè)常量進(jìn)行判斷的。就比如我們?nèi)TM取錢(qián),在登錄后會(huì)讓我們選擇查詢余額、存取款、轉(zhuǎn)賬交易等行為。我們會(huì)根據(jù)系統(tǒng)給出的提示按下相應(yīng)的數(shù)字進(jìn)入界面操作。
比如存取款是按下 2 進(jìn)入相應(yīng)界面,之后又有幾個(gè)選擇,按 1 選擇存錢(qián),按 2 選擇取錢(qián),按 0 退出。
用 switch 嵌套結(jié)構(gòu)實(shí)現(xiàn):
int a;
int b;
switch(a){
case 1:
printf("查詢余額");
break
case 2:
printf("存取款");
switch(b){
case 0:
printf("退出");
break;
case 1:
printf("存錢(qián)");
break;
case 2:
printf("取錢(qián)");
break;
}
break;
case 3:
printf("轉(zhuǎn)賬交易");
break;
}
一般情況下,建議盡可能少使用嵌套循環(huán),迫不得已要使用嵌套,三次就差不多了。如果嵌套了太多,會(huì)導(dǎo)致代碼的可讀性急劇下降,且后期的維護(hù)就變得非常困難。
最后
關(guān)于判斷結(jié)構(gòu)的介紹和使用就到這里結(jié)束了,下一篇文章我們講另外一個(gè)重要的結(jié)構(gòu)——循環(huán)結(jié)構(gòu)。對(duì)文中有疑問(wèn)或者出現(xiàn)錯(cuò)誤的地方,歡迎大家在評(píng)論區(qū)指正。
如果您覺(jué)得文章還不錯(cuò)的話,點(diǎn)贊、分享支持一下唄!