第 5 講:switch 語(yǔ)句
if
的弊端
很多時(shí)候,if
給我們的使用帶來(lái)了方便的地方,但是依舊有點(diǎn)丑的是,我們經(jīng)常會(huì)用到同一個(gè)變量分情況討論的時(shí)候,但 if
非要寫成 if
串聯(lián)的模式,這樣就很丑。于是,我們引入了新的語(yǔ)法格式:switch
語(yǔ)句。
switch
語(yǔ)句的寫法
考慮如下 if
串聯(lián)寫法。
switch
從代碼里看到,它可能比原本的寫法更臃腫了,但代碼更清晰了。按照 a
分情況討論。當(dāng) a
值為 2 的時(shí)候,執(zhí)行 c = 1
的賦值操作;其它的同理。default
用來(lái)控制其它所有情況,類似于 if
里的 else
條件后沒有其它判別情況時(shí)的執(zhí)行操作。
還需要注意的是,每一個(gè) case
語(yǔ)句的最后都有一個(gè)冒號(hào),而且在每一個(gè)部分結(jié)束的時(shí)候,都有一個(gè) break
語(yǔ)句作為結(jié)束(寫法必須是 break;
,即末尾帶分號(hào))。這是兩個(gè)需要注意的地方。
另外,標(biāo)簽之間必須書寫 break
是有道理的。如果不寫它的話,語(yǔ)句就會(huì)貫穿到下一個(gè)部分去執(zhí)行,所以不是非常好。但有些時(shí)候,我們也可以考慮使用這種特性來(lái)做事情。比如,我們獲取 12 個(gè)月每一個(gè)月多少天的時(shí)候,可以這么寫:
我們暫且不考慮閏年還是平年,2 月分情況討論的結(jié)果。這樣的寫法可以看到,像是 1、3、5、7、8、10、12 月,結(jié)果都是一樣的,所以我們完全不必在中間給它加上 break
。
當(dāng)然,default
default
調(diào)整到前面去。
比如,我們需要在記錄成績(jī)等級(jí)(A 到 F)的時(shí)候,默認(rèn)把其它情況和不及格顯示成一樣的結(jié)果(F),我們就可以這么做:
注意,switch
的小括號(hào)里的東西可以是任意一個(gè)整數(shù)數(shù)值的表達(dá)式,比如這個(gè)例子里的值就是 score / 10
,算出來(lái)等于 6。
注意,之前說過,67 和 10 都是整數(shù),所以計(jì)算的除法一定得到的結(jié)果是整數(shù),故得到的 6.7 會(huì)被截?cái)酁?6,而且截?cái)嗖皇撬纳嵛迦搿?/span>
貫穿標(biāo)簽的用法
在前文里,所有 case
語(yǔ)句 default
都被稱為標(biāo)簽。當(dāng)有些時(shí)候,我們迫不得已需要貫穿標(biāo)簽,所以出現(xiàn)了前文的合并同類項(xiàng)的類似格式。但有些時(shí)候,我們除了這種貫穿模式之外,還有一種情況可以這么用,即不寫 break
語(yǔ)句。
給定 month
數(shù)值表示當(dāng)前月份,求從 1 月份到這個(gè)月一共多少天(暫不考慮日期是多少)。那么代碼可以這么寫:
你可以思考一下,為什么這種模式可以不寫 break
語(yǔ)句。
缺乏不等模式判斷
switch
有一個(gè)缺點(diǎn)在于,它沒有不等模式的判別,比如我們希望某個(gè)數(shù)字在 0 到 60 的時(shí)候是差, 61 到 80 的時(shí)候是中等,81 到 90 的時(shí)候是良好,91 到 100 是優(yōu)秀。這個(gè)時(shí)候,我們只能使用 if
語(yǔ)句的串聯(lián),switch
很抱歉的是,在這一點(diǎn)并沒有提供對(duì)應(yīng)的語(yǔ)法判別。
if
判別里寫的是 score <= 某數(shù)值
呢?比如 61 到 80,不應(yīng)該寫成 score >= 61 && score <= 80