C语言深度解剖:第一章关键字(五) - 实践

news/2025/12/9 22:17:05/文章来源:https://www.cnblogs.com/yangykaifa/p/19328583

目录

  • 一.switch与case关键字
    • 1.基本语法结构
    • 2.case的作用
    • 3.break与continue的作用
    • 4.case注意事项
    • 5.default关键字
    • 6.底层原理
    • 7.与if else的核心区别
    • 8.跳转表的拓展内容
  • 二.do-while while for循环
    • 1.三种循环各自语法
    • 2.break与continue区别
      • (1)break:直接终止整个循环(所有循环通用)
      • (2)continue:跳过本次循环剩余部分,进入下一次循环
    • 3.循环语句的注意事项
  • 三.goto语句
    • 1.核心语法与底层逻辑
    • 2.适用场景
    • 3.禁忌与风险
    • 4.核心总结
  • 四.void关键字

一.switch与case关键字

switch case语句是C语言中多分支整型常量判断语句,核心优势是通过跳转表实现快速跳转,比多层if语句更加简洁高效,专门为单个变量匹配多个固定的整形常量场景设计。

1.基本语法结构

以下是switch选择结构的基本语法结构

switch (整形表达式)
//表达式必须是char/short/int/long(含无符号类型)、枚举类型
{
case var1:
//var为整形常量,常量必须是编译期确定的整形值(字面量、宏定义、枚举常量)
break;//可选,终止分支,跳出整个switch语句
case var2:
break;
default://可选,所有case语句不匹配时执行。
break;//放最后可以不需要break,执行完自动退出。
}

语法规则:

  1. 表达式支持的类型,仅仅支持整形相关的类型。例如:char short int long longlong(含无符号版本)。枚举类型(本质上是整形类型的映射)。禁用类型:float和double精度无法精准匹配,字符串(C语言无String类型,char[]不能直接作为表达式),指针(语法允许,但是实际运用毫无作用)。
  2. case的三个要求:(1)必须是整形常量表达式,字面量、宏定义、枚举常量不能是变量。(2)常量值不可重复,多个case不能有相同的值,编译会直接报错。(3)多个case有穿透特性,可以利用这个特性写出特别的代码。
  3. default的三个细节:(1)可选择加不加。但是推荐加。处理无效输入,提升代码的健壮性。(2)位置灵活,可以放在switch的任何位置,但是一般放在switch语句的最后位置。(不在最后位置时,需要加上break关键字防止case穿透)。

进阶用法和实践代码:
1.case的合理穿透

while (1)
{
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("周内");
break;
case 6:
case 7:
printf("周末");
break;
default:
printf("输入错误");
}
}

上述代码的具体解释:根据输入值的不同,进行匹配对应的星期,进而进行打印。因为case的穿透特性(前5个case没有加break,导致只要输入1-5时,就会输出1-5条件对应的周内。反之输出周末)

2.枚举+switch语句

enum Weekday
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
// 枚举默认自增
int main()
{
enum Weekday day = WED;
switch (day)
{
case MON:
case TUE:
case WED:
case THU:
case FRI:
printf("周内\n");
break;
case SAT:
case SUN:
printf("周末\n");
break;
}
return 0;
}

上述代码的具体解释:合理运用枚举类型,提高代码的可读性。

2.case的作用

在上述语法结构的学习中,我们了解了关键字switch与case的相关语法,下面我们来学习case的作用。
case的作用是匹配switch表达式的值,当值匹配时,执行case语句后的值,直到遇到break终止执行。

3.break与continue的作用

break在switch语句中,可以跳过整个代码块。在循环中,能跳过整个循环。
continue在循环语句中,可以跳过本次循环,直接进入下一次循环迭代,不终止整个循环。

4.case注意事项

  1. 必须搭配switch使用:case是switch语句的分支标签,不能单独存在,且switch后需跟表达式。
  2. 记得加上break或者return:case执行完后需要用break终止分支,否则会穿透到下一个case语句。(除非刻意为之)
  3. case后跟的是常量表达式:值必须是字面量,不能是变量、只读变量或动态计算值。
  4. default可选但建议加:当所有的case都不匹配时执行,通常放在最后(位置没有限制),用于处理异常情况。

5.default关键字

  1. 可以放在switch语句的任意位置(不一定放在最后),但是放最后时不需要加上break。
  2. 可选择是否加上default关键字,但是推荐加。用于处理异常或者未预料的输入,让代码更加健壮。
  3. 不依赖case数量,哪怕有多个case,只要无匹配项,就会执行default后的语句。

6.底层原理

编译器会将所有的case常量按照升序整理成跳转表(本质是数组,索引等于常量值,元素等于代码地址)。
先计算switch表达式的值,自动转换为int类型,通过跳转表直接定位到对应的case语句,不需要逐个进行判断。
如果case后面没有break return或goto,会出现穿透现象,执行下一个case继续执行。

7.与if else的核心区别

语法结构switch-case语句if-else语句
适用场景单个变量匹配(整形常量)范围判断(动态条件)
执行效率高(跳转表直接定位)低(分支越多越慢)
可读性分支多有优势(简洁)分之少时有优势(灵活)

核心结论:整形常量多分之用switch,范围条件判断用if语句。

8.跳转表的拓展内容

跳转表是存储函数入口地址或代码标签地址的连续数组。核心是通过索引直接映射目标地址,实现O(1)效率的跳转,替代多分之判断,底层靠内存地址计算+间接跳转指令提速。
简单来说就是用数组做地址目录,索引对应目标编号,不用逐个比较条件,直接按照编号找到要执行的代码地址,分支越多效率越明显。
跳转表的底层本质:是一块连续的内存空间(数组),存储的事函数入口地址或代码段标签的地址。核心是靠索引地址的直接映射,绕开多分之判断的比较逻辑,本质是用空间换取时间,底层执行完全依赖CPU的地址访问和跳转指令。

对比准度switch语句跳转表
本质高级语言语法结构,用于多分支判断底层数据结构(数组),存储地址实现直接跳转
底层实现分支连续时编译器优化为跳转表O(1),稀疏时退化为if-else链强制O(1)效率,手动控制地址映射,不受编译器影响
适用场景简单值匹配。分支逻辑简短分支数量多,逻辑复杂,或需手动控制跳转逻辑。
灵活性只能匹配特定制逻辑嵌套受限可动态修改数组元素,支持跨模块函数映射
底层开销编译器自动处理地址计算。无需手动管理需手动维护数组,检查索引合法性,底层可控性强

简单来说switch是省心的语法糖,编译器会帮你确定是否用跳转表。跳转表是手动优化工具,直接掌控底层跳转逻辑,适合追求极致效率或者复杂分支的场景。

二.do-while while for循环

上述是对C语言选择结构switch的讲解,下面来讲解一下循环结构。

1.三种循环各自语法

//while循环
条件初始化
while (条件判定)
{
//业务更新
//条件更新
}
//for循环
for (条件初始化;条件判定;条件更新)
{
//业务代码
}
//do while循环
条件初始化
do
{
//业务代码
//条件更新
}
while(条件判定)

2.break与continue区别

(1)break:直接终止整个循环(所有循环通用)

作用:立即跳过当前所在的循环体(整个循环),执行循环后面的代码,循环不再继续。
for循环:触发break后,直接跳过更新表达式和后续判断,终止整个循环。
while循环:触发break后,直接终止循环,不再执行条件判断和循环体剩余部分。
do-while循环:触发break后,直接终止循环,跳过后续的条件判断。

(2)continue:跳过本次循环剩余部分,进入下一次循环

作用是:跳过循环体中continue之后的代码,直接进入下一次循环的条件判断(for循环特殊)。
for循环:触发continue后,跳过循环体剩余代码,执行更新表达式,再判断条件。
while循环:触发continue后,跳过循环体剩余代码,直接判断条件,需要手动在continue前更新变量,否则会陷入死循环。
do-while循环:触发continue后,跳过循环体剩余代码,执行条件判断(满足则礼物循环,同样需要手动提前更新变量)

3.循环语句的注意事项

  1. 避免死循环:for循环确保条件会终止,while或者do while循环需要再在循环内修改判断变量。
  2. 循环变量初始化:for循环变量初始化不应该遗忘,while循环前应确保判断变量有有效值。
  3. 循环体执行逻辑:单个语句也建议加上大括号,避免后续扩展代码出错。
  4. break或continue谨慎使用,明确跳出循环的范围,嵌套循环避免使用该关键字,有可能会导致逻辑混乱。
  5. 注意边界值,处理数组、集合或循环条件时,别超出索引范围。

三.goto语句

C语言goto语句是无条件跳转的直接通道,核心作用是跳过中间代码,直接跳转到同一函数内的指定标签处,底层依赖CPU的跳转指令,无任何条件判断,灵活但风险较高。

