首页 > 编程笔记

C++ switch case语句详解

if else 语句虽然可以根据表达式的结果,执行不同的语句,但是如果表达式存在多种可能的结果,多个 if else 语句未免显得过于烦琐。编程过程中,很可能会由于疏忽而漏掉一个或多个 if else 判断。

C++ 还提供了 switch case 分支语句,它比连续使用多个 if else 语句更加紧凑和高效,特别适用于需要处理多个具体值的情况。

switch case 语句常见的使用格式是:
switch(expr){
    case 整型数值1:
        语句 1;
        break;
    case 整型数值2:
        语句 2;
        break;
    ......
    case 整型数值n:
        语句 n;
        break;
    default:
        语句 n+1;
}
首先,expr 是一个表达式,它的结果值是一个整数或者枚举值,或者其他可以转换成整数或枚举值的值。

switch 表达式后面是一组由一对花括号“{”和“}”包围的 case 标签,它是由关键字 case 后接一个常量表达式及冒号构成的,这个常量表达式将被用来与 switch 表达式的结果值进行匹配。例如:
#include <stdio.h>
int main() {
    int a;
    printf("Input integer number:");
    scanf("%d", &a);
    switch (a) {
        case 1:
            printf("Monday\n");
            break;
        case 2:
            printf("Tuesday\n");
            break;
        case 3:
            printf("Wednesday\n");
            break;
        case 4:
            printf("Thursday\n");
            break;
        case 5:
            printf("Friday\n");
            break;
        case 6:
            printf("Saturday\n");
            break;
        case 7:
            printf("Sunday\n");
            break;
        default:
            printf("error\n");
    }
    return 0;
}
如果 a 的值是 1,则执行第 3、4 行语句。如果 a 的值是 3,则执行第 9、10 行语句。

执行程序,结果为:

Input integer number:1
Monday

switch case中的break

每个 case 代码块的末尾都有一个 break,表示停止执行 switch case 语句,转而执行 switch case 后面的语句,也就是“}”结束花括号后面的代码(如果有的话)。

对于每个 case 代码块而言,break 可以加也可以不加。例如:
#include <stdio.h>
int main() {
    int a;
    printf("Input integer number:");
    scanf("%d", &a);
    switch (a) {
        case 1: printf("Monday\n");
        case 2: printf("Tuesday\n");
        case 3: printf("Wednesday\n");
        case 4: printf("Thursday\n");
        case 5: printf("Friday\n");
        case 6: printf("Saturday\n");
        case 7: printf("Sunday\n");
        default:printf("error\n");
    }
    return 0;
}
每个 case 代码块中都没有 break,如果 a 的值为 3,那么会匹配第 3 个 case 语句,由于没有 break 语句,那么不仅第 3 个 case 语句后的代码块会执行,后续所有 case 中的代码块都会执行,最后 default 中的代码块也会执行。

执行程序,运行结果为:

Input integer number:3
Wednesday
Thursday
Friday
Saturday
Sunday
error

何时不加 break 语句,取决于程序员的设计。虽然这样做没什么不妥,但对于后来维护程序的人则未免有些麻烦。因为后来者并不知道没有加上的 break 语句是故意为之,还是编程者的疏忽。所以,为了方便程序的维护,最好在不加 break 语句的地方加上注释,说明为什么不加。

有的时候,程序员可能就是需要多个 case 对应同一个语句或语句块,则连续的多个 case 可以只加一个 break 语句。例如:
#include <iostream>

int main() {
    int month;
    std::cout << "请输入月份(1-12):";
    std::cin >> month;

    switch (month) {
        case 12:
        case 1:
        case 2:
            std::cout << "冬季,天气寒冷。";
            break;
        case 3:
        case 4:
        case 5:
            std::cout << "春季,天气温暖。";
            break;
        case 6:
        case 7:
        case 8:
            std::cout << "夏季,天气炎热。";
            break;
        case 9:
        case 10:
        case 11:
            std::cout << "秋季,天气凉爽。";
            break;
        default:
            std::cout << "无效的输入!";
            break;
    }

    return 0;
}
在这个程序中,每个季节的三个月份共享同一个 case 块,并使用相同的 break 语句来结束。这种结构使代码更简洁,并允许对具有相同处理逻辑的多个选择进行统一处理。

switch case中的default

switch case 结构通常还会有一个 default 语句,放在所有 case 的后面。default 直接跟一个冒号,中间只允许存在空格或制表符,而不是表达式。default 标签的冒号后面是跟 default 相关联的语句或语句块。

如果 switch 表达式与任意一个 case 标签都不匹配,最终会执行 default 中的语句。

以文章中第一个 C++ 程序为例,当 a 值是 [1, 7] 之外的其它值时,程序输出结果为:

Input integer number:8
error

总结

switch case 语句是一种强大的多分支选择工具,它提供了一种比连续使用 if else 语句更紧凑和清晰的方式来处理基于值的选择。掌握 switch case 的用法是构建高效和组织良好的 C++ 代码的关键部分。

推荐阅读