一、switch-case语句

1. switch语句中的每个语句段中都使用break语句

switch-case语句的一般形式为:

 switch (表达式){case 常量表达式1: 语句段1;break;case 常量表达式2:语句段2;break;...case 常量表达式n:语句段n;break;default:语句段n+1;break;}

这是switch-case语句的一般用法,即每个case语句后面配一个break语句,其执行流程图如下:

执行流程:首先求解表达式,如果这个表达式的值与某个常量表达式的值相等,则执行该常量表达式后的相应语句段,如果表达式的值与任何一个常量表达式的值都不行等,则执行deafult后的语句段,最后执行break语句,跳出switch语句。

switch语句中,表达式和常量表达式的值一般是整型或者字符型,所有的常量表达式的值都不能相等。每个语句段可以包括一条或多条语句,也可以为空语句。
switch语句中的default可以省略,省略后,当表达式的值与任何一个常量表达式都不行等时,就什么也不执行。
注: 1、switch语句中的常量表达式必须是整型或者字符型,不能为浮点类型,否则编译器会报错。
2、case后的必须为常量表达式,不能为关系表达式,如x>0,x==3这样的表达式是不合法的。
3、case后的常量表达式可以为const修饰的常变量,但此时只有C99以后的标准才会支持!

例1:查询自动售货机中商品的价格

假设自动售货机出售4种商品:薯片(crisps)、爆米花(popcorn)、巧克力(chocolate)和可乐(cola),售价分别是每份3.0、2.5、4.0和3.5元。在屏幕上显示以下菜单(编号和选项),用户可以连续查询商品的价格,当查询次数超过5次时,自动退出查询;不到5次时,用户可以选择退出。当用户输入编号1~4,显示相应商品的价格(保留1位小数);输入0,退出查询;输入其他编号,显示价格为0。
  [1] Select crisps
  [2] Select popcorn
  [3] Select chocolate
  [4] Select cola
  [5] Exit

#include <stdio.h>int main(void)
{int choice, i;double price;/*以下5行显示菜单*/printf("[1] Select crisps\n");        /*查询薯片价格*/printf("[2] Select popcorn\n");     /*查询爆米花价格*/printf("[3] Select chocolate\n");  /*查询巧克力价格*/printf("[4] Select cola\n");       /*查询可乐价格*/printf("[0] Exit\n");               /*退出查询*/for (i=1; i<=5; i++){                printf("Enter choice:");      scanf("%d", &choice);/*如果输入0,提前结束for循环*/if (choice == 0)break;                      /*此处用break跳出for循环*//*根据输入的编号,将相应的价格赋给price*/switch (choice){case 1: price = 3.0; break; /*用break跳出switch语句*/case 2: price = 2.5; break;case 3: price = 4.0; break;case 4: price = 3.5; break;default: price = 0.0; break;}/*输出商品的价格*/printf("price = %0.1f\n", price);}printf("Thanks\n");                 /*结束查询,谢谢用户使用*/return 0;
}

[1] Select crisps
[2] Select popcorn
[3] Select chocolate
[4] Select cola
[0]  Exit
Enter choice:3
price = 4.0
Enter choice:2
price = 2.5
Enter choice:8
price = 0.0
Enter choice:0
Thanks

例2:两个数的简单计算器

编写一个简单计算器程序,可根据输入的运算符,对两个整数进行加、减、乘、除和求余运算,请对除数为0的情况做特别处理。要求使用switch语句编写。

#include <stdio.h>int main(void)
{int value1, value2;char op;printf("Type in an expression:"); scanf("%d%c%d", &value1, &op, &value2);switch (op) {case '+':printf("= %d\n", value1+value2);break;case '-':printf("= %d\n", value1-value2);break;case '*':printf("= %d\n", value1*value2);break;case '/':if (value2 != 0){printf("= %d\n", value1/value2);} else {                                /*对除数为0做特殊处理*/printf("Divisor can not be 0!\n");}break;case '%':if (value2 != 0){printf("= %d\n", value1%value2);} else {                               /*对除数为0做特殊处理*/printf("Divisor can not be 0!\n");  }break;default:printf("Unknown operator\n");break;}return 0;
}

Type in an expression:8%8
= 0

Type in an expression:-3&0
Unknown operator

注意: scanf()输入表达式时,数字和运算符之间不能有空格!想要兼容空格需要对空格做处理。

2. switch语句中某些语句段使用break语句

break语句在switch语句中是可选的,若不使用break,则其一般形式为:

 switch (表达式){case 常量表达式1:语句段1;case 常量表达式2:语句段2;...case 常量表达式n:语句段n;default: 语句段n+1;}

其执行流程图是上个流程图里虚框里的内容。执行过程:求解表达式后,如果表达式的值与某个常量表达式的值相等,则执行该常量表达式后的所有语句段,如果表达式的值与任何一个常量表达式的值都不相等,则执行default后的所有语句段。
其中break语句的作用是跳出switch语句,可以在case语句后按需要给其配一个break语句。根据表达式的值执行相应常量表达式后的语句后,switch语句会继续执行以下的所有程序,无论case后面的常量表达式为何值,都会按顺序执行所有的可执行的语句,直到遇到break语句才会跳出switch语句。break语句在循环中的作用也很大。

例:统计字符

输入一个正整数n,再输入n个字符,分别统计出其中空格或回车、数字字符和其他字符的个数。要求使用switch语句编写。

#include <stdio.h>int main(void)
{int blank, digit, i, n, other;char ch;blank = digit = other = 0;            /*置存放统计结果的3个变量的初值为零*/printf("Enter n:");  scanf("%d", &n);              getchar();                          /*读入并舍弃换行符*/printf("Enter %d characters:", n);    for (i=1; i<=n; i++){            ch = getchar();    /*在switch语句中灵活应用break*/switch (ch){case ' ':                  /*语句段为空,请注意空格符的表示方式*/case '\n':blank++;              /*两个常量表达式' '和'\n'共用该语句段*/break;                 /*跳出switch语句*/case '0': case '1': case '2': case '3': case '4':case '5': case '6': case '7': case '8': case '9':digit++;              /*10个常量表达式'0'-'9'共用该语句段*/break;                 /*跳出switch语句*/default:other++;                /*累加其他字符*/break;}}printf("blank = %d, digit = %d, other = %d\n", blank, digit, other);return 0;
}

Enter n:12
Enter 12 characters:7634
43 &*fo

blank = 2, digit = 6, other = 4

从该例可以看到:switch语句中case后的常量表达式可以为空,这样如果表达式的值与之相匹配,会按照顺序执行下一个语句段,即两个或多个常量表达式可以共用一个语句段。该段程序的常量表达式’ ‘和’\n’共用一个表达式;常量表达式’0’~'9’也是共用一个语句段。灵活使用break语句就可以实现一些特定的需求。
注: 本例中也可以看出,多分支结构switch-case也可以实现,但是有时候if-else语句更有优势。例如case后面就不可以写成case ch>='0' && ch<='9'这样的形式,而用if语句就可以轻松实现!switch和if语句各有优势。

二、多分支结构

如前文switch-case语句可以实现多分支结构,同样嵌套的if语句也可以实现多分支结构。它的一般形式如下:

 if (表达式1)if (表达式2) 语句1;else 语句2;elseif (表达式3) 语句3else 语句4;

其流程图如下:

嵌套的if-else语句,要注意其中else与if的匹配,其匹配规则是:else总是与最靠近它的、没有与别的else匹配过的if相匹配。例如:

 if (表达式1)if (表达式2) 语句1;elseif (表达式3) 语句2;else 语句3;

注意:这里尽管格式上第一个else与第一个if对齐,但是第一个else仍然是与第二个if相对应的。一般来说,内嵌的if-else语句最好不要省略大括号,这样结构清晰,直观。因为大括号内的相当于一个语句。所以上式可以改写为:

 if (表达式1){if (表达式2) 语句1;} else {if (表达式3) 语句2;else 语句3;}

这样可以很明显看出第一个if同第一个else相匹配。结构较清晰。
以前的文章里所讲的级联的else-if语句同样可以实现多分支结构。https://blog.csdn.net/passxgx/article/details/123473026?spm=1001.2014.3001.5501

三、总结

通过上文可以看到,实现多分支结构可以使用if-else语句,或者级联的else-if结构。同样也可以使用switch-case语句,但是switch-case语句仅能是常量表达式,例如表示一些分段函数的情况下,远没有if语句方便简单。switch-case语句的优点是结构清晰,直观,可读性强。如果if-else语句嵌套过多,可读性会大大降低,相对来说级联的else-if语句直观一些,但没有switch-case结构清晰。在设计程序时要根据需要选择合适的语句来实现多分支结构。

