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