C++ 中的 switch 語句

Suraj P 2023年10月12日
  1. C++ 中的 switch-case 語句
  2. 在 C++ 中使用 Switch Case 的規則和屬性
  3. C++ 中 switch 語句和 if-else 語句之間的區別
C++ 中的 switch 語句

在本文中,我們將瞭解 C++ 中的 switch 語句及其特殊屬性。

C++ 中的 switch-case 語句

switch-case 根據其值評估表示式,並針對 case 語句中存在的常量值列表進行測試,以根據不同的 case 執行不同的操作。

if-else 一樣,switch 語句是控制流語句,因為它們可以改變程式的一般流程,因為它允許表示式或變數通過 多路分支 控制流程。

語法:

switch(variable / expression)
{
case constant-expression 1:
  statements;

case constant-expression 2:
  statements;
}

示例程式碼:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";

    case 2:
      cout << "Tuesday\n";

    case 3:
      cout << "Wednesday\n";

    case 4:
      cout << "Thursday\n";

    case 5:
      cout << "Friday\n";

    case 6:
      cout << "Saturday\n";

    case 7:
      cout << "Sunday\n";
  }
}

輸出:

Wednesday
Thursday
Friday
Saturday
Sunday

變數 day = 3 的值被評估並與相應的 case 語句 case 3 匹配,並且它包含的語句"Wednesday"被列印,但我們仍然得到剩餘的字串,因為一旦控制轉到 case 3,從那裡到 switch 塊結束的所有內容,所有語句都被列印/評估。

這就是為什麼要列印來自 cases 4,5,6,7 的語句的原因。

為了避免這種情況,我們必須修改我們的 switch-case 結構。

語法 - 修改 switch-case

switch(variable / expression)
{
case constant-expression 1:
  statements;
  break; (optional)

case constant-expression 2:
  statements;
  break; (optional)

default:  //default statment optional
  statements;
  break;
}

break 關鍵字用於停止 switch 塊的執行並退出它。一旦條件/案例匹配,我們評估語句,中斷流程,並從 switch 塊中出來。

default 關鍵字指定在沒有大小寫匹配時執行的語句。

示例程式碼:

#include <iostream>
using namespace std;

int main() {
  int day = 3;
  switch (day) {
    case 1:
      cout << "Monday\n";
      break;
    case 2:
      cout << "Tuesday\n";
      break;

    case 3:
      cout << "Wednesday\n";
      break;
    case 4:
      cout << "Thursday\n";
      break;

    case 5:
      cout << "Friday\n";
      break;

    case 6:
      cout << "Saturday\n";
      break;

    case 7:
      cout << "Sunday\n";
      break;

    default:
      cout << "Wrong option entereted\n";
      break;
  }
}

輸出:

Wednesday

在下一個示例中,我們還可以使用 char 進行切換。我們將看到一個檢查字元是母音還是子音的示例程式碼。

示例程式碼:

#include <iostream>
using namespace std;

int main() {
  char x = 'u';

  switch (x) {
    case 'a':
      cout << "Vowel";
      break;
    case 'e':
      cout << "Vowel";
      break;
    case 'i':
      cout << "Vowel";
      break;
    case 'o':
      cout << "Vowel";
      break;
    case 'u':
      cout << "Vowel";
      break;

    default:
      cout << "Consonant";
      break;
  }
}

輸出:

Vowel

在 C++ 中使用 Switch Case 的規則和屬性

  1. switch 語句中使用的表示式應該是 constant value。否則將被視為無效。

    在這裡我們可以看到,只要為它們分配了固定值,就可以使用常量和變數表示式。

    switch(1+2+3*4+5)
    switch(a+b+c*d)
    
  2. defaultbreak 是可選的。即使 switch-case 沒有它們,它也可以毫無問題地執行。

  3. switch 語句的巢狀是有效的,意味著我們可以在另一個語句中切換語句。雖然這不是一個好的程式設計習慣,但我們仍然可以利用它們。

    #include <iostream>
    using namespace std;
    
    int main() {
      int ID = 1234;
      int password = 000;
    
      switch (ID) {
        case 1234:
          cout << "checking info......\n";
    
          switch (password) {
            case 000:
              cout << "Login successful\n";
              break;
            default:
              cout << "Password don't match please check it\n";
              break;
          }
    
          break;
    
        default:
          printf("incorrect ID");
          break;
      }
    }
    

    輸出:

    checking info......
    Login successful
    
  4. switch 語句中使用的表示式必須是整數型別,這意味著它應該是 intcharenum。否則我們會得到一個編譯錯誤。

    #include <iostream>
    using namespace std;
    
    int main() {
      float x = 12.34;
    
      switch (x) {
        case 1.1:
          cout << "Yes";
          break;
        case 12.34:
          cout << "NO";
          break;
      }
    }
    

輸出:

```text
[Error] switch quantity not an integer
```
  1. default 塊可以在 switch 內,但僅在沒有匹配的情況下執行。

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        default:
          cout << "It's not 1 or 2";
          break;
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
      }
    }
    

    輸出:

    It's not 1 or 2
    
  2. case 上面寫的語句永遠不會執行。一旦 switch 語句被評估,控制轉移到匹配的情況或 default 塊(如果存在)。

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        cout << "Tony is Iron Man\n";
        case 1:
          cout << "It's a 1";
          break;
        case 2:
          cout << "It's a 2";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

輸出:

```text
It's not 1 or 2
```
  1. 不允許重複的案例標籤。如果給出,我們將得到一個編譯錯誤。

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 45;
      switch (x) {
        case 45:
          cout << "Iron Man";
          break;
    
        case 40 + 5:
          cout << "tony stark";
          break;
    
        default:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    輸出:

    [Error] duplicate case value
    
  2. 案例標籤也應該是不變的。否則,我們會得到一個編譯錯誤。

    #include <iostream>
    using namespace std;
    
    int main() {
      int x = 2;
      int arr[] = {100, 200, 300};
      switch (x) {
        case arr[0]:
          cout << "Iron Man";
          break;
    
        case arr[1]:
          cout << "tony stark";
          break;
    
        case arr[2]:
          cout << "It's not 1 or 2";
          break;
      }
    }
    

    輸出:

    [Error] the value of 'arr' is not usable in a constant expression
    
  3. 我們可以對執行相同任務的所有 case 語句進行分組。

    #include <iostream>
    using namespace std;
    
    int main() {
      char x = 'A';
    
      switch (x) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
          cout << "Vowel";
          break;
    
        default:
          cout << "consonant";
      }
    }
    

C++ 中 switch 語句和 if-else 語句之間的區別

當我們有許多 if-else 語句時,編譯器必須檢查所有語句,直到找到有效匹配。而在 switch-case 中,如果我們只想執行某個程式碼塊,並且滿足某個條件,則使用語句。

以下示例檢查字元是否為字母表。

示例程式碼:

char x = '+';

if (x == 'A')
....

    else if (x == 'B')...

    else if (x == 'C')...

    ....else cout
    << "Not an alphabet"

由於+ 不是字母表,到達最後一個需要更長的時間,因為它必須首先檢查每個先前的條件。如果使用 switch-case 實現,當案例/條件的數量非常大時,它會使用查詢表或雜湊列表。

這意味著所有專案都獲得相同的訪問時間。所以,當我們有很多 cases/conditions 時,switchif-else 更受歡迎,因為它更快。

作者: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub

相關文章 - C++ Statement