参考 C语言程序设计(第4版)/何钦铭,颜晖
例题及课后习题参考程序https://gitee.com/sgxgitee/mooc-c

C语言-switch-case语句与多分支结构相关推荐

  1. C语言switch case语句详解

    当分支比较少的时候我们使用if else语句解决,当分支比较多的时候,我们要使用switch case语句解决,针对分支的复杂性选择合适的程序解决. 当分支过多时,用 if else 处理会不太方便, ...

  2. c语言中case的作用,C语言switch case 语句

    switch 语句根据控制表达式的值,可以把程序流跳转到多个语句中的一个执行: switch (表达式) 语句 括号里的表达式具有整数类型,并且这里的语句就是该 switch 主体,它包括了多个 ca ...

  3. C语言--switch case 语句,case 后没有语句

    背景:在看 wireshark 的解析协议部分的源码时,发现很多的 switch case 语句,case 后没有语句 的情况,随处可见的这种情况,产生疑惑,报文解析就是很好的例子. 例如:wires ...

  4. c语言switch case解释,C语言switch case语句详解

    C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英 ...

  5. c语言switch case语句范围,C语言switch case语句详解

    C语言虽然没有限制 if else 能够处理的分支数量,但当分支过多时,用 if else 处理会不太方便,而且容易出现 if else 配对出错的情况.例如,输入一个整数,输出该整数对应的星期几的英 ...

  6. Java的简单if和switch条件语句的简单分支结构介绍

    一.if分支结构 根据判定结果的真或者假决定执行某个分支的代码,如果判定结果为真则执行条件语句后面的代码否则则进入到下一个条件语句进行判定 if分支结构的三种格式 格式1: if(条件语句){ 语句体 ...

  7. C语言--switch case语句

    switch (val){case 1:printf("1层开!\n");break;case 2:printf("2层开!\n");break;case 3: ...

  8. 看完这篇文章,保你学会C语言switch case 语句

    我的个人主页:☆光之梦☆的博客_CSDN博客-C语言基础语法(超详细)领域博主 欢迎各位

  9. C语言if条件语句(单分支结构)

    if 语句满足某种条件,就进行相应的处理.可以通过"如果张三听话,妈妈就给他买个篮球."这句话用伪代码表示: if(如果张三听话) {妈妈就给他买个篮球 } 在C语言中,if 语句 ...

  10. C#switch case语句

    @作者: 风不停息丶 文章目录 switch case语句基本语法 实例 switch case语句基本语法 计算表达式并对照多个常数值分支到不同的代码块. 基本语句 switch (表达式) {ca ...

最新文章

  1. JVM虚拟机(四):JVM 垃圾回收机制概念及其算法
  2. 关于如如何运行tensorrt
  3. SAP里面的ATP的定义
  4. 抖音计算机音乐你要我,抖音上很火的我要你快乐我要你快乐是什么歌?
  5. C语言 第五章 循环结构
  6. 兴趣记忆法(1)顺口溜记忆
  7. Maven内部版本号插件–用法示例
  8. 十分钟了解HTTPS协议
  9. 创建.NET Core程序的Nuget Package
  10. 实验四 数组程序设计
  11. 解决办法:对‘operator delete(void*)’未定义的引用
  12. macos设置环境变量path详解
  13. 思维导图c语言java区别_C语言基本数据类型的思维导图
  14. 文字超出部分用省略号表示
  15. 数字+字母+特殊字符 的正则表达式
  16. (三)Grahpics之Blit
  17. JAVA#内部类'学习札记
  18. 布隆过滤器与布谷鸟过滤器
  19. linux忘了用户名和密码_Linux 服务器忘记用户名密码的找回办法总结linux操作系统 -电脑资料...
  20. 计算机应用龙头股票2018,2018传媒股票龙头一览 传媒股超跌反弹或迎新机遇

热门文章

  1. 在Debian上用FVWM做自己的桌面
  2. element build 打包之后生产环境图标偶尔乱码
  3. Win10默认浏览器没有edge的选项该怎么办?
  4. oracle 日期改字符格式_Oracle时间转换成字符串
  5. 守着大房 心却越来越空
  6. 果链“围城”:傍上苹果,是一场甜蜜与苦楚交错的旅途
  7. 基于springboot的毕业设计管理系统
  8. shell脚本-循环
  9. oracle转trs,TRS数据库数据的导入导出2.doc
  10. java全文检索工具_TRS全文检索开发文档及API,工具包