作者 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)。
轉(zhuǎn)載請(qǐng)注明出處。
原文:http://www.lxweimin.com/p/49fdba563d53
內(nèi)容簡(jiǎn)介
- 前言
- if…else 條件表達(dá)式
- 多個(gè)條件
- 一些容易犯的錯(cuò)誤
- 布爾值,條件語(yǔ)句的核心
- switch 語(yǔ)句
- 三元表達(dá)式:精簡(jiǎn)的條件語(yǔ)句
- 總結(jié)
- 第一部分第九課預(yù)告
1. 前言
上一課是 C語(yǔ)言探索之旅 | 第一部分第七課:運(yùn)算那點(diǎn)事 。
在之前的課程中,我們已經(jīng)知道世界上有很多編程語(yǔ)言,有些相互之間很類(lèi)似,其中不少都受了 C語(yǔ)言的啟發(fā)。
事實(shí)上,C語(yǔ)言是很早之前被發(fā)明的(1972 年左右),所以它也成了很多近代編程語(yǔ)言的參考模板。
我們說(shuō)編程語(yǔ)言相似,是說(shuō)他們都汲取了它們的前輩的編程基礎(chǔ)。
說(shuō)到編程基礎(chǔ),那就有很多了。其中,我們已經(jīng)學(xué)過(guò)的有:變量,運(yùn)算。這一課我們來(lái)學(xué)習(xí)條件表達(dá)式。
2. if…else 條件表達(dá)式
簡(jiǎn)單來(lái)說(shuō),條件表達(dá)式使我們可以測(cè)試變量。
打個(gè)比方,我們可以這樣說(shuō): “假如變量的值等于 7,就執(zhí)行這樣那樣的操作。”
如果 C語(yǔ)言里面不能做“等于”的判斷,那該多可惜啊。我們還要做“小于”,“大于”,“大于等于”,“小于等于”,“不等于”的判斷。
不必?fù)?dān)心,C語(yǔ)言都為你預(yù)備好了。
為了學(xué)習(xí) if…else 語(yǔ)句,我們準(zhǔn)備按照下面的順序來(lái)進(jìn)行:
- 預(yù)先需要了解的幾個(gè)符號(hào)
- if 語(yǔ)句
- else 語(yǔ)句
- else…if 語(yǔ)句
- 多個(gè)條件
- 一些需要避免的錯(cuò)誤
在我們學(xué)習(xí)寫(xiě) if…else 表達(dá)式前,須要先了解幾個(gè)基本符號(hào),這些符號(hào)對(duì)于實(shí)現(xiàn)條件判斷是必不可少的。
幾個(gè)需要了解的符號(hào)
下表列出了 C語(yǔ)言中需要用心記住的幾個(gè)符號(hào):
符號(hào) | 含義 |
---|---|
== | 等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
判斷“等于”需要兩個(gè)等號(hào)(
==
)!
一個(gè)很常見(jiàn)的錯(cuò)誤是只寫(xiě)一個(gè)等號(hào),在 C語(yǔ)言中一個(gè)等號(hào)和兩個(gè)等號(hào)具有不同的含義。一個(gè)等號(hào)表示賦值,兩個(gè)等號(hào)才是判斷是否相等。
單一的 if 語(yǔ)句
if 表示“如果,假如”。
邏輯是這樣的:
如果 變量的值是這樣
則 執(zhí)行如下操作
所以單一的 if 語(yǔ)句是這樣寫(xiě)的:
- 先寫(xiě)一個(gè) if 。
- 接著寫(xiě)一個(gè)括號(hào) (),在這個(gè)括號(hào)中寫(xiě)條件。
- 接著寫(xiě)一個(gè)大括號(hào) {},在大括號(hào)中寫(xiě)在 () 中條件為真時(shí)所要執(zhí)行的操作。
格式如下:
if (/* 條件 */)
{
// 如果條件為真,所要執(zhí)行的操作
}
我們把上面注釋的地方換成實(shí)際的代碼,寫(xiě)一個(gè)程序測(cè)試一下:
#include <stdio.h>
int main(int argc, char *argv[])
{
int age = 20;
if (age >= 18)
{
printf("你成年了!\n");
}
return 0;
}
解釋:
int age = 20;
首先定義一個(gè) int 型的變量,名字是 age(表示“年齡”),值為 20。
if 語(yǔ)句的括號(hào) () 中的條件是 age >=18
,意思是“假如 age 的值大于或等于 18”。
if 語(yǔ)句的大括號(hào) {} 中的語(yǔ)句是
printf("你成年了!\n");
就是說(shuō)當(dāng) age 的值大于或等于 18 時(shí),顯示“你成年了!”這句話(huà)。
因?yàn)槌绦蛑凶兞?age 的值是 20, 大于 18,所以條件為真,所以程序運(yùn)行起來(lái)后顯示:
你成年了!
如果我們把變量 age 的值改為 12,再次運(yùn)行程序,什么也沒(méi)顯示,因?yàn)?12 小于 18,所以 age >= 18
這個(gè)條件不為真,不執(zhí)行大括號(hào)里的 printf 語(yǔ)句。
嘮叨一下代碼的格式
假如我們將上面的代碼寫(xiě)成這樣:
if(age>=18){printf("你成年了!");}
程序也是可以正確運(yùn)行的,但是非常不推薦這樣的代碼格式!
如果我們的程序沒(méi)有空行,沒(méi)有空格,不縮進(jìn),都寫(xiě)在一行里,那將會(huì)使代碼非常難以閱讀。
所以從一開(kāi)始學(xué)習(xí)編程就請(qǐng)養(yǎng)成良好的編碼習(xí)慣,不然以后寫(xiě)一些大型程序,別人根本不知道怎么閱讀你的代碼,你也會(huì)迷失在自己的代碼里。
推薦看林銳老師的《高質(zhì)量C++/C編程指南》一書(shū),里面提到了編碼規(guī)范。
當(dāng)然,每個(gè)程序員的代碼風(fēng)格都不一樣,但是我們推薦大家遵從本系列課程中的代碼格式或者一些著名公司的代碼格式(例如 Google,阿里,等等),因?yàn)槭潜容^通用的編碼格式。
else 語(yǔ)句
現(xiàn)在你知道怎么寫(xiě)單一的 if 語(yǔ)句了。那當(dāng)條件為假時(shí),我們想要電腦也執(zhí)行對(duì)應(yīng)的操作怎么辦呢?對(duì)了,此時(shí)就輪到 else 關(guān)鍵字出場(chǎng)了。
else 表示“否則”。
但是 else 語(yǔ)句一定要跟 if 語(yǔ)句配合才能使用,獨(dú)立的 else 語(yǔ)句是不可用的!
至于關(guān)鍵字,是電腦語(yǔ)言里事先定義的,有特別意義的標(biāo)識(shí)符,有時(shí)又叫保留字,是有特別意義的變量。
C語(yǔ)言有不少關(guān)鍵字,比如 int,float,char,double,if,else,等,暫時(shí)我們不多涉及,可以去了解一下。之前關(guān)于變量的那一課,提到變量的命名時(shí),其實(shí)漏講了一點(diǎn):變量的名字不要跟關(guān)鍵字重名。
所以一個(gè)完整的 if...else 語(yǔ)句的格式是:
if (/* 條件 */)
{
// 條件為真的時(shí)候,所要執(zhí)行的操作
}
else // 如果上面 () 里的條件為假
{
// 條件為假的時(shí)候,所要執(zhí)行的操作
}
再用之前測(cè)試年齡的例子,來(lái)寫(xiě)一下實(shí)際的程序
if (age >= 18) // 如果 age 變量的值大于或等于 18
{
printf("你成年了!");
}
else // 如果age變量的值小于 18
{
printf("你還未成年,可以適當(dāng)任性!");
}
如果 age 的值大于或等于 18,則打印“你成年了!”;如果 age 的值小于 18,則打印“你還未成年,可以任性!”。
else...if 語(yǔ)句
上面我們學(xué)習(xí)了如何用單一的 if 語(yǔ)句,以及 if...else 語(yǔ)句
其實(shí)除了“假如...”(if 語(yǔ)句)和“否則...”(else 語(yǔ)句),還有else...if(“又假如”)語(yǔ)句,用于在 if 語(yǔ)句的條件不為真時(shí)對(duì)其他的情況的判斷,else…if 語(yǔ)句放在 if 語(yǔ)句和 else 語(yǔ)句之間。
邏輯是這樣的:
如果變量值為 A,則執(zhí)行 if 對(duì)應(yīng)操作;
如果變量值不為 A,而為 B,則執(zhí)行 else...if 對(duì)應(yīng)操作;
如果變量值不為 A 也不為 B,則執(zhí)行 else 對(duì)應(yīng)操作。
我們也用一個(gè)實(shí)例來(lái)看一下 if,else…if 和 else 合在一起用的情況:
if (age >= 18) // 如果 age 變量的值大于或等于 18
{
printf("你成年了 !");
}
else if (age > 2) // 如果 age 小于 18 但是大于 2
{
printf("還好你不是太年幼。");
}
else // 如果 age 小于或等于 2
{
printf("mama, guagua, blablabla..."); // 兒語(yǔ),聽(tīng)不懂
}
流程是這樣的:
首先判斷第一個(gè) if 語(yǔ)句中的括號(hào)里的表達(dá)式,如果為真,則執(zhí)行第一個(gè)大括號(hào)里的語(yǔ)句。
如果 if 的條件不為真,則接著判斷 else…if 語(yǔ)句的括號(hào)里的表達(dá)式,如果為真,則執(zhí)行對(duì)應(yīng)的大括號(hào)里面的語(yǔ)句。
如果 if 和 else…if 里的表達(dá)式都為假,則無(wú)需再判斷,直接執(zhí)行 else 語(yǔ)句的大括號(hào)里的命令。
在完整的條件語(yǔ)句塊中,else…if 和 else 語(yǔ)句不是必須的,但是必須要有一個(gè) if 語(yǔ)句。
我們可以寫(xiě)任意多的 else…if 語(yǔ)句,但是 if 語(yǔ)句和 else 語(yǔ)句則都是最多有一個(gè)。
else 后面是沒(méi)有括號(hào) () 的,但是 if 和 else…if 后面都有括號(hào),也就是都包含判斷條件,應(yīng)該不難理解吧,很合乎邏輯。
3. 多個(gè)條件
我們也可以在條件語(yǔ)句的括號(hào) () 中測(cè)試多個(gè)條件表達(dá)式。
例如,你想要測(cè)試這個(gè)人的年齡是不是介于 18 歲和 25 歲之間,就需要兩個(gè)條件表達(dá)式來(lái)判斷了。
為了達(dá)成我們的目的,我們需要用到新的符號(hào):
符號(hào) | 含義 |
---|---|
&& | 邏輯與 |
II | 邏輯或 |
! | 邏輯非 |
本來(lái)其實(shí)上表中的幾個(gè)應(yīng)該也叫做:與,或,非。但為什么叫“邏輯與”,“邏輯或”和“邏輯非”呢?
那是因?yàn)橹笪覀冞€會(huì)學(xué)到 &
,|
等符號(hào),稱(chēng)為“按位或”和“按位與”。暫時(shí)不用知道什么意思,之后會(huì)學(xué)到。
邏輯與
為了做邏輯與判斷,我們則要用到兩個(gè) &
符號(hào)。這個(gè)符號(hào)在美式鍵盤(pán)上需要按下 Shift + 數(shù)字鍵 7。
如果我們要做上面提到過(guò)的年齡的判斷,則需要用邏輯與:
if (age > 18 && age < 25)
兩個(gè) & 號(hào)連在一起表示邏輯與,就是說(shuō)當(dāng)兩邊的表達(dá)式都為真時(shí),括號(hào)中的整個(gè)表達(dá)式才為真,所以這里只有當(dāng) age 大于 18 并且小于 25 的情況下,括號(hào)里的表達(dá)式才為真。
邏輯或
為了做邏輯或判斷,我們則要用到兩個(gè) |
符號(hào)。這個(gè)符號(hào)在美式鍵盤(pán)上需要按下 Shift + \
鍵。
邏輯或只要其兩邊的兩個(gè)表達(dá)式有一個(gè)為真,整個(gè)表達(dá)式就為真。
假設(shè)我們現(xiàn)在要寫(xiě)一個(gè)程序,目的是判斷一個(gè)人是不是夠資格開(kāi)設(shè)銀行賬戶(hù)。
眾所周知,要開(kāi)一個(gè)銀行賬戶(hù),申請(qǐng)人不能太年幼(我們假定需要大于 20 歲)或者有很多錢(qián)(“有錢(qián)任性”嘛,即使是 10 歲小孩,也得讓他開(kāi)戶(hù)。開(kāi)個(gè)玩笑~)。
所以我們的程序如下:
if (age > 20 || money > 150000)
{
printf("歡迎來(lái)到**銀行 !");
}
else
{
printf("我還不夠資格,悲催啊 !");
}
所以這個(gè)測(cè)試只要申請(qǐng)人年齡大于 20 歲或者擁有超過(guò) 15 萬(wàn)現(xiàn)金時(shí),就可以讓其開(kāi)戶(hù)。
邏輯非
我們最后要看的符號(hào)是感嘆號(hào) !
,表示“取反”,加在表達(dá)式之前。這個(gè)符號(hào)在美式鍵盤(pán)上需要按下 Shift + 數(shù)字鍵 1。
如果表達(dá)式為真,那么加上感嘆號(hào)則為假;如果表達(dá)式為假,那么加上感嘆號(hào)則為真。就是跟你“唱反調(diào)”。
例如:
if (!(age < 18))
上面的表達(dá)式表示“假如已經(jīng)成年”(不小于 18 歲)。
當(dāng)然,邏輯與和邏輯或可以連用,甚至多個(gè)一起用,例如:
if ((age > 18 && age < 25) || age < 4)
4. 一些容易犯的錯(cuò)誤
== 號(hào)
不要忘了之前講過(guò)的 ==
(兩個(gè)等號(hào))是用于判斷是否相等。例如:
if (age == 18)
{
printf("你剛成年 !");
}
上例中如果錯(cuò)把 ==
(兩個(gè)等號(hào))寫(xiě)成了 =
(單個(gè)等號(hào)),那后果很?chē)?yán)重,表達(dá)式就變成 age = 18
了。單個(gè)等號(hào)是賦值,所以 age 變?yōu)?18,整個(gè)表達(dá)式的值變?yōu)?18,就起不到判斷的作用了。
一種避免這樣錯(cuò)誤的寫(xiě)法是 18 == age
,這樣如果我們漏寫(xiě)了一個(gè)等號(hào),變成 18 = age
,那編譯器會(huì)報(bào)錯(cuò),因?yàn)槌A浚ɡ?18)不能做左值。
關(guān)于左值和右值,可以去搜索網(wǎng)上的資料,簡(jiǎn)單來(lái)說(shuō),位于賦值運(yùn)算符兩側(cè)的兩個(gè)值,左邊的就叫左值,右邊的就叫右值。
多余的分號(hào)(;)
還有一個(gè)經(jīng)常會(huì)犯的錯(cuò)誤是:在 if 的括號(hào)或者 else...if 的括號(hào)后面多加了一個(gè)分號(hào),如下:
if (age == 18); // 注意這個(gè)分號(hào),本來(lái)不應(yīng)該出現(xiàn)的
{
printf("你剛好成年");
}
上面的代碼實(shí)際上相當(dāng)于
if (age == 18)
{
;
}
{
printf ("你剛好成年");
}
看到?jīng)]有,分號(hào)就相當(dāng)于 if 語(yǔ)句的大括號(hào)里的執(zhí)行語(yǔ)句,而 ;
是空語(yǔ)句,什么也不執(zhí)行。
我們?cè)认胱屍湓?age 等于 18 時(shí)執(zhí)行的 printf 語(yǔ)句卻成了一個(gè)必定會(huì)被執(zhí)行的語(yǔ)句,不論 age 的值是不是等于 18(大括號(hào)是可以把多個(gè)語(yǔ)句集合起來(lái)的分隔區(qū)域,可以拿掉大括號(hào)再來(lái)理解)。
可能有點(diǎn)暈,請(qǐng)多看幾遍代碼。
5. 布爾值,條件語(yǔ)句的核心
我們現(xiàn)在更加深入地來(lái)看 if...else 條件語(yǔ)句。事實(shí)上,條件表達(dá)式(這里指括號(hào)里的表達(dá)式)在其內(nèi)部是做了布爾值的判斷。
布爾類(lèi)型英語(yǔ)叫 boolean,是只能取“真”或者“假”的一種變量類(lèi)型。
事實(shí)上,在其他的一些編程語(yǔ)言,如 Java,C++,C# 中,本身定義了 boolean 類(lèi)型,只能有兩個(gè)值,true(表示“真”)和 false(表示“假”)。
但是 C語(yǔ)言沒(méi)有定義 boolean 類(lèi)型,怎么辦呢?
不用擔(dān)心,C語(yǔ)言把零作為假,非零的一切值都算為真。
我們可以做幾個(gè)小測(cè)試來(lái)加深理解:
if (1)
{
printf("真!");
}
else
{
printf("假!");
}
以上代碼執(zhí)行結(jié)果是顯示:
真!
我們可以把 1 換成非零的任意 int 型整數(shù):5,9,13,-2,448,等等,結(jié)果都會(huì)顯示:真!
。
if (0)
{
printf("真!");
}
else
{
printf("假!");
}
以上代碼執(zhí)行結(jié)果是顯示:
假!
所以 C語(yǔ)言中只有 0 是假,其他非零的值都被看作真。這就是 C語(yǔ)言的“布爾類(lèi)型”,因?yàn)?C語(yǔ)言沒(méi)有定義真正的布爾值類(lèi)型。
必要的一些解釋
事實(shí)上,每當(dāng)你在條件表達(dá)式里做判斷時(shí),如果表達(dá)式是真的,則整個(gè)表達(dá)式的值是 1;如果是假的,則整個(gè)表達(dá)式的值為 0。
例如:
if (age >= 18)
假如 age 的值為 25,是大于等于 18 的,那么 age >= 18
這個(gè)表達(dá)式的值為真,電腦其實(shí)會(huì)把它替換為 1。
假如 age 的值為 15,是小于 18 的,那么 age >= 18
這個(gè)表達(dá)式的值為假,電腦其實(shí)會(huì)把它替換為 0。
用變量來(lái)測(cè)試一下:
#include <stdio.h>
int main(int argc, char *argv[]) {
int age = 25;
int adult = 0;
adult = age >= 18;
printf("adult 的值是 : %d\n", adult);
return 0;
}
運(yùn)行,顯示:
adult 的值是 : 1
如果 age 為 15,則顯示:
adult 的值是 : 0
那句 adult = age >= 18;
,其實(shí)等價(jià)于 adult = (age >= 18);
。因?yàn)?>=
這個(gè)符號(hào)的優(yōu)先級(jí)比 =
符號(hào)要高。運(yùn)算符的優(yōu)先級(jí),不需要死記硬背,如果實(shí)在記不住,就加上括號(hào) () 吧。
這里的 adult 其實(shí)已經(jīng)是一個(gè) C語(yǔ)言中的“布爾值”了。
6. switch 語(yǔ)句
我們剛學(xué)的 if...else 類(lèi)型的條件語(yǔ)句是最常用的。
但是 C語(yǔ)言還給出了 if...else 語(yǔ)句的一個(gè)替代語(yǔ)句:switch 語(yǔ)句。
因?yàn)椋袝r(shí)候,當(dāng)我們的條件判斷很多時(shí),就會(huì)感覺(jué)冗余。例如下面的代碼:
if (age == 2)
{
printf("寶寶,你好 !");
}
else if (age == 6)
{
printf("小朋友,你好 !");
}
else if (age == 12)
{
printf("少年,你好 !");
}
else if (age == 16)
{
printf("青少年,你好 !");
}
else if (age == 18)
{
printf("成年人,你好 !");
}
else if (age == 67)
{
printf("爺爺,你好 !");
}
else
{
printf("對(duì)你的年齡我還沒(méi)有對(duì)應(yīng)的問(wèn)候方式。");
}
之前我們也說(shuō)過(guò),程序員(IT 工作者)是很會(huì)“偷懶”的,他們不喜歡做重復(fù)、單調(diào)的工作。
因此,為了避免重復(fù)寫(xiě)一些代碼,他們發(fā)明了新的 switch 語(yǔ)句。switch 表示“轉(zhuǎn)換,替換”。
以下展示了用 switch 語(yǔ)句改寫(xiě)的上面那個(gè) if...else 語(yǔ)句的例子:
switch (age)
{
case 2:
printf("寶寶,你好 !");
break;
case 6:
printf("小朋友,你好 !");
break;
case 12:
printf("少年,你好 !");
break;
case 16:
printf("青少年,你好 !");
break;
case 18:
printf("成年人,你好 !");
break;
case 67:
printf("爺爺,你好 !");
break;
default:
printf("對(duì)你的年齡我還沒(méi)有對(duì)應(yīng)的問(wèn)候方式。");
break;
}
switch 語(yǔ)句雖然沒(méi)有 if...else 語(yǔ)句那么常用,但是對(duì)于判斷情況很多的條件語(yǔ)句,用 switch 可以少寫(xiě)不少代碼呢,而且程序也一目了然,比較清晰。
switch 語(yǔ)句的格式
首先,寫(xiě)
switch
這個(gè)關(guān)鍵字,接著寫(xiě)一個(gè)括號(hào),括號(hào)里面是要判斷的變量。case
加上變量可能的取值,再加一個(gè)冒號(hào)(:
),再加上對(duì)應(yīng)取值時(shí)的操作,再加上一個(gè)break;
。
要注意:case 后面的值只能是整型或字符型的常量或常量表達(dá)式。
default
負(fù)責(zé)處理除了各個(gè) case 以外的情況。多個(gè) case 就相當(dāng)于 if...else 語(yǔ)句里的 if 和 else...if 。
default 相當(dāng)于 if...else 語(yǔ)句里的 else。
想想看,switch 語(yǔ)句是不是很像我們?nèi)ワ埖暧貌停?/p>
服務(wù)員拿了一個(gè)酒水單給你,上面有好多飲料,就像好多個(gè) case 后面的取值,你點(diǎn)一種飲料,服務(wù)生就去給你拿對(duì)應(yīng)的飲料,這個(gè)操作就像 case 的冒號(hào)后面的語(yǔ)句。
假如你什么都不要,說(shuō):還是給我來(lái)杯水吧,那服務(wù)生就只能給你拿一杯水了,就相當(dāng)于 default。
每個(gè) case 語(yǔ)句的結(jié)尾絕對(duì)不要忘了加 break,否則將導(dǎo)致多個(gè)分支重疊(除非有意使多個(gè)分支重疊)。
假如上例中我們少寫(xiě)了一個(gè) break;
,看看會(huì)變成怎樣:
int age = 2;
switch (age)
{
case 2:
printf("寶寶,你好 !\n");
// 這里我們沒(méi)有寫(xiě) break;
case 6:
printf("小朋友,你好 !\n");
break;
case 12:
printf("少年,你好 !");
break;
case 16:
printf("青少年,你好 !");
break;
case 18:
printf("成年人,你好 !");
break;
case 67:
printf("爺爺,你好 !");
break;
default:
printf("對(duì)你的年齡我還沒(méi)有對(duì)應(yīng)的問(wèn)候方式。");
break;
}
上面的代碼,當(dāng) age 的值為 2 的時(shí)候,顯示的內(nèi)容是:
寶寶,你好 !
小朋友,你好 !
很奇怪吧,這是因?yàn)闆](méi)有 break,程序就不跳出 switch 的大括號(hào),而繼續(xù)執(zhí)行,“穿透”了 case 6
。雖然 age 的值是 2,不等于 6,但是也執(zhí)行了 case 6
對(duì)應(yīng)的語(yǔ)句
printf("小朋友,你好 !\n");
因?yàn)?case 6
的執(zhí)行語(yǔ)句后面加了 break,所以程序執(zhí)行完
printf("小朋友,你好 !\n");
就跳出了 switch 語(yǔ)句。當(dāng)然有時(shí)候也有故意不加 break,使得多個(gè)情況做同一個(gè)操作的,例如:
switch (age)
{
case 2:
case 6:
case 12:
case 16:
printf("未成年人,你好 !");
break;
case 18:
printf("成年人,你好 !");
break;
case 67:
printf("爺爺,你好 !");
break;
default:
printf("對(duì)你的年齡我還沒(méi)有對(duì)應(yīng)的問(wèn)候方式。");
break;
}
上面的代碼,當(dāng) age 的值為 2 或 6 或 12 或 16 時(shí),都會(huì)執(zhí)行
printf("未成年人,你好 !");
是不是也很妙呢?
break 關(guān)鍵字的作用不僅于此(用于跳出 switch 語(yǔ)句),在下一課循環(huán)語(yǔ)句中我們會(huì)更深入學(xué)習(xí) break 的作用。
還有要注意的是:最后必需使用 default 分支。
雖然 default 不加其實(shí)也不會(huì)報(bào)錯(cuò),但即使程序真的不需要 default 處理,也應(yīng)該保留語(yǔ)句,這樣做并非畫(huà)蛇添足,可以避免讓人誤以為你忘了 default 處理。
要把 default 子句用于檢查真正的默認(rèn)情況。
稍微有點(diǎn)暈?沒(méi)關(guān)系,讓我們用一個(gè)更完整的例子來(lái)加深對(duì) switch 語(yǔ)句的理解:
假設(shè)你到了一個(gè)飯店,服務(wù)員給你看當(dāng)日菜單:
=== 菜單 ===
- 北京烤鴨
- 鍋包肉
- 地三鮮
- 梅菜扣肉
您的選擇是?
然后根據(jù)你的選擇做出不同反應(yīng)。應(yīng)該怎么寫(xiě)呢?希望不要看答案,先自己寫(xiě)代碼試試。
下面給出完整的示例程序:
#include <stdio.h>
int main(int argc, char *argv[])
{
int choiceMenu;
printf("=== 菜單 ===\n\n");
printf("1. 北京烤鴨\n");
printf("2. 鍋包肉\n");
printf("3. 地三鮮\n");
printf("4. 梅菜扣肉\n");
printf("\n您的選擇是 ? ");
scanf("%d", &choiceMenu);
printf("\n");
switch (choiceMenu)
{
case 1:
printf("您選了北京烤鴨。這是本店的招牌菜!");
break;
case 2:
printf("您選了鍋包肉。您是東北人吧?");
break;
case 3:
printf("您選了地三鮮。實(shí)惠好吃,就是油有點(diǎn)多.");
break;
case 4:
printf("您選了梅菜扣肉。嗯,那個(gè)味道很棒!");
break;
default:
printf("您沒(méi)有選擇餐單上的數(shù)字,難道您要餓肚子嗎 ?");
break;
}
printf("\n");
return 0;
}
以上代碼可以根據(jù)用戶(hù)輸入的不同數(shù)字做出相應(yīng)的回答。
7. 三元表達(dá)式:精簡(jiǎn)的條件語(yǔ)句
除了 if...else 語(yǔ)句和 switch 語(yǔ)句,還有第三種條件語(yǔ)句,比 switch 更少用。
我們稱(chēng)其為 三元表達(dá)式。
更確切地說(shuō),其實(shí)它就是一個(gè) if...else 的變體,只不過(guò)我們把它寫(xiě)在一行里了。
因?yàn)閷?shí)例總比長(zhǎng)篇的解釋來(lái)得更清晰易懂,所以我們用兩個(gè)例子來(lái)說(shuō)明。
這兩個(gè)例子的功能相同,只不過(guò)第一個(gè)使用 if...else 語(yǔ)句,第二個(gè)使用三元表達(dá)式。
假設(shè)我們有一個(gè)布爾類(lèi)型的變量 adult,當(dāng)“成年”時(shí)它的值為真(1),當(dāng)“未成年”時(shí)它的值為假(0)。
我們還有一個(gè) int 型變量 age,要根據(jù) adult 的值來(lái)改變 age 變量的值,下面先給出 if...else 的實(shí)現(xiàn):
if (adult)
age = 18;
else
age = 17;
注意:上例中我把 if 和 else 對(duì)應(yīng)的大括號(hào)給去掉了。在只有一句執(zhí)行語(yǔ)句的時(shí)候,去掉大括號(hào)是可以的,兩句或以上就須要加上大括號(hào)了。
不過(guò)其實(shí)按照良好的代碼習(xí)慣,應(yīng)該無(wú)論如何都加上大括號(hào)。
上例用三元表達(dá)式實(shí)現(xiàn)則是這樣:
age = (adult) ? 18 : 17;
三元表達(dá)式使我們可以只用一行代碼來(lái)根據(jù)條件改變變量的值。
問(wèn)號(hào)表示首先判斷 adult 是不是真值,如果是真,則取問(wèn)號(hào)后面的 18,將 18 賦給 age;如果為假,取冒號(hào)后面的 17,將 17 賦給 age。
這里的問(wèn)號(hào)就有點(diǎn)像 if 的條件判斷,冒號(hào)就像 else。
事實(shí)上,三元表達(dá)式并不是那么常用,因?yàn)樗鼤?huì)使代碼變得難讀,特別是當(dāng)判斷條件多且復(fù)雜的時(shí)候。
8. 總結(jié)
條件表達(dá)式是所有編程語(yǔ)言的基礎(chǔ)內(nèi)容,使電腦能夠根據(jù)變量的值做出相應(yīng)決定。
關(guān)鍵字 if,else...if,else 意味著“假如”,“又假如”,“否則”,我們可以寫(xiě)多個(gè) else...if 。
布爾變量是一種特殊的變量,它只有兩種狀態(tài):真(1)和假(0)(實(shí)際上,所有非零的整數(shù)值都被看作真),我們用整數(shù)類(lèi)型 int 來(lái)儲(chǔ)存布爾變量的值,因?yàn)?C語(yǔ)言其實(shí)沒(méi)有定義布爾變量這種類(lèi)型,而是用整數(shù)值來(lái)代表。Java、C++、C# 等語(yǔ)言就定義了布爾類(lèi)型。
switch 語(yǔ)句是 if...else 語(yǔ)句的一個(gè)可用替換。在有多個(gè) else...if 的情況下,可以使用 switch 代替 if...else 語(yǔ)句,能使代碼更易閱讀。
三元表達(dá)式(xx ? xx : xx)是精簡(jiǎn)的條件語(yǔ)句,但是我們要謹(jǐn)慎使用,因?yàn)樗鼤?huì)讓代碼不那么易讀。
9. 第一部分第九課預(yù)告
今天的課就到這里,一起加油吧!
下一課:C語(yǔ)言探索之旅 | 第一部分第九課:循環(huán)語(yǔ)句
我是 謝恩銘,公眾號(hào)「程序員聯(lián)盟」(微信號(hào):coderhub)運(yùn)營(yíng)者,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者。
熱愛(ài)生活,喜歡游泳,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」