本文目录导读:

  1. 基本语法
  2. 快速上手:一个简单例子
  3. break

    ?">为什么每个 case 后面都要加

    break

  4. default

    的位置">

    default

    的位置

  5. 的位置
  6. switch 可以嵌套吗?
  7. switch 与 if-else 的选择
  8. 常见陷阱与注意事项
  9. 完整的进阶示例:简易计算器
  10. 在C语言编程中,我们经常需要根据一个变量的不同值来执行不同的代码块,虽然可以用

    if-else if-else

    链实现,但当判断条件较多时,代码会变得冗长且难以阅读,这时,

    switch

    语句就成为了更好的选择——它让多分支选择逻辑更加清晰、高效。

    语句就成为了更好的选择——它让多分支选择逻辑更加清晰、高效。

    C语言中的

    switch

    语句到底怎么用?有哪些容易踩的坑?本文将带你一步步掌握它。

    语句到底怎么用?有哪些容易踩的坑?本文将带你一步步掌握它。


    基本语法

    switch

    语句的结构如下:

    语句的结构如下:

    switch (表达式)

    {

    case 常量1:

    语句块1;

    break;

    case 常量2:

    语句块2;

    break;

    ...

    default:

    默认语句块;

    }

    关键点

    • 表达式

      必须是一个整型字符型(char、int、short、long、enum 等),不能是浮点数或字符串。

    • 必须是一个整型字符型(char、int、short、long、enum 等),不能是浮点数或字符串。
    • case

      后面跟的必须是常量表达式(如数字、字符、枚举常量),不能是变量或范围。

    • 后面跟的必须是常量表达式(如数字、字符、枚举常量),不能是变量或范围。
    • break

      用于跳出整个

      switch

      块(不写会“穿透”到下一个 case,后面会详细讲)。

    • 块(不写会“穿透”到下一个 case,后面会详细讲)。
    • default

      是可选的,当所有 case 都不匹配时执行。

    • 是可选的,当所有 case 都不匹配时执行。

    • 快速上手:一个简单例子

      假设我们要根据用户输入的数字(1~7)输出对应的星期:

      #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):5

      星期五

      如果输入 8,就会输出

      输入错误,请输1~7之间的数字


      为什么每个 case 后面都要加

      break

      这是初学者最容易忽略的问题。

      break

      用来跳出 switch 块,如果没有

      break

      ,程序会继续执行下一个 case 的代码,直到遇到

      break

      或 switch 结束,这种行为称为“穿透”(fall-through)

      或 switch 结束,这种行为称为“穿透”(fall-through)

      1 不加 break 的例子

      int n = 2;

      switch (n)

      {

      case 1:

      printf("one\n");

      case 2:

      printf("two\n");

      case 3:

      printf("three\n");

      default:

      printf("default\n");

      }

      输出:

      two

      three

      default

      为什么?因为

      n==2

      匹配了

      case 2

      ,但后面没有

      break

      ,程序就顺着执行了

      case 3

      default

      的代码,直到 switch 结束。

      的代码,直到 switch 结束。

      2 利用穿透:合并多个 case

      有时候我们故意利用穿透来让多个 case 执行同一段代码,判断月份天数(不考虑闰年):

      int month = 2;

      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("28天\n");

      break;

      default:

      printf("无效月份\n");

      }

      这里

      case 1

      case 3

      …… 都没有写

      break

      ,它们会依次“穿透”到第一个有

      break

      case

      处(即

      case 12

      后面的

      break

      ),从而共用打印“31天”的代码。

      ),从而共用打印“31天”的代码。


      default

      的位置

      的位置

      default

      习惯放在最后,但它其实可以放在 switch 块的任何位置。

      习惯放在最后,但它其实可以放在 switch 块的任何位置。

      int color = 0;

      switch (color)

      {

      default:

      printf("未知颜色\n");

      break;

      case 0:

      printf("红色\n");

      break;

      case 1:

      printf("绿色\n");

      break;

      }

      color==0

      时,不会进入

      default

      ,直接匹配

      case 0

      default

      放在中间且没有

      break

      ,也会发生穿透,但为了可读性,推荐

      default

      放在最后,并加上

      break


      switch 可以嵌套吗?

      可以。

      switch

      内部当然可以再嵌套另一个

      switch

      ,但要注意代码的可读性,过多的嵌套会让程序变得混乱,一般建议用函数或

      if-else

      重构。

      重构。


      switch 与 if-else 的选择

      场景推荐用 switch推荐用 if-else
      变量值与若干整型/字符常量比较也可以,但更长
      需要判断范围(如age > 18

      ❌ 不支持
      需要判断浮点数或字符串❌ 不支持
      判断条件数量多(如10个以上)✅ 更清晰❌ 可能冗长
      需要复杂的逻辑组合(与、或、非)❌ 不支持
      ❌ 不支持
      需要判断浮点数或字符串❌ 不支持
      判断条件数量多(如10个以上)✅ 更清晰❌ 可能冗长
      需要复杂的逻辑组合(与、或、非)❌ 不支持

      当判断基于一个整型变量的离散值时,switch 更优;涉及范围、浮点、字符串或复杂条件时,用 if-else


      常见陷阱与注意事项

      1. case 后必须是常量
        case x:

        中的 x 不能是变量,不能是表达式(如

        a + b

        ),必须是编译期可确定的常量。

        ),必须是编译期可确定的常量。

        避免遗漏 break

        没有 break 会导致意外穿透,调试时可能很难发现,建议每个 case 后面都写 break,除非你有意利用穿透。

        不要忘记 default

        即使你认为所有情况都已覆盖,也建议加上

        default

        来处理意外值,能提高程序的健壮性。

        来处理意外值,能提高程序的健壮性。

        多个 case 可以共享一个值吗?

        不可以,C 标准不允许同一个 switch 中出现两个相同的 case 常量。

        switch 表达式类型

        必须是整数类型(包括 char 和 enum),注意:

        char

        实际上是一个小整数,可以用在 switch 中。

        实际上是一个小整数,可以用在 switch 中。


        完整的进阶示例:简易计算器

        用 switch 实现一个计算器(支持 +、-、*、/):

        #include <stdio.h>

        int main() {

        char op;

        double a, b, result;

        printf("请输入表达式 (如 3 + 5):");

        scanf("%lf %c %lf", &a, &op, &b);

        switch (op)

        {

        case '+':

        result = a + b;

        break;

        case '-':

        result = a - b;

        break;

        case '*':

        result = a * b;

        break;

        case '/':

        if (b != 0)

        result = a / b;

        else

        {

        printf("错误:除数不能为0\n");

        return 1;

        }

        break;

        default:

        printf("不支持的运算符\n");

        return 1;

        }

        printf("%.2f %c %.2f = %.2f\n", a, op, b, result);

        return 0;

        }


        switch

        是多分支选择的利器,让代码更整洁。

      2. 是多分支选择的利器,让代码更整洁。
      3. 每个
      4. case

        后一般要加

        break

        ,除非你想利用“穿透”。

      5. ,除非你想利用“穿透”。
      6. default

        处理意外的值,建议总是写上。

      7. 处理意外的值,建议总是写上。
      8. case

        后的值必须是整型常量。

      9. 后的值必须是整型常量。
      10. 浮点数和字符串不能用
      11. switch

        ,请使用

        if-else

      12. 掌握

        switch

        语句,你就能写出更清晰、更高效的 C 语言代码,打开你的编辑器,试试用

        switch

        重写一个之前用

        if-else

        写的多分支程序吧!

        写的多分支程序吧!

        C语言 switch 语句完全指南,从入门到避坑-switch游戏下载社区