1.核心语法与底层逻辑

用法:goto标签名(执行后立刻跳转到对应标签,执行标签后的代码)
底层本质:标签本质是代码段中某条指令的内存地址,goto语句编译后会产生标签地址的指令,直接跳转到目标地址,跳过中间所有代码的执行。

2.适用场景

  1. 跳出多层循环:无需逐层用break,直接跳出所有的嵌套循环。比多层break更加简洁。
  2. 统一错误处理:函数内多个分支出错时,跳转到同一清理标签(释放内存,关闭文件),避免重复代码。
  3. 简化复杂条件跳转:替代多层嵌套if-else让代码流程更加清晰。

3.禁忌与风险

  1. 跨函数跳转:严禁跳转到其他函数的标签(底层是访问非法代码段,触发段错误)
  2. 跳过变量初始化:不能跳转到未初始化变量的使用处(底层导致变量值不确定,程序行为异常)
  3. 滥用导致代码混乱:频繁跳转形成可读性和维护性差的代码
  4. 跳过资源分配和释放:错误使用goto语句,导致没有进行资源分配和空间释放,进而出现代码错误。

4.核心总结

goto语句的核心是无条件、跨段跳转。优势是跳转直接高效、劣势是破坏代码结构化流程、但是能不用则不用,用就应该有万全的把握。

四.void关键字

void本质上是无类型,核心作用是限制数据或函数的类型关联性,底层靠编译器语法检查和内存分配规则实现,具体用法集中在三个场景:

  1. 函数返回值:表示无返回值。
    核心作用:明确函数执行后不返回任何数据,调用者不能接收返回值。
    底层逻辑:编译器不会为函数生成返回值传递指令,函数执行完直接返回,无需额外的内存开销。
  2. 函数参数:表示无参数。
    核心作用:明确函数不接收任何参数,避免调用时,传入多余参数导致语法错误。
  3. 指针类型:万能指针。
    核心作用:可以指任意类型的数据,是唯一能直接接收其他类型指针的指针类型。
    底层逻辑:void仅存储内存地址但没类型信息,编译器无法确定引用后的内存长度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/995633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 筛选条件放 ON 后 vs 放 WHERE 后

ON 决定如何 "连接" 表,WHERE 决定连接后 "显示" 哪些行。 这个根本区别导致了在 LEFT JOIN / RIGHT JOIN 外连接中,条件放置位置会产生巨大影响;而在 INNER JOIN 中,效果通常 等价。今天我们…

明天不干是小狗

明天不干是小狗上一条必须干 我说真的 老己,你干吧,我求求你了

CF547B 题解

CF547B 题解CF547B - Description 给你个长度为 \(n\) 的序列 \(a\),对于每个 \(1\le k\le n\),有 \(n-k+1\) 个中所有长度为 \(k\) 的子串,你需要求出这 \(n-k+1\) 个子串的区间最小值的最大值,即下面式子的值: …

SAT 辅导哪里好?2025 年优质机构推荐(含精准选择指南) - 品牌测评鉴赏家

SAT 辅导哪里好?2025 年优质机构推荐(含精准选择指南)选择 SAT 辅导机构需结合自身基础、目标分数、学习习惯及地域便利性。以下是 2025 年最新优质机构推荐,涵盖线上线下资源,针对不同需求提供精准建议: 一、全…

10403_基于Springboot的旅游管理系统

1、项目包含 项目源码、项目文档、数据库脚本、软件工具等资料; 带你从零开始部署运行本套系统。 2、项目介绍 随着旅游业的发展,越来越多的人选择通过互联网来规划自己的旅行。在线旅游信息推荐系统就是为了帮助用户…

MMH_蓝桥杯Python_语法基础_列表与循环语句基础

1.列表 列表可以极大降低我们在处理多个元素时的复杂程度; 在 Python 中,列表(list) 是一种有序、可变、可存储多种数据类型的序列数据结构,使用中括号 [] 定义,元素之间用逗号分隔。 1.创建列表 代码展示 #包…

2025全屋定制十大品牌哪家好?欧蒂尼硬核实力破局,领衔品质家居新革命 - 资讯焦点

2025年,中国全屋定制行业迎来“质造升级+需求多元”的双重变革,整家定制、智能集成、年轻化设计成为行业主流趋势。在这片竞争激烈的赛道上,一批兼具实力与口碑的品牌脱颖而出,它们以技术为基、以设计为魂、以服务…

