2025年6月9日 星期一 乙巳(蛇)年 三月十三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

switch语句用法注意事项,如何正确使用switch语句

时间:03-07来源:作者:点击数:64

相对于 if 语句而言,switch 语句可以更方便地应用于多个分支的控制流程。C89 指明,一个 switch 语句最少可以支持 257 个 case 语句,而 C99 则要求至少支持 1023 个 case 语句。然而,在实际开发环境中,为了程序的可读性与执行效率,应该尽量减少 switch 语句中的 case 语句。

除此之外,switch 语句与 if 语句不同的是,switch 语句只能够测试是否相等,因此,case 语句后面只能是整型或字符型的常量或常量表达式;而在 if 语句中还能够测试关系与逻辑表达式。

不要忘记在 case 语句的结尾添加 break 语句

在 switch 语句中,每个 case 语句的结尾不要忘记添加 break 语句,否则将导致多个分支重叠。当然,除非有意使多个分支重叠,这样可以免去 break 语句。下面我们来看一个实际示例。

  • #include <stdio.h>
  • void print_week(unsigned int day);
  • void print_week(unsigned int day)
  • {
  • switch(day)
  • {
  • 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");
  • break;
  • }
  • }
  • int main (void)
  • {
  • print_week(3);
  • return 0;
  • }

该程序中,在 print_week 函数中通过 switch 语句实现根据数字输出星期名称的功能。执行代码,程序将输出“Wednesday”。

现在,如果将 case 1~case 4 的 break 语句去掉,如下代码所示,程序会输出什么结果呢?

  • #include <stdio.h>
  • void print_week(unsigned int day);
  • void print_week(unsigned int day)
  • {
  • switch(day)
  • {
  • 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");
  • break;
  • case 6:
  • printf("Saturday\n");
  • break;
  • case 7:
  • printf("Sunday\n");
  • break;
  • default:
  • printf("error\n");
  • break;
  • }
  • }
  • int main (void)
  • {
  • print_week(3);
  • return 0;
  • }

运行结果为:
          Wednesday
          Thursday
          Friday

不要忘记在 switch 语句的结尾添加 default 语句

在 switch 语句中,default 语句主要用于检查默认情况,或者处理错误情况,如下面的示例代码所示:

  • default:
  • printf("error\n");
  • break;

如果在 switch 语句中去掉 default 语句,那么 switch 语句将失去对默认情况与错误情况的处理能力。所以,奉劝大家不要偷懒,老老实实把每一种情况都用 case 语句来完成,而把真正对默认情况的处理交给 default 语句来完成。即使程序真的不需要 default 处理,也应该保留此语句:

  • default:
  • break;

这样做并非画蛇添足,可以避免令人误以为你忘记了 default 处理。

不要为了使用 case 语句而刻意构造一个变量

在实际编程应用中,switch 中的 case 语句应该只用于处理简单的、容易分类的数据。如果数据并不简单,却为了使用 case 语句而刻意构造一个变量,那么这种变量很容易令我们得不偿失。因此应该严格避免这种变量,并使用 if/else 结构来处理这类程序,如下面的示例代码所示:

  • char ch = c[0];
  • switch (ch)
  • {
  • case 'a':
  • f1();
  • break;
  • case 'b':
  • f2();
  • break;
  • case 'c':
  • f3();
  • break;
  • default:
  • break;
  • }

在上面的程序中,字符变量 ch 的值是取字符数组 c[] 的第一个字符,与 case 语句中的常量值逐一进行比较。很显然,这种方法存在一个严重的问题。

例如,如果字符数组 c[] 中存储的是“ab”字符串,那么 c[0] 会取第一个字符“a”与 case 语句进行匹配,因此会匹配到第一个 case 语句,并调用 f1() 函数。然而,如果字符数组 c[] 中存储的是其他以字符 a 开头的字符串(比如“abc”“abcd”“abcde”等),因为 c[0] 始终会取第一个字符的关系,因此它们同样会匹配第一个 case 语句而调用 f1() 函数。其他的 case 语句同理。很显然,这并不是我们想要的结果。

由此可见,当为了使用 case 语句而刻意构造一个变量时,真正的数据可能不会按照我们所希望的方式映射到 case 语句。因此,我们应该严格避免为了使用 case 语句而刻意构造一个变量,并使用 if/else 结构来处理这类程序,如下面的示例代码所示:

  • if(0 == strcmp("ab",c))
  • {
  • f1();
  • }
  • else if(0 == strcmp("bc",c))
  • {
  • f2();
  • }
  • else if(0 == strcmp("cd",c))
  • {
  • f3();
  • }
  • else
  • {
  • }

尽量将长的 switch 语句转换为嵌套的 switch 语句

有时候,当一个 switch 语句中包括很多个 case 语句时,为了减少比较的次数,可以把这类长 switch 语句转为嵌套 switch 语句,即把发生频率高的 case 语句放在一个 switch 语句中,作为嵌套 switch 语句的最外层;把发生频率相对低的 case 语句放在另一个 switch 语句中,放置于嵌套 switch 语句的内层。

例如,下面的代码把发生频率相对较低的情况放置于默认的 case 语句内。

  • void print_week(unsigned int day)
  • {
  • switch(day)
  • {
  • 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;
  • default:
  • switch(day)
  • {
  • case 6:
  • printf("Saturday\n");
  • break;
  • case 7:
  • printf("Sunday\n");
  • break;
  • default:
  • printf("error\n");
  • break;
  • }
  • }
  • }

在上面的代码中,假设 case 6 与 case 7 不经常发生,因此将它们放置到嵌套 switch 语句的最内层。从表面看,虽然这样损失了程序的一定可读性,但当 case 语句很多,并且确实有些 case 语句发生的频率比较低时,这种解决方案还是可取的。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门