C語言中文網 目錄

switch語句用法注意事項,如何正確使用switch語句

相對于 if 語句而言,switch 語句可以更方便地應用于多個分支的控制流程。C89 指明,一個 switch 語句最少可以支持 257 個 case 語句,而 C99 則要求至少支持 1023 個 case 語句。然而,在實際開發環境中,為了程序的可讀性與執行效率,應該盡量減少 switch 語句中的 case 語句。

除此之外,switch 語句與 if 語句不同的是,switch 語句只能夠測試是否相等,因此,case 語句后面只能是整型或字符型的常量或常量表達式;而在 if 語句中還能夠測試關系與邏輯表達式。

不要忘記在 case 語句的結尾添加 break 語句

在 switch 語句中,每個 case 語句的結尾不要忘記添加 break 語句,否則將導致多個分支重疊。當然,除非有意使多個分支重疊,這樣可以免去 break 語句。下面我們來看一個實際示例。
#include <stdio.h>
void print_week(unsigned int day);
void print_week(unsigned int day)
{
    switch(day)
    {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
        default:
            printf("error\n");
            break;
    }
}
int main (void)
{
    print_week(3);
    return 0;
}
該程序中,在 print_week 函數中通過 switch 語句實現根據數字輸出星期名稱的功能。執行代碼,程序將輸出“Wednesday”。

現在,如果將 case 1~case 4 的 break 語句去掉,如下代碼所示,程序會輸出什么結果呢?
#include <stdio.h>
void print_week(unsigned int day);
void print_week(unsigned int day)
{
    switch(day)
    {
        case 1:
            printf("Monday\n");
        case 2:
            printf("Tuesday\n");
        case 3:
            printf("Wednesday\n");
        case 4:
            printf("Thursday\n");
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
        default:
            printf("error\n");
            break;
    }
}
int main (void)
{
    print_week(3);
    return 0;
}
運行結果為:
Wednesday
Thursday
Friday

不要忘記在 switch 語句的結尾添加 default 語句

在 switch 語句中,default 語句主要用于檢查默認情況,或者處理錯誤情況,如下面的示例代碼所示:
default:
    printf("error\n");
    break;
如果在 switch 語句中去掉 default 語句,那么 switch 語句將失去對默認情況與錯誤情況的處理能力。所以,奉勸大家不要偷懶,老老實實把每一種情況都用 case 語句來完成,而把真正對默認情況的處理交給 default 語句來完成。即使程序真的不需要 default 處理,也應該保留此語句:
default:
    break;
這樣做并非畫蛇添足,可以避免令人誤以為你忘記了 default 處理。

不要為了使用 case 語句而刻意構造一個變量

在實際編程應用中,switch 中的 case 語句應該只用于處理簡單的、容易分類的數據。如果數據并不簡單,卻為了使用 case 語句而刻意構造一個變量,那么這種變量很容易令我們得不償失。因此應該嚴格避免這種變量,并使用 if/else 結構來處理這類程序,如下面的示例代碼所示:
char ch = c[0];
switch (ch)
{
    case 'a':
        f1();
        break;
    case 'b':
        f2();
        break;
    case 'c':
        f3();
        break;
    default:
        break;
}
在上面的程序中,字符變量 ch 的值是取字符數組 c[] 的第一個字符,與 case 語句中的常量值逐一進行比較。很顯然,這種方法存在一個嚴重的問題。

例如,如果字符數組 c[] 中存儲的是“ab”字符串,那么 c[0] 會取第一個字符“a”與 case 語句進行匹配,因此會匹配到第一個 case 語句,并調用 f1() 函數。然而,如果字符數組 c[] 中存儲的是其他以字符 a 開頭的字符串(比如“abc”“abcd”“abcde”等),因為 c[0] 始終會取第一個字符的關系,因此它們同樣會匹配第一個 case 語句而調用 f1() 函數。其他的 case 語句同理。很顯然,這并不是我們想要的結果。

由此可見,當為了使用 case 語句而刻意構造一個變量時,真正的數據可能不會按照我們所希望的方式映射到 case 語句。因此,我們應該嚴格避免為了使用 case 語句而刻意構造一個變量,并使用 if/else 結構來處理這類程序,如下面的示例代碼所示:
if(0 == strcmp("ab",c))
{
    f1();
}
else if(0 == strcmp("bc",c))
{
    f2();
}
else if(0 == strcmp("cd",c))
{
    f3();
}
else
{
}

盡量將長的 switch 語句轉換為嵌套的 switch 語句

有時候,當一個 switch 語句中包括很多個 case 語句時,為了減少比較的次數,可以把這類長 switch 語句轉為嵌套 switch 語句,即把發生頻率高的 case 語句放在一個 switch 語句中,作為嵌套 switch 語句的最外層;把發生頻率相對低的 case 語句放在另一個 switch 語句中,放置于嵌套 switch 語句的內層。

例如,下面的代碼把發生頻率相對較低的情況放置于默認的 case 語句內。
void print_week(unsigned int day)
{
    switch(day)
    {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        default:
            switch(day)
            {
                case 6:
                    printf("Saturday\n");
                    break;
                case 7:
                    printf("Sunday\n");
                    break;
                default:
                    printf("error\n");
                    break;
            }
    }
}
在上面的代碼中,假設 case 6 與 case 7 不經常發生,因此將它們放置到嵌套 switch 語句的最內層。從表面看,雖然這樣損失了程序的一定可讀性,但當 case 語句很多,并且確實有些 case 語句發生的頻率比較低時,這種解決方案還是可取的。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo