- C编程教程
- C - 首页
- C语言基础
- C - 概述
- C - 特性
- C - 历史
- C - 环境设置
- C - 程序结构
- C - Hello World
- C - 编译过程
- C - 注释
- C - 词法单元
- C - 关键字
- C - 标识符
- C - 用户输入
- C - 基本语法
- C - 数据类型
- C - 变量
- C - 整数提升
- C - 类型转换
- C - 类型强制转换
- C - 布尔值
- C语言中的常量和字面量
- C - 常量
- C - 字面量
- C - 转义序列
- C - 格式说明符
- C语言中的运算符
- C - 运算符
- C - 算术运算符
- C - 关系运算符
- C - 逻辑运算符
- C - 位运算符
- C - 赋值运算符
- C - 一元运算符
- C - 自增和自减运算符
- C - 三元运算符
- C - sizeof运算符
- C - 运算符优先级
- C - 其他运算符
- C语言中的决策
- C - 决策
- C - if语句
- C - if...else语句
- C - 嵌套if语句
- C - switch语句
- C - 嵌套switch语句
- C语言中的循环
- C - 循环
- C - while循环
- C - for循环
- C - do...while循环
- C - 嵌套循环
- C - 无限循环
- C - break语句
- C - continue语句
- C - goto语句
- C语言中的函数
- C - 函数
- C - 主函数
- C - 按值调用函数
- C - 按引用调用函数
- C - 嵌套函数
- C - 可变参数函数
- C - 用户自定义函数
- C - 回调函数
- C - 返回语句
- C - 递归
- C语言中的作用域规则
- C - 作用域规则
- C - 静态变量
- C - 全局变量
- C语言中的数组
- C - 数组
- C - 数组的特性
- C - 多维数组
- C - 将数组传递给函数
- C - 从函数返回数组
- C - 变长数组
- C语言中的指针
- C - 指针
- C - 指针和数组
- C - 指针的应用
- C - 指针运算
- C - 指针数组
- C - 指针到指针
- C - 将指针传递给函数
- C - 从函数返回指针
- C - 函数指针
- C - 指向数组的指针
- C - 指向结构体的指针
- C - 指针链
- C - 指针与数组
- C - 字符指针和函数
- C - 空指针
- C - void指针
- C - 悬空指针
- C - 解引用指针
- C - 近、远和巨型指针
- C - 指针数组的初始化
- C - 指针与多维数组
- C语言中的字符串
- C - 字符串
- C - 字符串数组
- C - 特殊字符
- C语言中的结构体和联合体
- C - 结构体
- C - 结构体和函数
- C - 结构体数组
- C - 自引用结构体
- C - 查找表
- C - 点(.)运算符
- C - 枚举(或enum)
- C - 结构体填充和打包
- C - 嵌套结构体
- C - 匿名结构体和联合体
- C - 联合体
- C - 位域
- C - Typedef
- C语言中的文件处理
- C - 输入和输出
- C - 文件I/O(文件处理)
- C预处理器
- C - 预处理器
- C - 指令
- C - 预处理器运算符
- C - 宏
- C - 头文件
- C语言中的内存管理
- C - 内存管理
- C - 内存地址
- C - 存储类
- 其他主题
- C - 错误处理
- C - 可变参数
- C - 命令执行
- C - 数学函数
- C - static关键字
- C - 随机数生成
- C - 命令行参数
- C编程资源
- C - 问答
- C - 快速指南
- C - 速查表
- C - 有用资源
- C - 讨论
C语言中的switch语句
一个switch语句允许将一个变量与其值的列表进行比较。每个值称为一个case,并且正在切换的变量会针对每个switch case进行检查。
C语言switch-case语句
switch-case语句是C语言中的一个决策语句。if-else语句提供了两个备选操作,而switch-case结构是一个多路分支语句。C语言中的switch语句通过将单个变量与其多个值进行比较,根据匹配情况执行特定代码来简化多路选择。它允许将变量与其值的列表进行比较。
switch-case语句的语法
程序的流程可以将行执行切换到满足给定case的分支。switch-case结构的使用示意图如下所示:
switch (Expression){ // if expr equals Value1 case Value1: Statement1; Statement2; break; // if expr equals Value2 case Value2: Statement1; Statement2; break; . . // if expr is other than the specific values above default: Statement1; Statement2; }
switch-case语句如何工作?
switch关键字前面的括号包含一个表达式。该表达式应计算为整数或字符。在括号后面的花括号内,表达式的不同可能值形成case标签。
case标签前面的冒号(:)前的一个或多个语句形成一个代码块,当表达式等于标签的值时执行该代码块。
你可以将switch-case字面翻译为“如果表达式等于value1,则执行block1”,依此类推。
C语言会将表达式与每个标签值进行比较,并执行第一个匹配项前面的代码块。每个case代码块的最后一个语句都是一个break。 break语句将控制权移出switch结构的范围。
你还可以将default case定义为switch结构中的最后一个选项。当表达式与任何先前的case值都不匹配时,执行default case代码块。
switch-case语句的流程图
表示C语言中switch-case结构的流程图如下所示:
使用switch-case语句的规则
以下规则适用于switch语句:
switch语句中使用的表达式必须具有整型或枚举类型,或者属于一个类类型,其中该类具有一个到整型或枚举类型的单一转换函数。
你可以在一个switch中拥有任意数量的case语句。每个case后面跟着要比较的值和一个冒号。
当正在切换的变量等于某个case时,该case后面的语句将执行,直到遇到break语句。
遇到break语句时,switch将终止,并且控制流跳转到switch语句后面的下一行。
并非每个case都需要包含break。如果没有出现break,控制流将贯穿到后续的case,直到遇到break为止。
switch语句可以有一个可选的default case,它必须出现在switch的末尾。default case可用于在没有case为真时执行任务。default case不需要break。
switch-case语句作为级联if-else语句的简洁替代方案,尤其是在“if”中的布尔表达式基于“=”运算符时。
如果if(或else)代码块中有多个语句,则必须将它们放在花括号内。因此,如果你的代码有许多if和else语句,则带有许多花括号开合的代码看起来很笨拙。switch-case替代方案是一种简洁且整洁的解决方案。
C语言switch-case语句示例
练习以下示例以学习C编程语言中的switch case语句:
示例1
在以下代码中,一系列if-else语句根据“ch”变量的值(“m”,“a”或“e”分别表示早上、下午或晚上)打印三个不同的问候语。
#include <stdio.h> int main(){ /* local variable definition */ char ch = 'e'; printf("Time code: %c\n\n", ch); if (ch == 'm') printf("Good Morning"); else if (ch == 'a') printf("Good Afternoon"); else printf("Good Evening"); return 0; }
上面代码中的if-else逻辑在下面的代码中被switch-case结构替换:
#include <stdio.h> int main (){ // local variable definition char ch = 'm'; printf("Time code: %c\n\n", ch); switch (ch){ case 'a': printf("Good Afternoon\n"); break; case 'e': printf("Good Evening\n"); break; case 'm': printf("Good Morning\n"); } return 0; }
输出
更改“ch”变量的值并检查输出。对于ch = 'm',我们得到以下输出:
Time code: m Good Morning
这里break的使用非常重要。每个case对应的语句块都以break语句结束。如果没有使用break语句会怎样?
switch-case的工作方式如下:当程序进入switch结构时,它开始将切换表达式的值与case进行比较,并执行第一个匹配项的代码块。break导致控制权移出switch范围。如果找不到break,则后续的代码块也会执行,从而导致结果不正确。
示例2:不使用Break的Switch语句
让我们注释掉上面代码中的所有break语句。
#include <stdio.h> int main (){ /* local variable definition */ char ch = 'a'; printf("Time code: %c\n\n", ch); switch (ch){ case 'a': printf("Good Afternoon\n"); // break; case 'e': printf("Good Evening\n"); // break; case 'm': printf("Good Morning\n"); } return 0; }
输出
你期望打印“Good Morning”消息,但发现打印了所有三条消息!
Time code: a Good Afternoon Good Evening Good Morning
这是因为在没有break语句的情况下,C语言会贯穿后续的case代码块。
示例3:使用Switch语句的成绩检查程序
在下面的程序中,“grade”是切换变量。对于不同等级的case,将打印相应的反馈消息。
#include <stdio.h> int main(){ /* local variable definition */ char grade = 'B'; switch(grade){ case 'A' : printf("Outstanding!\n" ); break; case 'B': printf("Excellent!\n"); break; case 'C': printf("Well Done\n" ); break; case 'D': printf("You passed\n" ); break; case 'F': printf("Better try again\n" ); break; default : printf("Invalid grade\n" ); } printf("Your grade is %c\n", grade); return 0; }
输出
运行代码并检查其输出:
Excellent! Your grade is B
现在更改“grade”(它是“char”变量)的值并检查输出。
示例4:使用Switch进行算术运算的基于菜单的计算器
以下示例显示了一个算术运算的菜单。根据运算符代码(1、2、3或4)的值,执行两个值的加法、减法、乘法或除法。如果运算符代码是其他值,则执行default case。
#include <stdio.h> int main (){ // local variable definition int a = 10, b = 5; // Run the program with other values 2, 3, 4, 5 int op = 1; float result; printf("1: addition\n"); printf("2: subtraction\n"); printf("3: multiplication\n"); printf("4: division\n"); printf("\na: %d b: %d : op: %d\n", a, b, op); switch (op){ case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: result = a / b; break; default: printf("Invalid operation\n"); } if (op >= 1 && op <= 4) printf("Result: %6.2f", result); return 0; }
输出
1: addition 2: subtraction 3: multiplication 4: division a: 10 b: 5 : op: 1 Result: 15.00
对于“op”的其他值(2、3和4),你将得到以下输出:
a: 10 b: 5 : op: 2 Result: 5.00 a: 10 b: 5 : op: 3 Result: 50.00 a: 10 b: 5 : op: 4 Result: 2.00 a: 10 b: 5 : op: 5 Invalid operation
通过组合多个Case来使用Switch语句
多个case可以组合在一起以执行一个代码块。当任何一个case值匹配时,这些组合case的主体就会执行。如果你的情况是,对于表达式的多个case标签,要执行相同的代码块,则可以通过将两个case一个接一个地放置来组合它们,如下所示:
语法
switch (exp) { case 1: case 2: statements; break; case 3: statements; break; default: printf("%c is a non-alphanumeric character\n", ch); }
你还可以使用省略号(…)来组合表达式的值范围。例如,要将切换变量的值与1到10之间的任何数字匹配,可以使用“case 1 … 10”
示例1
#include <stdio.h> int main (){ // local variable definition int number = 5; switch (number){ case 1 ... 10: printf("The number is between 1 and 10\n"); break; default: printf("The number is not between 1 and 10\n"); } return 0; }
输出
运行代码并检查其输出。对于“number = 5”,我们得到以下输出:
The number is between 1 and 10
示例2
以下程序检查给定char变量的值是否存储小写字母、大写字母、数字或任何其他键。
#include <stdio.h> int main (){ char ch = 'g'; switch (ch){ case 'a' ... 'z': printf("%c is a lowercase alphabet\n", ch); break; case 'A' ... 'Z': printf("%c is an uppercase alphabet\n", ch); break; case 48 ... 57: printf("%c is a digit\n", ch); break; default: printf("%c is a non-alphanumeric character\n", ch); } return 0; }
输出
对于ch = 'g',我们得到以下输出:
g is a lowercase alphabet
使用“ch”的不同值测试代码输出。