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 的規則和屬性
- 
switch語句中使用的表示式應該是constant value。否則將被視為無效。在這裡我們可以看到,只要為它們分配了固定值,就可以使用常量和變數表示式。 switch(1+2+3*4+5) switch(a+b+c*d)
- 
default和break是可選的。即使switch-case沒有它們,它也可以毫無問題地執行。
- 
switch語句的巢狀是有效的,意味著我們可以在另一個語句中切換語句。雖然這不是一個好的程式設計習慣,但我們仍然可以利用它們。
```C++
#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;
  }
}
```
輸出:
```text
checking info......
Login successful
```
- 
switch語句中使用的表示式必須是整數型別,這意味著它應該是int、char或enum。否則我們會得到一個編譯錯誤。#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
```
- 
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; } }輸出: 
```text
It's not 1 or 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
```
- 
不允許重複的案例標籤。如果給出,我們將得到一個編譯錯誤。 #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; } }
輸出:
```text
[Error] duplicate case value
```
- 
案例標籤也應該是不變的。否則,我們會得到一個編譯錯誤。 #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; } }
輸出:
```text
[Error] the value of 'arr' is not usable in a constant expression
```
- 
我們可以對執行相同任務的所有 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 時,switch 比 if-else 更受歡迎,因為它更快。
