4.4 switch語句
從上面的介紹可知,利用嵌套的if語句結構可以處理實際問題中常常遇到的多分支選擇結構。但同時也應看到如果分支較多,則嵌套的if語句層數較多,程序冗長,可讀性降低,而且編寫程序容易出錯。對此C語言提供的switch語句,可以很方便、直接地處理多分支選擇。switch語句被稱為多分支選擇語句,也稱為開關語句,其一般形式為:
switch(表達式)
{
case常量表達式1: 語句1;
case常量表達式2: 語句2;
……
case常量表達式n: 語句n;
default: 語句n+1;
}
該語句的語義為,程序執行時首先計算表達式的值,并由第一個case分支開始將其逐個與case后的常量表達式值作比較,當表達式的值與某個case分支的常量表達式值相等時,則執行case后的內嵌語句,然后不再進行判斷,繼續執行后面case分支的內嵌語句,直到遇到break語句(關于break語句,將在第5章介紹)或者遇到語句的右花括號為止。當表達式的值與所有case分支的常量表達式均不相同時,則執行default后的內嵌語句。
【例4.8】 編寫程序,輸入1~10之間的任意一個數字,輸出相應的英文單詞。
分析:定義一個整型變量a接收從鍵盤輸入的數字,并作為switch語句的表達式,設計10個case子句,其常量表達式分別為1~10,對應的case子句為輸出相應的英文單詞的語句。程序代碼如下:
#include"stdio.h"
main()
{
int a;
printf("input integer number:");
scanf("%d",&a);
switch(a)
{
case 1:printf("One\n");
case 2:printf("Two\n");
case 3:printf("Three\n");
case 4:printf("Four\n");
case 5:printf("Frive\n");
case 6:printf("Six\n");
case 7:printf("Seven\n");
case 8:printf("Eight\n");
case 9:printf("Nine\n");
case 10:printf("Ten\n");
default:printf("error\n");
}
}
程序運行結果如下:
輸入:8
輸出:Eight
Nine
Ten
error
本來要求輸入一個數字,只輸出對應的英文單詞,但是當輸入8之后,卻執行了case 8及以后的所有內嵌語句,輸出了Eight及以后的所有單詞,這當然是不希望的。為什么會出現這種情況呢? 這恰恰說明了switch語句的一個特點。在switch語句中,case 常量表達式只相當于一個語句標號,表達式的值和某個語句標號(常量表達式的值)相等則轉向該標號執行其后的內嵌語句,但不能在執行完該標號的內嵌語句后自動跳出整個switch結構,所以出現了繼續執行所有后面case內嵌語句的情況。這是與前面介紹的if語句完全不同的,應特別注意。為了避免上述情況的發生,可以使用C語言提供的break語句適時跳出switch結構。break語句只有關鍵字break,沒有參數,在第5章將詳細介紹。修改例4.9的程序,在每一個case語句之后增加break語句,使之執行每一個case子句后均可跳出switch結構,從而避免輸出不應有的結果。程序代碼如下:
#include"stdio.h"
main()
{
int a;
printf("input integer number:");
scanf("%d",&a);
switch(a)
{
case 1:printf("One\n");break;
case 2:printf("Two\n");break;
case 3:printf("Three\n");break;
case 4:printf("Four\n");break;
case 5:printf("Frive\n");break;
case 6:printf("Six\n");break;
case 7:printf("Seven\n");break;
case 8:printf("Eight\n");break;
case 9:printf("Nine\n");break;
case 10:printf("Ten\n");break;
default:printf("error\n");
}
}
在使用switch語句時還應該注意以下幾點:
① 在case后的各個常量表達式的值不能相同,否則會出現錯誤。
② 在case后,允許有多條語句,可以不用“{ }”括起來,也允許沒有語句。
③ 各case和default子句的先后順序可以變動,而不會影響程序執行結果,且default子句可以省略不用。
④ 從語法上來說,switch語句也是一條完整的控制語句。
⑤ break語句的作用是使控制立即跳出switch結構,恰當地使用break語句,可以控制一段程序的執行入口和出口點。例如:
switch(i)
{
case 1: 語句1;
case 2: 語句2;break;
case 3: 語句3;
case 4: 語句4;
case 5: 語句5;break;
defau1t: 語句6;
}
當i=1時,從語句1執行到語句2;i=2時,執行語句2;i=3時,從語句3執行到語句5;i=4時,從語句4執行到語句5;i=5時,執行語句5;i為其他值時,執行語句6。所以根據i的值,可以實現從不同的入口開始執行一段代碼后從不同的出口退出,以滿足程序的要求。