跳转到内容

C 语言 switch 语句

来自代码酷

C语言Switch语句[编辑 | 编辑源代码]

Switch语句是C语言中用于多路分支选择的一种控制流结构,它允许根据表达式的值选择执行不同的代码块。相较于多个if-else语句,switch语句在代码可读性和执行效率上通常更具优势。

语法结构[编辑 | 编辑源代码]

switch语句的基本语法如下:

switch (expression) {
    case constant1:
        // 代码块1
        break;
    case constant2:
        // 代码块2
        break;
    ...
    default:
        // 默认代码块
}

其中:

  • expression:必须是一个整型或枚举类型的表达式。
  • case constant:每个case后跟一个常量表达式,且值必须唯一。
  • break:用于退出switch语句,防止"贯穿"(fall-through)。
  • default:可选分支,当所有case都不匹配时执行。

基本示例[编辑 | 编辑源代码]

以下是一个简单的switch语句示例,根据用户输入的数字输出对应的星期名称:

#include <stdio.h>

int main() {
    int day;
    printf("请输入1-7的数字:");
    scanf("%d", &day);

    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("输入错误!请输入1-7的数字。\n");
    }
    return 0;
}

输出示例:

请输入1-7的数字:3
星期三

贯穿(Fall-through)行为[编辑 | 编辑源代码]

C语言的switch语句允许"贯穿"行为,即当某个case没有break语句时,程序会继续执行下一个case的代码,直到遇到breakswitch结束。

示例:多个case共享代码[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    int month;
    printf("请输入月份(1-12):");
    scanf("%d", &month);

    switch (month) {
        case 12:
        case 1:
        case 2:
            printf("冬季\n");
            break;
        case 3:
        case 4:
        case 5:
            printf("春季\n");
            break;
        case 6:
        case 7:
        case 8:
            printf("夏季\n");
            break;
        case 9:
        case 10:
        case 11:
            printf("秋季\n");
            break;
        default:
            printf("无效月份\n");
    }
    return 0;
}

输出示例:

请输入月份(1-12):4
春季

与if-else的比较[编辑 | 编辑源代码]

switch语句和if-else链都可以实现多路分支,但各有适用场景:

特性 switch if-else
只能比较相等性(整型/枚举) | 可以比较任意条件表达式
多分支时更清晰 | 分支少时更直观
通常使用跳转表,效率高 | 需要逐个条件判断
必须使用break控制流程 | 自动执行一个分支后退出

实际应用案例[编辑 | 编辑源代码]

简单计算器[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    char operator;
    double num1, num2;

    printf("请输入运算符(+, -, *, /):");
    scanf("%c", &operator);
    printf("请输入两个操作数:");
    scanf("%lf %lf", &num1, &num2);

    switch (operator) {
        case '+':
            printf("%.2lf + %.2lf = %.2lf\n", num1, num2, num1 + num2);
            break;
        case '-':
            printf("%.2lf - %.2lf = %.2lf\n", num1, num2, num1 - num2);
            break;
        case '*':
            printf("%.2lf * %.2lf = %.2lf\n", num1, num2, num1 * num2);
            break;
        case '/':
            if (num2 != 0)
                printf("%.2lf / %.2lf = %.2lf\n", num1, num2, num1 / num2);
            else
                printf("错误:除数不能为零!\n");
            break;
        default:
            printf("错误:无效运算符\n");
    }
    return 0;
}

输出示例:

请输入运算符(+, -, *, /):*
请输入两个操作数:5 7
5.00 * 7.00 = 35.00

高级用法[编辑 | 编辑源代码]

枚举类型与switch[编辑 | 编辑源代码]

switch语句常与枚举类型配合使用,提高代码可读性:

#include <stdio.h>

enum Color { RED, GREEN, BLUE };

void printColor(enum Color color) {
    switch (color) {
        case RED:
            printf("红色\n");
            break;
        case GREEN:
            printf("绿色\n");
            break;
        case BLUE:
            printf("蓝色\n");
            break;
    }
}

int main() {
    enum Color c = GREEN;
    printColor(c);
    return 0;
}

输出:

绿色

使用return代替break[编辑 | 编辑源代码]

在函数中使用switch时,可以直接用return替代break

#include <stdio.h>

const char* getDayName(int day) {
    switch (day) {
        case 1: return "星期一";
        case 2: return "星期二";
        case 3: return "星期三";
        case 4: return "星期四";
        case 5: return "星期五";
        case 6: return "星期六";
        case 7: return "星期日";
        default: return "无效天数";
    }
}

int main() {
    printf("%s\n", getDayName(5));
    return 0;
}

输出:

星期五

常见错误与注意事项[编辑 | 编辑源代码]

1. 忘记break:会导致意外的贯穿行为 2. 重复的case值:编译错误 3. 非整型的switch表达式:编译错误 4. 变量作为case常量:case后必须跟编译时常量 5. default位置:虽然通常放在最后,但语法上可以放在任何位置

性能考量[编辑 | 编辑源代码]

编译器通常会将switch语句优化为跳转表(jump table)实现,这使得它在处理大量分支时比等价的if-else链更高效。跳转表的基本原理可以用以下伪代码表示:

{计算expression值n直接跳转到case n对应的代码

流程图表示[编辑 | 编辑源代码]

以下是switch语句的流程图表示:

开始
计算表达式值
值匹配case?
执行对应代码块
遇到break?
结束switch
继续下一个case
有default?
执行default代码
结束

总结[编辑 | 编辑源代码]

switch语句是C语言中处理多路分支的强大工具,特别适合基于单一整型或枚举值的条件判断。正确使用时可以提高代码的可读性和执行效率,但需要注意break的使用以避免意外的贯穿行为。对于复杂的条件判断,可能需要结合if-else语句来实现。