C++ switch case语句的用法(非常详细)
在现实世界中,有这样一类特殊的条件选择:
在 C++ 中,只要是条件判断,就可以用 if else 语句将其表达出来,我们可以将这个看天穿衣的场景表达如下:
为了简化代码并使这种并列条件选择表达得更加清晰,C++ 提供了专门的 switch case 语句,其语法格式如下:
在执行时,switch 语句首先计算条件量的值,然后将这个值依次与各个 case 分支的常量值进行比较。如果两者相等,则进入相应的 case 分支执行,直到遇到 break 关键字,结束整个 switch 语句的执行;如果两者不相等,则继续判断后面的 case 分支。如果直到最后都没有遇到与条件量相等的常量值,则执行表示默认情况的 default 分支,完成整个 switch 语句的执行。
default 分支用于处理所有不符合 case 分支条件的缺省情况,该分支是可选的。如果不需要处理缺省情况,则可以省略 default 分支。如果没有 default 分支,并且没有匹配的 case 分支,程序将不执行任何语句而直接结束 switch 语句,如下图所示。

图:switch 语句的执行流程
有了 switch 语句,我们就可以用它替换 if else 语句,将“看天穿衣”的并列条件选择简化为:
这样,switch 语句实现的逻辑判断与用 if else 语句实现的完全一致,而代码更加简洁,各种情况通过 case 分支单独列出,逻辑也更加清晰。因此,在处理这种针对同一条件的不同情况时,我们应该优先选择使用 switch 语句。
在使用 switch 语句时需要特别注意的是,每个 case 分支末尾都应有一个 break 关键字。它的作用是跳出当前的 case 分支,结束整个 switch 语句的执行。
在上面的例子中,如果用户输入的 nW 是 1,表示明天是晴天。因为 SUNNY 分支的值与 nW 相等,那么 switch 语句会进入 case SUNNY 分支执行,因而输出为:
当然,也有例外情况。在大多数情况下,我们需要在每个 case 分支后加上 break 关键字,而在某些特殊情况下,多个 case 分支可能有共同的功能需要完成,其中一个 case 分支的功能是另一个 case 分支功能的一部分,两个 case 分支有包含与被包含的关系,这时也可以有意地去掉分支中的 break 关键字,并将其放在靠上的位置,从而实现共用被包含分支中的代码。
例如,在 KFC 点餐时,有汉堡套餐和鸡翅套餐可供选择。汉堡套餐只是一个汉堡,而鸡翅套餐是在汉堡套餐的基础上再加一对鸡翅。在这种情况下,两个 case 分支(汉堡套餐和鸡翅套餐)具有公共功能(一个汉堡),形成了包含与被包含的关系(鸡翅套餐包含汉堡套餐,而汉堡套餐被鸡翅套餐包含)。在这种情况下,可以省略包含 case 分支(鸡翅套餐)中的break关键字,并将其放在相对靠上的位置,以实现共用公共功能的代码:
在使用 switch 语句时,还需要注意以下几点:
如果明天是晴天,我就穿T恤;
如果明天是阴天,我就穿衬衣;
如果明天是雨天,我就穿外套。
在 C++ 中,只要是条件判断,就可以用 if else 语句将其表达出来,我们可以将这个看天穿衣的场景表达如下:
// 用并列条件选择实现的看天穿衣 #include <iostream> using namespace std; // 枚举可能的天气情况 enum Weather { SUNNY = 1, // 晴天,指定其值为1 CLOUDY, // 阴天,其值递增为2 RAINY // 雨天,其值递增为3 }; int main() { cout << "请输入明天的天气(1-晴天;2-阴天;3-雨天):"; int nW = 0; // 获取用户输入的天气情况 cin >> nW; // 对天气情况进行判断 if (SUNNY == nW) // 如果是晴天 { // 输出晴天该穿的衣服 cout << "晴天穿 T 恤" << endl; } else if (CLOUDY == nW) // 如果是阴天 { cout << "阴天穿衬衣" << endl; } else if (RAINY == nW) // 如果是雨天 { cout << "雨天穿外套" << endl; } else { cout << "不知道明天是什么天气,你爱穿什么穿什么吧" << endl; } return 0; }使用 if else 语句虽然能够表达这种并列选择场景,但需要书写多个 else if 分支和多个相似的条件表达式,显得有些烦琐。
为了简化代码并使这种并列条件选择表达得更加清晰,C++ 提供了专门的 switch case 语句,其语法格式如下:
switch(条件量) { case 常量值1: { 语句1; } break; case 常量值2: { 语句2; } break; //... case 常量值n: { 语句n; } break; default: { 默认语句; } }其中,条件量是要进行判断的条件,它可以是某个变量,例如表示天气状况的变量 nW,也可以是更加复杂的表达式。多个常量值是条件量可能的取值,例如,这里的条件量 nW 的可能取值包括 SUNNY(晴天)、CLOUDY(阴天)或者 RAINY(雨天)。
在执行时,switch 语句首先计算条件量的值,然后将这个值依次与各个 case 分支的常量值进行比较。如果两者相等,则进入相应的 case 分支执行,直到遇到 break 关键字,结束整个 switch 语句的执行;如果两者不相等,则继续判断后面的 case 分支。如果直到最后都没有遇到与条件量相等的常量值,则执行表示默认情况的 default 分支,完成整个 switch 语句的执行。
default 分支用于处理所有不符合 case 分支条件的缺省情况,该分支是可选的。如果不需要处理缺省情况,则可以省略 default 分支。如果没有 default 分支,并且没有匹配的 case 分支,程序将不执行任何语句而直接结束 switch 语句,如下图所示。

图:switch 语句的执行流程
有了 switch 语句,我们就可以用它替换 if else 语句,将“看天穿衣”的并列条件选择简化为:
// 用 switch 语句实现的并列条件选择 // 以表示天气状况的 nW 作为条件量,根据不同的天气穿不同的衣服 switch (nW) { case SUNNY: // 以表示晴天的 SUNNY 作为常量值,进行对晴天状况的处理 cout << "晴天穿 T 恤" << endl; break; // 完成对晴天状况的处理,用 break 结束整个 switch 语句 case CLOUDY: // 处理阴天 cout << "阴天穿衬衣" << endl; break; case RAINY: // 处理雨天 cout << "雨天穿外套" << endl; break; default: // 对例外情况进行默认的处理 cout << "不知道这是什么天气,你爱穿什么就穿什么吧" << endl; }在这里,我们用表示天气状况的变量 nW 作为条件量,并用标识各种天气状况的枚举值作为各个 case 分支的常量值。在执行时,switch 语句会将保存了天气状况的条件量 nW 自上而下地与各个 case 分支的常量值进行相等比较,相当于 if(SUNNY == nW) 这样的条件判断。这种相等比较会自上而下依次进行,直到遇到两者相等的分支,然而执行对应的代码,遇到 break 关键字后,结束整个 switch 语句的执行。
这样,switch 语句实现的逻辑判断与用 if else 语句实现的完全一致,而代码更加简洁,各种情况通过 case 分支单独列出,逻辑也更加清晰。因此,在处理这种针对同一条件的不同情况时,我们应该优先选择使用 switch 语句。
在使用 switch 语句时需要特别注意的是,每个 case 分支末尾都应有一个 break 关键字。它的作用是跳出当前的 case 分支,结束整个 switch 语句的执行。
在上面的例子中,如果用户输入的 nW 是 1,表示明天是晴天。因为 SUNNY 分支的值与 nW 相等,那么 switch 语句会进入 case SUNNY 分支执行,因而输出为:
晴天穿T恤
接着遇到 break 关键字,就会忽略后面的其他 case 分支而直接结束整个 switch 语句的执行。如果没有 break 关键字,程序将继续顺序执行后续的 case 分支,直到遇到 break 关键字或者执行完所有 case 分支。如果没有 break 关键字,那么用户输入 1,输出可能会变成:
晴天穿T恤
阴天穿衬衣
雨天穿外套
不知道这是什么天气,你爱穿什么穿什么吧
当然,也有例外情况。在大多数情况下,我们需要在每个 case 分支后加上 break 关键字,而在某些特殊情况下,多个 case 分支可能有共同的功能需要完成,其中一个 case 分支的功能是另一个 case 分支功能的一部分,两个 case 分支有包含与被包含的关系,这时也可以有意地去掉分支中的 break 关键字,并将其放在靠上的位置,从而实现共用被包含分支中的代码。
例如,在 KFC 点餐时,有汉堡套餐和鸡翅套餐可供选择。汉堡套餐只是一个汉堡,而鸡翅套餐是在汉堡套餐的基础上再加一对鸡翅。在这种情况下,两个 case 分支(汉堡套餐和鸡翅套餐)具有公共功能(一个汉堡),形成了包含与被包含的关系(鸡翅套餐包含汉堡套餐,而汉堡套餐被鸡翅套餐包含)。在这种情况下,可以省略包含 case 分支(鸡翅套餐)中的break关键字,并将其放在相对靠上的位置,以实现共用公共功能的代码:
cout << "请选择您需要的套餐(1-汉堡套餐;2-鸡翅套餐)" << endl; int nOrder = 0; cin >> nOrder; // 获取用户选择 switch (nOrder) { case 2: // 将包含 case 分支放在靠上的位置 cout << "一对鸡翅" << endl; // 完成独有的功能 // 注意,这里省略了 case 分支末尾的 break 关键字 case 1: // 将被包含 case 分支置于靠下的位置 cout << "一个汉堡" << endl; // 完成公共功能 break; // 保留 break 关键字,结束 switch 语句 default: cout << "无法识别的选项,请重新选择" << endl; }在这个例子中,我们有意省略了第一个 case 分支的 break 关键字。当输入 1 表示选择汉堡套餐时,switch 语句会进入 case 1 分支执行,输出“一个汉堡”后,遇到末尾的 break 关键字,从而结束整个 switch 语句的执行。最终,得到的汉堡套餐内容如下:
一个汉堡
而当输入 2 表示选择鸡翅套餐时,switch 语句首先进入 case 2 分支执行,输出“一对鸡翅”后,因为这里没有 break 关键字,所以程序会继续向下进入 case 1 分支执行,输出“一个汉堡”,然后程序才遇到 break 关键字,结束整个 switch 语句的执行。最终,得到的鸡翅套餐内容如下:
一对鸡翅
一个汉堡
在使用 switch 语句时,还需要注意以下几点:
- switch 关键字后括号中的条件量必须是整型的数值变量或表达式,或者是能够转换为整型的其他类型,例如字符类型或者枚举类型等。
- 因为 switch 的条件量是整型,为了与之比较,所以 case 之后的常量值也必须是整型。这些常数值通常是表示各种情况的枚举值,例如上面例子中的 SUNNY、CLOUDY 等,也可以直接是常量数字,如上面例子中的 1 和 2,甚至可以是只有常量参与运算的表达式。
- 各个 case 分支的常量值不能相等,即不能出现两个相同条件的 case 分支。