switch语句

353 阅读3分钟

在 C 语言中,switch语句是一种多分支选择结构,用于根据表达式的值从多个分支中选择一个执行,比if-else if结构在多分支场景下更简洁高效。以下是其基本概要:

1. 语法结构

switch (表达式) {
    case 常量表达式1:
        语句块1;
        break;  // 可选,用于跳出switch
    case 常量表达式2:
        语句块2;
        break;
    // ... 更多case分支
    default:    // 可选,当所有case都不匹配时执行
        语句块n;
        break;
}

2. 核心要点

  • 表达式要求switch后的表达式结果必须是整数类型(int、char、枚举等,不能是 float、double 等非整数类型)。

  • case 常量case后的 “常量表达式” 必须是整数常量(如1'a'、枚举值),且不能重复。

  • 执行逻辑

    1. 计算switch表达式的值。
    2. 与各个case的常量比较,匹配则从该case后的语句开始执行。
    3. 若没有break,会继续执行后续case的语句(“穿透” 现象),直到遇到breakswitch结束。
  • default 分支:可选,当所有case都不匹配时执行;通常放在最后,也可放其他位置(需加break避免穿透)。

3. 示例

#include <stdio.h>

int main() {
    int num = 2;
    switch (num) {
        case 1:
            printf("One\n");
            break;  // 执行后跳出switch
        case 2:
            printf("Two\n");  // 匹配此case,执行
            // 无break,继续穿透到下一个case
        case 3:
            printf("Three\n");  // 会被执行
            break;  // 跳出switch
        default:
            printf("Other\n");
    }
    return 0;
}

输出: image.png

case 的值要与 表达式的值完全一样, 才是匹配成功!

如果匹配成功,就执行对应代码,直到遇到break为止!

考试分数
#include <stdio.h>
int main(){
    printf("switch");
    // 考试分数
    int score = 61;
    // case 的值要与 表达式的值完全一样, 才是匹配成功!
    // if(score >= 60 && score <=70)
    switch(score){
        case 60:
            printf("额外做1张试卷");
            break;
        case 61:
            printf("额外做1张试卷");
            break;
        case 70:
            printf("额外做半张试卷");
            break;
        case 90:
            printf("出去玩");
            break;
        default:
            printf("你考的分数不在处理范围");
            break;
    }
}

输出 image.png

一周行动表

#include <stdio.h>
int main () {
 
    int day;
    printf("输入1-7的数字,获取我的工作日历:");
    scanf("%d", &day);

    switch(day){
        case 1:
            printf("有课,逃课出去玩");
            break;
        case 2:
            printf("有课,逃课打球");
            break;
        case 3:
            printf("逃课被抓,老实上课");
            break;
        case 4:
            printf("依旧逃课骑着小电驴打流");
            break;
        case 5:
            printf("被导员请喝茶");
            break;
        case 6:
            printf("放假奢侈一把");
            break;
        case 7:
            printf("放假睡一天");
            break;
        default:
            printf("输入有误,没有这个日历");
            break;
    }
}

输出 image.png

witch适合分支条件为离散整数的场景,相比if-else if更清晰,执行效率也更高(底层通常通过跳转表实现)。

作业

#include <stdio.h>

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

    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            printf("31\n");
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            printf("30\n");
            break;
        case 2:
            printf("请输入年份:");
            scanf("%d", &year);
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
                printf("29\n");
            } else {
                printf("28\n");
            }
            break;
        default:
            printf("输入的月份无效,请输入1-12之间的整数\n");
    }

    return 0;
}