C語言switch分支結構

一、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;
  }
}

運行效果

在這裏插入圖片描述

三、注意事項

  1. 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;    // 錯誤,不能採用變量
  }
  1. default 不是必須的。當沒有 default 時,如果所有case都匹配失敗,那麼就什麼都不執行。

四、課後作業

編寫示例程序,在界面上輸入數字的月份(1-12),採用switch語句,輸出對應月份的英文單詞的簡寫和全稱。

五、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章