C语言-switch-case语句与多分支结构

article/2025/5/19 0:24:55

一、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


http://chatgpt.dhexx.cn/article/8LB654Mg.shtml

相关文章

C语言——switch case 语句判断学生成绩

C语言——switch case 语句判断学生成绩 switch case 讲解: switch&#xff08;&#xff09;&#xff0c;在括号里输入所定义的变量&#xff0c;接着在&#xff08;&#xff09;后面输入一个{}大括号&#xff0c;把每一个分支语句放在大括号中。 switch()写法: int main()…

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

背景&#xff1a;在看 wireshark 的解析协议部分的源码时&#xff0c;发现很多的 switch case 语句&#xff0c;case 后没有语句 的情况&#xff0c;随处可见的这种情况&#xff0c;产生疑惑&#xff0c;报文解析就是很好的例子。 例如&#xff1a;wireshark-3.2.17/epan/diss…

补充switch语句的内容和逗号运算符(C语言case后没有break的switch语句,会继续执行后面的语句再退出)

补充switch语句的内容和逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出补充逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出 对于switch语句&#xff0c;我们在使用的时候都会注意使用的规范&#…

c语言 case break,C语言中switch...case语句中break的重要性

在C语言中switch...case语句是经常用到的&#xff0c;下面我介绍一下在使用该语句时候需要注意的一个细节问题。话不多说&#xff0c;直接举例子&#xff1a; 例子1&#xff1a; switch(fruit) { case 1:printf("apple"); break; case 2:printf("banana");…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a; #include int main() { int n1; int m2; switch(n) { case 1: m; case 2: n; case 3: switch(n) { case 1: n; case 2: m; n; break; } case 4: m; break; default: break; } printf("%d %d",m,n); return 0…

c语言 switch案例,c语言switch case语句使用例子

c语言switch case语句使用例子 发布时间&#xff1a;2020-04-23 11:48:53 来源&#xff1a;亿速云 阅读&#xff1a;421 作者&#xff1a;小新 这篇文章主要为大家详细介绍了c语言switch case语句使用例子&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值…

c语言的case语句怎么用,c语言的switchcase语句用法

凡是使用过的人都会有同2113样的感觉—5261—C语言的使用灵活这个特点既是优点又是4102缺点&#xff0c; 因为对1653精通C语言的用户来讲&#xff0c; 灵活就意味着编程可以无拘无束&#xff0c; 甚至随心所欲&#xff1b; 但对初学者或者是尚未摸着规律的用户来说&#xff0c;…

case是c语言变量名吗,case是什么意思_c语言中case是什么意思

c语言中case是什么意思 是程序的入口,一般结合switch使用 举个例子: int a=2; switch(a){ case 1:prinf("1");break; case 2:prinf("2");break; default:prinf("3"); } 就表示根据a的值进行判断,a的值与 case后面的哪个值相等,就执行哪个cas…

【C语言】case 关键字

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

c语言库函数总结----math.h库

思维导图大纲 前言 上回总结了string.h常用的字符串操作函数,这次总结一下另外的一个库函数math.h和数字运算有关联的库。 double acos(double x) 函数原型:double acos(double x) 功能:返回以弧度表示的 x 的反余弦。arcos(x);//时间:2019年11月15日 //作者:Kroner //编…

c语言实现库函数

目录 一.strlen函数 1.描述 2.实现 1.计数的方法 2.函数递归的方法 3.指针 - 指针方法 二.strcmp函数 1.描述 2.实现 三.strcpy函数的实现 1.描述 2.实现 四.strcat函数的实现 1.描述 2.实现 五.strstr函数的实现 1.描述 2.实现 1.BF算法实现 2.kmp算法的实现…

C语言 库函数:qsort 详解

目录 1.qsort的介绍与使用方法 2.介绍void*​ 3.举例使用qsort​ 4. qsort的模拟实现&#xff0c;了解其运作原理​ 1.qsort的介绍与使用方法 2.介绍void* 3.举例使用qsort #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include…

C语言库函数查找工具MSDN

一、前言   库函数在我们写程序的时候会在很大程度上提高我们的效率&#xff0c;我知道很多人可能像我一样&#xff0c;很多时候并不是不知道可以用库函数来实现&#xff0c;但就是不知道库函数如何使用&#xff0c;所以今天呢博主就来推荐资源了——C语言库函数查找工具《MS…

文件编程概念(C语言库函数系统调用API)

文件编程&#xff08;文件IO&#xff09; 文件编程就是操作文件&#xff0c;对文件进行打开&#xff0c;关闭&#xff0c;读、写等操作&#xff08;个人理解&#xff09;。之前C语言编写程序运行都是对键盘和显示器进行的&#xff0c;运行程序时会默认打开的三个文件 标准输入流…

c语言库函数大全文库,C语言库函数源代码

C语言库函数源代码 C语言库函数源代码 strstr ( )/* -- C语言库函数源代码 - */ /* 得到s1中第一次包含s2字符串的位置指针。 */ #include stdlib.h char * my_strstr(const char *s1,const char *s2) { if (*s1 0) { if (*s2) return (char *) NULL; return (char *) s1; } …

C语言常用的库函数 (自用)

常用的库函数 1.前言2.内容1.toupper()2.tolower()3.sprintf()4.abs()5.fabs()6.labs()7.scanf()8.itoa() 3.小声bb4.更新日志 1.前言 在刷题过程中&#xff0c;总能看到dl用一些库函数&#xff0c;简化算法&#xff0c;由此萌生慢慢学习整理常用的库函数的想法&#xff0c;本…

c语言的库函数

一、标准C库函数(15个) 二、数学函数 用于求幂&#xff0c;计算平方跟&#xff0c;求绝对值。#include <math.h>绝对值函数用于表达式的结构转换为非负函数 int x-3; printf("|%d|%d\n",x,abs(x)); 三、字符串处理函数 四、字符处理函数 五、转换函数和存储管…

MySQL 远程访问失败的原因及解决方案

文章目录 1、失败的原因1.1、 /etc/mysql/my.cnf文件中bind-address 127.0.0.1没有注释掉1.2、 端口3306没有开放&#xff0c;使用 ss -tlnp 命令查看网络端口开启状态1.3、 在MySQL数据库user表中host字段值为localhost 2、解决方案2.1、/etc/mysql/my.cnf文件中&#xff0c;…

mysql5.7.6允许远程_mysql5.7 设置远程访问

mysql5.7设置远程访问不是和网上说的一样建个用户赋个权限就可以访问的。比如下边这个就是建用户赋权限&#xff0c;可能在之前的版本可以&#xff0c;但是我在我的mysql上一直不行。为此烦了好久&#xff01;&#xff01;&#xff01;项目都耽误了&#xff01;&#xff01; 一…

Mysql远程访问权限

在阅读本文时&#xff0c;推荐先走读完浅谈Mysql权限控制一文。 Mysql启动默认的端口3306是打开的&#xff0c;此时打开了mysqld的网络监听&#xff0c;允许用户远程通过账号密码连接本地数据库&#xff0c;Mysql数据库默认是允许远程用户连接服务器的。 那么&#xff0c;为什…