C++ switch case詳解

2020-07-16 10:04:38
當程式的一部分導致另一部分執行時,會發生分支。if-else if 語句允許程式分支到幾個可能的路徑之一,當這些測試之一成立時,它執行一系列測試(通常是關係)和分支。

switch 語句是一個類似的機制,但是它測試的是整數表示式的值,然後使用該值來確定要分支到哪一組語句,以下是 switch 語句的格式:
switch (IntegerExpression)
{
    case ConstantExpression:
        //在這裡放置一個或多個語句
    case ConstantExpression:
        //在這裡放置一個或多個語句

    //case可被重複多次

    default:
        //在這裡放置一個或多個語句
}
此類語句的第一行以單詞 switch 開始,後面是括號內的整數表示式 Integer Expression。 這可以是以下兩種之一:
  1. 任何一個整型資料型別的變數(包括 char)。
  2. 其值為任何整型資料型別的表示式。

在下一行是包含幾個 case 語句的塊的開頭,每個 case 語句格式如下:
case ConstantExpression:
    //在這裡放置一個或多個語句
在單詞 case 之後是一個常數表示式 Constant Expression,它必須是整數型別,如 int 或 char,後面跟一個冒號。常數表示式可以是整型常數或整型命名常數。該表示式不能是一個變數(如 n==25),也不能是布林表示式(如 x<22)。case 語句標記一段分支語句的開頭,如果 switch 表示式的值與 case 達式的值匹配,則進入該分支。

請注意,與大多數語句塊不同,這組語句不需要大括號,且塊中每個 case 語句的表示式必須是唯一的。

在所有 case 語句後面的是可選的 default 部分。如果沒有一個 case 表示式與 switch 表示式匹配,則進入該分支。因此,它的作用就像 if-else if 語句中的結尾 else。

下面的程式顯示了一個簡單的 switch 語句的工作原理:
#include <iostream>
using namespace std;

int main()
{
    char choice;
    cout << "Enter A, B, or C: ";
    cin >> choice;
    switch (choice)
    {
        case 'A' :
            cout<< "You entered A. n";
            break;
        case 'B' :
            cout << "You entered B. n";
            break;
        case 'C' :
            cout << "You entered C.n";
            break;
        default:
            cout << "You did not enter A, B, or C!n";
    }
    return 0;
}
程式輸出結果:

Enter A, B, or C: B
You entered B.

第一個 case 是 “case 'A':”,第二個 case 是 “case 'B':”,第三個case是 “case 'C':”。如果變數 choice 包含值'A'、'B'或'C',則這些語句標記程式要分支的位置(請記住,字元變數和常數被視為整數)。如果使用者輸入除 A、B 或 C 以外的任何內容,則進入 default 預設分支。

注意,在“case 'A'”、“case 'B'”和“case 'C'”部分的末尾都有 break 語句。break 語句可以導致程式退出 switch 語句。在遇到 break 語句後,執行的下一條語句將是終止整個 switch 語句的封閉大括號後面的任何語句。

例如,在前面程式中,遇到 break 之後執行的就是第 22 行大括號之後的語句。每當要“斷開”一個 switch 語句時,就需要一個 break 語句,它不會像 if-else if 語句那樣選擇執行一組語句之後就自動退出。

case 語句顯示程式在塊中開始執行的位置,break 語句則顯示程式停止的位置。如果沒有 break 語句,則程式將執行從匹配的 case 語句到塊結尾的所有行。

注意,default 部分(如果沒有 default 則是最後一個 case 部分)不需要 break 語句。當然有些程式設計師有強迫症,喜歡也放一個以保持一致。

下面程式是上面程式的修改版,它演示了如果忽略 break 語句會發生什麼。
#include <iostream>
using namespace std;

int main()
{
    char choice;
    cout << "Enter A, B, or C: ";
    cin >> choice;
    switch (choice)
    {
        case 'A' :
            cout<< "You entered A. n";
        case 'B' :
            cout << "You entered B. n";
        case 'C' :
            cout << "You entered C.n";
        default:
            cout << "You did not enter A, B, or C!n";
    }
    return 0;
}
程式執行結果:

Enter A, B, or C: A
You entered A.
You entered B.
You entered C.
You did not enter A, B, or C!

在沒有 break 語句之後,此程式“瀆職”放行了匹配 case 表示式下面的所有語句,使它們都被執行了,但有時這樣的效果也正是程式設計師想要的,如下面所示:
#include <iostream>
using namespace std;

int main()
{
    char feedGrade;
    //Get the desired grade of feed
    cout << "Our dog food is availablein three grades:n";
    cout << "A, B, and C. Which do you want pricing for? ";
    cin >> feedGrade;
    // Find and display the price
    switch(feedGrade)
    {
        case 'a':
      case 'A':
          cout << "30 cents per pound.n";
        break;
       case 'b':
      case 'B':
          cout << "30 cents per pound.n";
        break;
      case 'c':
      case 'C':
        cout << "15 cents per pound.n";
        break;
      default :
        cout << "That is an invalid choice.n";
    }
    return 0;
}
程式輸出結果:

Our dog food is available in three grades:
A, B, and C. Which do you want pricing for? b
20 cents per pound.

當使用者輸入 a 時,相應的 case 並沒有與之相關聯的語句,也沒有 break,所以程式被放行而不是跳出,進入下一個 case,對應 A 分支。同樣的技術也應用於 b 和 C。