C 速查手冊

5.2 switch 選擇

C 語言亦有提供多重選擇的控制結構,使用關鍵字 (keyword) switchcasedefault 的陳述,形式如下

switch (condition)
  case c:
   ...
   ...
   ...
  default:

簡單來說, switch 後頭接一小括弧,小括弧內為一常數運算式 (expression) ,計算出常數值若與其後 case 的位標相符,就會執行該 case 的陳述。 case 的位標也可以是常數運算式,不過通常直接用常數值。

如下列程式,假設有一位元編碼儲存在陣列 data[] 之中,程式累計 01 各自出現的數目

#include <stdio.h>

int main(void)
{
    int data[] = {1, 0 ,0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1};
    int oneCount = 0;
    int zeroCount = 0;
    int i;
    
    for (i = 0; i <= 16; i++) {
        switch (data[i]) {
            case 0:
                zeroCount++;
                break;
            
            case 1:
                oneCount++;
                break;
        }
    }
    
    printf("資料中有%d個0,%d個1....\n", zeroCount, oneCount); 
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:switch01.c
    功能:利用 switch 處理陣列中的位元編碼
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc switch01.c
$ a.out
資料中有7個0,9個1....
$

先看到 switch 出現的那一行

switch (data[i]) {

data[i] 會取得該陣列的第 i 個元素值,此為常數運算式。

由於情況只有 01 ,因此上列程式只用 01 兩個位標。另外注意到 case 底下都有縮排的

break;

關鍵字 break 是用來暫時中斷程式的執行,放在迴圈 (loop) 內遇到 break 就會跳出迴圈,而在 switch 裡頭的位標後面則是可以不讓程式繼續往下檢查其他的位標,因為檢查到相符的位標,程式即可暫停,若是沒有用 break ,程式會持續執行到右大括弧 } ,也就是 switch 陳述結束的地方,這樣容易增加額外的程式執行時間。

以下程式計算字串中母音字母出現的次數,若非母音字母則用 default 位標執行另外的計算

#include <stdio.h>

int main(void)
{
    char saying[] = "Never put off till tomorrow what you can do today."; 
    int aV, eV, iV, oV, uV, other, i;
    aV = eV = iV = oV = uV = other = i = 0; 
    
    while (saying[i] != '\0') {
        switch(saying[i]) {
            case 'A':
            case 'a':
                aV++;
                break;
                
            case 'E':
            case 'e':
                eV++;
                break;
                
            case 'I':
            case 'i':
                iV++;
               break;
            
            case 'O': 
            case 'o':
                oV++;
                break;
            
            case 'U':
            case 'u':
                uV++;
                break;
                
            default:
                other++;
                break;
        }
        
        i++;
    } 
    
    printf("a: %d, e: %d, i: %d, o: %d, u: %d, other: %d\n", aV, eV, iV, oV, uV, other);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:switchvowel.c
    功能:利用 switch 累計字串中出現的母音字母次數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc switchvowel.c
$ a.out
a: 3, e: 2, i: 1, o: 7, u: 2, other: 35
$

default 位標下的 break 其實可有可無,但習慣上每個 case 都有給一個 break ,所以 default 後加上 break 只是相對看起來整齊而已。

case 的位標或 default 的出現順序並沒有強制規定,但習慣上, default 會放在最後面。

上一頁 5.1 if 選擇
回 C 速查手冊首頁
下一頁 5.3 for 迴圈
回 C 教材首頁
回程式語言教材首頁