# C++ 中的`switch-case`语句

> 原文： [https://beginnersbook.com/2017/08/cpp-switch-case/](https://beginnersbook.com/2017/08/cpp-switch-case/)

当我们有多个条件并且我们需要根据条件执行不同的操作时，使用`switch case`语句。当我们有多个条件时，我们需要在满足特定条件时执行一个语句块。在这种情况下，我们可以使用冗长的 [`if..else-if`语句](https://beginnersbook.com/2017/08/cpp-if-else-statement/)或`switch case`。冗长`if..else-if`的问题是当我们有几个条件时它会变得复杂。`switch-case`是处理这种情况的干净而有效的方法。

`switch case`语句的**语法：**

```cpp
switch (variable or an integer expression)
{
     case constant:
     //C++ code
     ;
     case constant:
     //C++ code
     ;
     default:
     //C++ code
     ;
}
```

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

## `switch-case`示例

```cpp
#include <iostream>
using namespace std;
int main(){
   int num=5;
   switch(num+2) {
      case 1: 
        cout<<"Case1: Value is: "<<num<<endl;
      case 2: 
        cout<<"Case2: Value is: "<<num<<endl;
      case 3: 
        cout<<"Case3: Value is: "<<num<<endl;
      default: 
        cout<<"Default: Value is: "<<num<<endl;
   }
   return 0;
}
```

**输出：**

```cpp
Default: Value is: 5
```

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

## `switch-case`流程图

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

![switch case flow diagram](img/4f4a0032c3c6f26d1bc5a76c8a08546f.jpg)

## `switch-case`中的`break`语句

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

```cpp
#include <iostream>
using namespace std;
int main(){
   int i=2;
   switch(i) {
      case 1: cout<<"Case1 "<<endl;
      case 2: cout<<"Case2 "<<endl;
      case 3: cout<<"Case3 "<<endl;
      case 4: cout<<"Case4 "<<endl;
      default: cout<<"Default "<<endl; 
   }
   return 0;
}
```

**输出：**

```cpp
Case2 
Case3 
Case4 
Default 

```

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

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

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

```cpp
#include <iostream>
using namespace std;
int main(){
   int i=2;
   switch(i) {
      case 1:
        cout<<"Case1 "<<endl;
        break;
      case 2:
        cout<<"Case2 "<<endl;
        break;
      case 3:
        cout<<"Case3 "<<endl;
        break;
      case 4:
        cout<<"Case4 "<<endl;
        break;
      default:
        cout<<"Default "<<endl;
    }
    return 0;
}
```

**输出：**

```cpp
Case2
```

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

**为什么我在`default`块不使用`break`语句？**

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

## 重要笔记

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

2）您也可以在`switch-case`中使用字符。例如：

```cpp
#include <iostream>
using namespace std;
int main(){
   char ch='b';
   switch(ch) {
      case 'd': cout<<"Case1 ";
      break;
      case 'b': cout<<"Case2 ";
      break;
      case 'x': cout<<"Case3 ";
      break;
      case 'y': cout<<"Case4 ";
      break;
      default: cout<<"Default ";
   }
   return 0;
}
```

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