🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 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](https://img.kancloud.cn/2b/64/2b647e7125b8646b3efe47fc14412d93_400x400.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`语句,因为它会使程序更复杂,更不易读。