keepalived搭建高可用

一、HA集群 1.1 ha集群是什么 高可用集群,是有多台服务器节点组成的集群,通过冗余设计和故障自动切换,保证了核心服务,持续可用,减少了停机时间就是当一个提供网站的服务故障后,另外一台机器充当这个提供网站的角…

P5304 [GXOI/GZOI2019] 旅行者 题解

P5304 [GXOI/GZOI2019] 旅行者 题解P5304 [GXOI/GZOI2019] 旅行者 Description 给你一个 \(n\) 个点,\(m\) 条边的有向连通图,给出 \(k\) 个点的编号,让你求出这些点中距离最近的两点之间距离。 \(n\le 10^5,m\le 5…

2025 年面膜消费指南:告别盲目囤货,10款补水保湿抗老修护爆款适配干油敏肌,精准解决护肤痛点 - 资讯焦点

一抹精华浸润肌底,熬夜的蜡黄倦容悄然褪去;一贴膜布贴合脸颊,换季的泛红干痒即刻舒缓;分区护理精准发力,T 区的油光与 U 区的干纹同时消失 —— 这是 2025 年新一代功效型面膜带来的护肤新体验。 据华泰研究所 20…

P3275 [SCOI2011] 糖果 题解

P3275 [SCOI2011] 糖果 题解P3275 [SCOI2011] 糖果 Description 给你 \(k\) 个指令(约束条件),让你构造一个长度为 \(n\) 的正整数序列 A,满足这个条件的同时让所有元素的和最小。 指令的格式如下:1 a b 表示 \(A…

the attitude

some Chinese talked with people comes from R. they will discuss that one with their friends, is the people just monkey to be discussed? I will never do that.

2025年国内正规的微动开关工厂怎么选购,家电微动开关/大电流微动开关/新能源微动开关/小型微动开关/汽车微动开关供货商怎么选 - 品牌推荐师

随着工业自动化、智能家电及新能源汽车等领域的蓬勃发展,作为关键控制元件的微动开关,其市场需求持续攀升。面对市场上众多的微动开关制造商,采购方如何甄别与选择一家技术可靠、品质稳定、供货能力强的正规工厂,成…

win10 vscode 使用ssh登录 ubuntu

win10 vscode 使用ssh登录 ubuntuvscode ssh在Ubuntu上建立SSH服务器,然后从Windows 10上的VSCode连接。 git操作 cd到项目目录 如果要在局域网中搭建git仓库,先要将下载的项目中有git工程配置文件删除掉 rm -rf .gi…

P4064 [JXOI2017] 加法 题解

P4064 [JXOI2017] 加法 题解P4064 [JXOI2017] 加法 Description 给你一个长度为 \(n\) 的正整数序列 \(A\),再给你 \(m\) 个区间,让你在这 \(m\) 个区间中选出 \(k\) 个进行区间加 \(a\) 操作(\(a\) 为常数),使得…

2025年河南工业大学2025新生周赛 (7)

A 回声 将连续的字母和连字符视为同一个单词bool isWordChar(char c) {if ((c >= a && c <= z) ||(c >= A && c <= Z) ||c == -) {return true;}return false; }从头到尾遍历,并存单词即…

P3076 [USACO13FEB] Taxi G 题解

P3076 [USACO13FEB] Taxi GP3076 [USACO13FEB] Taxi G Description 有一条长度为 \(m\) 的数轴,有 \(n\) 头牛需要坐车前往别的地方,起点和终点分别为 \(a_i\) 和 \(b_i\)。 现在一辆出租车从原点出发,要运送完所有…

第四章 串

串的定义和实现 串的基本概念 串的定义 串,即字符串,是由零个或多个字符组成的有限序列,一般记为 \[S=a_{1}a_{2}a_{3}...a_{n}(n\ge0) \]其中,S是串名,单引号括起来的字符序列是串的值,\(a_{i}\)可以是字母、数…

数据采集第四次作业-102302128吴建良

作业1:基于 Selenium 和 MySQL 的股票数据爬取 码云仓库:https://gitee.com/wujianliang9/2025-data-collection/tree/master/第四次作业/作业1 一、核心代码与方法 (Code & Methodology) 核心代码 以下是实现爬…

102302142罗伟钊第四次作业

作业1: - 要求: ▪ 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内 容。 ▪ 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、 “深证A股”3个板块的股票数据信息。 ▪…