第3章 控制流
1. 语句与程序块
- 表达式语句:表达式后跟分号构成语句
- 复合语句(程序块):用花括号{}包围的一组声明和语句
- 在语法上,程序块等同于单个语句
2. if-else语句
if (表达式)
语句1
else
语句2
- else部分是可选的
- 注意"悬挂else"问题:else与最近的if匹配
- 使用花括号明确if-else的归属关系
3. else-if语句
用于多路判断:
if (表达式1)
语句1
else if (表达式2)
语句2
else if (表达式3)
语句3
else
语句4
4. switch语句
switch (表达式) {
case 常量表达式1: 语句1
case 常量表达式2: 语句2
default: 语句n
}
- case标签必须是整型常量表达式
- break语句用于退出switch
- default分支是可选的
- case只是入口点,执行会"贯穿"到下一个break
5. while循环
while (表达式)
语句
- 先测试表达式,为真则执行循环体
- 循环体可以是单个语句或程序块
6. for循环
for (表达式1; 表达式2; 表达式3)
语句
- 等价于:
表达式1; while (表达式2) { 语句 表达式3; }
- 三个表达式都是可选的
- 表达式1常用于初始化,表达式2是条件测试,表达式3是步进操作
7. do-while循环
do
语句
while (表达式);
- 先执行循环体,再测试条件
- 至少执行一次循环体
- 结尾需要分号
8. break和continue语句
- break:退出最内层的循环或switch
- continue:跳过当前循环的剩余部分,进入下一次循环测试
- continue只用于循环,break还可用于switch
9. goto与标签
- goto语句用于无条件跳转:
goto 标签; ... 标签: 语句
- 标签是标识符后跟冒号
- 谨慎使用goto,可能导致程序难以理解
- 常见用途是从多层嵌套循环中直接跳出
10. 控制流编程示例
本章通过多个示例展示了控制流的使用:
- 二分查找(binary search)
- 删除字符串末尾的空格和制表符
- shell排序算法
- 反转字符串
- 数字转换为字符串
这些示例展示了如何组合使用各种控制结构来解决实际问题。
关键点总结
- C语言提供了丰富的控制流结构来管理程序执行顺序
- 理解各种循环的区别(while先测试,do-while后测试,for紧凑循环)
- switch语句提供高效的多路分支,但要注意break的使用
- 控制流结构可以嵌套使用以构建复杂逻辑
- 谨慎使用goto,通常有更好的结构化替代方案
- 良好的缩进和代码布局对控制流结构的可读性至关重要