原文: https://beginnersbook.com/2017/08/cpp-switch-case/

当我们有多个条件并且我们需要根据条件执行不同的操作时,使用switch case语句。当我们有多个条件时,我们需要在满足特定条件时执行一个语句块。在这种情况下,我们可以使用冗长的 if..else-if语句switch case。冗长if..else-if的问题是当我们有几个条件时它会变得复杂。switch-case是处理这种情况的干净而有效的方法。

switch case语句的语法:

  1. switch (variable or an integer expression)
  2. {
  3. case constant:
  4. //C++ code
  5. ;
  6. case constant:
  7. //C++ code
  8. ;
  9. default:
  10. //C++ code
  11. ;
  12. }

即使break语句是可选的,switch case语句也大量使用break语句。我们将首先看到一个没有break语句的例子,然后我们将讨论switch casebreak

switch-case示例

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int num=5;
  5. switch(num+2) {
  6. case 1:
  7. cout<<"Case1: Value is: "<<num<<endl;
  8. case 2:
  9. cout<<"Case2: Value is: "<<num<<endl;
  10. case 3:
  11. cout<<"Case3: Value is: "<<num<<endl;
  12. default:
  13. cout<<"Default: Value is: "<<num<<endl;
  14. }
  15. return 0;
  16. }

输出:

  1. Default: Value is: 5

说明:在swicth中我给出了一个表达式,你也可以给出变量。我给了表达式num + 2,其中num值是 5,并且在相加之后表达式得到 7。由于没有用值 4 定义的情况,所以执行了默认情况。

switch-case流程图

它求值表达式或变量的值(基于switch括号内给出的内容),然后根据结果执行相应的情况。

C   中的`switch-case`语句 - 图1

switch-case中的break语句

在我们讨论break语句之前,让我们看看当我们在switch case中不使用break语句时会发生什么。请参阅以下示例:

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int i=2;
  5. switch(i) {
  6. case 1: cout<<"Case1 "<<endl;
  7. case 2: cout<<"Case2 "<<endl;
  8. case 3: cout<<"Case3 "<<endl;
  9. case 4: cout<<"Case4 "<<endl;
  10. default: cout<<"Default "<<endl;
  11. }
  12. return 0;
  13. }

输出:

  1. Case2
  2. Case3
  3. Case4
  4. Default

在上面的程序中,我们在switch括号内部有变量i,这意味着无论变量i的值是什么,都会执行相应的case块。我们已将整数值 2 传递给switch,因此控制流切换到case 2,但是在case 2 之后我们没有使用break语句,导致控制流继续到后续case直到结束。然而,这不是我们想要的,我们想要执行正确case块并忽略其余的块。这个问题的解决方案是在每个case块之后使用break语句。

当您希望程序流从switch主体中出来时,使用break语句。每当在switch主体中遇到break语句时,执行流程将直接从switch中出来,忽略其余的情况。这就是您必须使用break语句结束每个case块的原因。

让我们采用相同的例子,但这次使用break语句。

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int i=2;
  5. switch(i) {
  6. case 1:
  7. cout<<"Case1 "<<endl;
  8. break;
  9. case 2:
  10. cout<<"Case2 "<<endl;
  11. break;
  12. case 3:
  13. cout<<"Case3 "<<endl;
  14. break;
  15. case 4:
  16. cout<<"Case4 "<<endl;
  17. break;
  18. default:
  19. cout<<"Default "<<endl;
  20. }
  21. return 0;
  22. }

输出:

  1. Case2

现在您可以看到只有case 2被执行,其余的后续case被忽略了。

为什么我在default块不使用break语句?

控制流本身会在默认情况下从switch中出来,所以我之后没有使用break语句,但是如果你想要它可以使用它,那么这样做是没有害处的。

重要笔记

1)case并不总是需要顺序1,2,3等。它可以在case关键字后面包含任何整数值。此外,case不需要始终按升序排列,您可以根据要求以任何顺序指定它们。

2)您也可以在switch-case中使用字符。例如:

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. char ch='b';
  5. switch(ch) {
  6. case 'd': cout<<"Case1 ";
  7. break;
  8. case 'b': cout<<"Case2 ";
  9. break;
  10. case 'x': cout<<"Case3 ";
  11. break;
  12. case 'y': cout<<"Case4 ";
  13. break;
  14. default: cout<<"Default ";
  15. }
  16. return 0;
  17. }

3)允许嵌套switch语句,这意味着你可以在另一个switch内部使用switch语句。但是应该避免使用嵌套的switch语句,因为它会使程序更复杂,更不易读。