首页 > 编程笔记 > C++笔记 阅读:12

C++ switch case语句的用法(非常详细)

在现实世界中,有这样一类特殊的条件选择:

如果明天是晴天,我就穿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恤
阴天穿衬衣
雨天穿外套
不知道这是什么天气,你爱穿什么穿什么吧

可以看看,整个流程都乱套了!因此,在使用 switch 语句时,一定要注意在每个 case 分支末尾加上 break 关键字,以表示该分支处理完毕,结束整个 switch 语句的执行。

当然,也有例外情况。在大多数情况下,我们需要在每个 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 语句的执行。最终,得到的鸡翅套餐内容如下:

一对鸡翅
一个汉堡

虽然我们省略了某些 case 分支末尾的 break 关键字,但这并没有造成逻辑上的错误,反而实现了共用公共功能代码的效果。

在使用 switch 语句时,还需要注意以下几点:

相关文章