Objective-C 快速導覽 - switch 選擇結構

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




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


如下列程式,假設有一位元編碼儲存在陣列 (array) data[] 之中,程式累計 0 與 1 各自出現的數目
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    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;
        }
    }
    
    NSLog(@"資料中有%d個0,%d個1....\n", zeroCount, oneCount);

    [pool drain];
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://pydoing.blogspot.com/
   檔名:switch01.m
   功能:Objective-c 程式範例
   作者:張凱慶
   時間:西元 2013 年 4 月 */


編譯執行,結果如下



第 12 行
switch (data[i]) {


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


由於情況只有 0 與 1 ,因此上列程式只用 0 與 1 兩個位標。另外第 15 及第 19 行都有
break;


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


以下程式計算字串中母音字母出現的次數,若非母音字母則用 default 位標執行另外的計算
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    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++;
    } 
    
    NSLog(@"\na: %d, e: %d, i: %d, o: %d, u: %d, other: %d", aV, eV, iV, oV, uV, other);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
   http://pydoing.blogspot.com/
   檔名:switchvowel.m
   功能:Objective-c 程式範例
   作者:張凱慶
   時間:西元 2013 年 4 月 */


編譯執行,結果如下



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


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


中英文術語對照
控制結構control structure
關鍵字keyword
陳述statement
運算式expression
陣列array
迴圈loop


您可以繼續參考
控制結構
型態轉換


相關目錄
Objective-C 快速導覽
Objective-C 教材
首頁



參考資料
Programming with Objective-C: About Objective-C
Programming with Objective-C: Working with Objects

沒有留言: