本文目录导读:

  1. 基本语法结构
  2. break:跳出switch的“刹车”
  3. 巧用fall through:合并多个case
  4. default:最后的王牌
  5. 表达式类型与强制转换
  6. 常见错误与陷阱
  7. switch vs if-else:如何选择?
  8. 实战:简易计算器

在C语言中,

switch

语句是一种多分支选择结构,它允许程序根据一个整型表达式的值,跳转到对应的

case

标签处执行代码,相比一串

if-else if

的嵌套,

switch

让代码更清晰、更高效,本文将从基础语法、break机制、fall through现象、常见陷阱到实战技巧,全面解析C语言中switch的用法。

让代码更清晰、更高效,本文将从基础语法、break机制、fall through现象、常见陷阱到实战技巧,全面解析C语言中switch的用法。


基本语法结构

switch (表达式) {

case 常量1:

语句块1;

break;

case 常量2:

语句块2;

break;

// 更多case...

default:

默认语句块;

break;

}

  • 表达式

    :必须是整型(

    int

    char

    enum

    等)或能隐式转换为整型的类型。不能是浮点数或字符串

  • 等)或能隐式转换为整型的类型。不能是浮点数或字符串
  • case

    后面必须是整型常量表达式(例如数字、字符常量、枚举成员,或通过

    #define

    定义的常量),且各

    case

    值不能重复。

  • 值不能重复。
  • default

    是可选的,当所有

    case

    都不匹配时执行。

  • 都不匹配时执行。

  • break:跳出switch的“刹车”

    每一个

    case

    分支末尾通常加

    break

    ,否则会发生“fall through”(穿透)——继续执行下一个

    case

    的代码,无论是否匹配。

    的代码,无论是否匹配。

    int grade = 2;

    switch (grade) {

    case 1:

    printf("优秀\n");

    break;

    case 2:

    printf("良好\n");

    // 没有break!

    case 3:

    printf("及格\n");

    break;

    }

    // 输出:

    // 良好

    // 及格

    解释:匹配

    case 2

    后执行

    printf("良好\n")

    ,因为没有

    break

    ,程序“穿透”到

    case 3

    继续执行,直到遇到下一个

    break

    或switch结束。

    或switch结束。


    巧用fall through:合并多个case

    故意省略

    break

    可以实现多个值共享同一段代码。

    可以实现多个值共享同一段代码。

    char ch = 'a';

    switch (ch) {

    case 'a':

    case 'e':

    case 'i':

    case 'o':

    case 'u':

    printf("元音字母\n");

    break;

    default:

    printf("辅音字母\n");

    }

    这里

    'a'

    'e'

    'i'

    'o'

    'u'

    五个case都执行同一行输出,注意:每个case后面不需要break,但最后一个case(这里

    'u'

    )后面要有break,否则会继续执行default。

    )后面要有break,否则会继续执行default。


    default:最后的王牌

    default

    可以放在

    switch

    的任何位置(不一定是最后),放置位置会影响fall through行为:

    的任何位置(不一定是最后),放置位置会影响fall through行为:

    int x = 2;

    switch (x) {

    default:

    printf("没有匹配\n");

    // 没有break

    case 1:

    printf("case 1\n");

    break;

    case 2:

    printf("case 2\n");

    break;

    }

    // 输出:case 2

    如果

    x

    是3,则会匹配

    default

    ,打印“没有匹配”,然后穿透到

    case 1

    (因为没有break),再打印“case 1”,最后遇到break退出,这种写法容易引起歧义,推荐将default放在末尾,并加上

    break


    表达式类型与强制转换

    switch

    表达式必须是整型,但

    char

    和枚举在C语言中本质上是整型,所以可以:

    和枚举在C语言中本质上是整型,所以可以:

    enum Week {MON=1, TUE, WED};

    enum Week today = WED;

    switch (today) {

    case MON: printf("周一"); break;

    case TUE: printf("周二"); break;

    case WED: printf("周三"); break;

    }

    注意:不能对

    float

    double

    使用switch,也不能对

    const char*

    字符串使用——如果希望根据字符串分支,只能用

    if-else strcmp()


    常见错误与陷阱

    1. 忘记break:导致非预期的fall through(有时是bug,有时是技巧)。
    2. case值重复:编译器报错“duplicate case value”。
    3. case后面不是常量表达式case i:

      (i是变量)——错误,必须用常量。

    4. (i是变量)——错误,必须用常量。
    5. switch表达式与case类型不匹配:隐式转换可能导致意想不到的结果,
    6. switch('A')

      实际使用ASCII值65。

    7. 实际使用ASCII值65。
    8. 在case中定义变量:C标准不允许在
    9. case

      后面直接定义变量(除非用花括号括起语句块):

    10. 后面直接定义变量(除非用花括号括起语句块):
    11. switch (x) {

      case 1:

      int y = 10; // 错误!C89不允许,C99允许但不能跳过初始化

      printf("%d", y);

      break;

      }

      正确做法:要么在switch外定义,要么用花括号:

      switch (x) {

      case 1: {

      int y = 10;

      printf("%d", y);

      break;

      }

      }


      switch vs if-else:如何选择?

      场景推荐
      分支条件基于单个整型变量,且分支数较多(≥3)switch(可读性更好,编译器可能优化为跳转表)
      分支条件涉及范围判断(如x > 10

      )、浮点数、字符串比较if-else
      分支数少于3,或逻辑复杂(&&、
      需要动态计算分支(运行时决定)if-else
      )、浮点数、字符串比较if-else
      分支数少于3,或逻辑复杂(&&、
      需要动态计算分支(运行时决定)if-else


      实战:简易计算器

      #include <stdio.h>

      int main() {

      char op;

      double a, b;

      printf("请输入运算符(+, -, *, /): ");

      scanf("%c", &op);

      printf("请输入两个操作数: ");

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

      switch (op) {

      case '+':

      printf("%.2f + %.2f = %.2f\n", a, b, a + b);

      break;

      case '-':

      printf("%.2f - %.2f = %.2f\n", a, b, a - b);

      break;

      case '*':

      printf("%.2f * %.2f = %.2f\n", a, b, a * b);

      break;

      case '/':

      if (b != 0)

      printf("%.2f / %.2f = %.2f\n", a, b, a / b);

      else

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

      break;

      default:

      printf("无效运算符\n");

      }

      return 0;

      }


      switch

      是C语言中高效的多分支选择工具,适用于整型常量比较。

    12. 是C语言中高效的多分支选择工具,适用于整型常量比较。
    13. 合理使用
    14. break

      控制流程,注意fall through的双刃剑特性。

    15. 控制流程,注意fall through的双刃剑特性。
    16. 始终使用
    17. default

      处理未预料的值,提高代码健壮性。

    18. 处理未预料的值,提高代码健壮性。
    19. case

      中声明变量时要小心,使用花括号创建局部作用域。

    20. 中声明变量时要小心,使用花括号创建局部作用域。
    21. 掌握好switch,能让你的C代码更简洁、更专业,打开你的编译器,试试用switch重写一段冗长的if-else代码吧!

      C语言中switch的用法,从入门到精通-switch游戏下载社区