一、if else的不足
C語言雖然沒有限制 if else 能夠處理的分支數量,但當分支過多時,用 if else處理會不太方便,而且容易出現 if else配對出錯的情況。例如,輸入一個整數,輸出該整數對應的星期幾的中文表示。
if (day == 0)
printf("星期天\n");
else if (day == 1)
printf("星期一\n");
else if (day == 2)
printf("星期二\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else
printf("輸入錯誤。\n");
以上代碼摘自book22.c。
對於這種情況,實際開發中一般使用 switch 語句代替,請看下面的代碼。
switch (day)
{
case 0: printf("星期天\n"); break;
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;
default: printf("輸入錯誤。\n"); break;
}
先不解釋這段代碼的含義,但這樣看起來舒服多了。
二、switch語句
switch 是另外一種選擇結構的語句,用來代替簡單的、擁有多個分枝的 if else語句,基本格式如下:
switch (表達式)
{
case 整型數值1: 語句 1;
case 整型數值2: 語句 2;
......
case 整型數值n: 語句 n;
default: 語句 n+1;
}
它的執行過程是:
1)首先計算表達式的值,假設爲value。
2) 從第一個 case 開始,比較value和整型數值1,如果它們相等,就執行冒號後面的所有語句,也就是從語句1一直執行到語句n+1,而不管後面的case 是否匹配成功。
3) 如果value 和整型數值1不相等,就跳過冒號後面的語句1,繼續比較第二個case、第三個case……一旦發現和某個整型數值相等了,就會執行後面所有的語句。假設value和整型數值5相等,那麼就會從語句5一直執行到語句n+1。
4)如果直到最後一個整型數值n都沒有找到相等的值,那麼就執行 default 後的語句n+1。
需要重點強調的是,當和某個整型數值匹配成功後,會執行該分支以及後面所有分支的語句。
示例(book29.c)
/*
* 程序名:book29.c,此程序演示條件分支控制語句用switch代替多個if else
* 作者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
int main()
{
int day=0; // 定義一個整數變量用於接受鍵盤輸入的數字
printf("請輸入0-6之間的數字:"); // 提示用戶輸入
scanf("%d",&day); // 接受用戶從鍵盤輸入的數據
switch (day)
{
case 0: printf("星期天\n");
case 1: printf("星期一\n");
case 2: printf("星期二\n");
case 3: printf("星期三\n");
case 4: printf("星期四\n");
case 5: printf("星期五\n");
case 6: printf("星期六\n");
default: printf("輸入錯誤。\n");
}
}
運行效果
輸入4,發現和第四個分支匹配成功,於是就執行第四個分支以及後面的所有分支。這顯然不是我們想要的結果,我們希望只執行第四個分支,而跳過後面的其他分支。爲了達到這個目標,必須要在每個分支最後添加break;語句。
break 是C語言中的一個關鍵字,專門用於跳出 switch 語句。所謂“跳出”,是指一旦遇到break,就不再執行switch中的任何語句,包括當前分支中的語句和其他分支中的語句;也就是說,整個switch執行結束了,接着會執行整個 switch 後面的代碼。
示例(book30.c)
/*
* 程序名:book30.c,此程序演示條件分支控制語句用switch中break的用法。
* 作者:C語言技術網(www.freecplus.net) 日期:20190525
*/
#include <stdio.h>
int main()
{
int day=0; // 定義一個整數變量用於接受鍵盤輸入的數字
printf("請輸入0-6之間的數字:"); // 提示用戶輸入
scanf("%d",&day); // 接受用戶從鍵盤輸入的數據
switch (day)
{
case 0: printf("星期天\n"); break;
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;
default: printf("輸入錯誤。\n"); break;
}
}
運行效果
三、注意事項
- case後面必須是整數和字符,或者是結果爲整數和字符的表達式,但不能包含任何變量。請看下面的例子。
switch (result)
{
case 10: printf("..."); break; // 正確,整數
case 8+9: printf("..."); break; // 正確,表達式8+9==17是整數
case '5': printf("..."); break; // 正確,字符可以轉換爲整數
case 'A': printf("..."); break; // 正確,字符可以轉換爲整數
case 'A'+10: printf("..."); break; // 正確,字符可以轉換爲整數
case 3.14: printf("..."); break; // 錯誤,不能爲小數
case ii: printf("..."); break; // 錯誤,不能採用變量
}
- default 不是必須的。當沒有 default 時,如果所有case都匹配失敗,那麼就什麼都不執行。
四、課後作業
編寫示例程序,在界面上輸入數字的月份(1-12),採用switch語句,輸出對應月份的英文單詞的簡寫和全稱。
五、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!