
涉及分支结构、循环结构、跳转语句及 const 修饰符等方面, C 语言控制流的核心知识点,涵盖语法、特性、示例及注意事项
C 语言控制流核心知识点总结
一、分支结构
1. 二路分支(if/if-else)
语法与逻辑
- if 语句:满足条件时执行代码块,不满足则跳过。
|
if (条件) { 语句块; // 条件为真(非0)时执行 } |
- if-else 语句:二选一执行,满足条件执行 if 块,否则执行 else 块。
|
if (条件) { 语句块1; // 条件为真时执行 } else { 语句块2; // 条件为假(0)时执行 } |
关键特性
- 代码块必须用大括号:若省略{},仅首句受条件控制(易出错,推荐始终加括号)。
- else 与最近的 if 匹配:避免嵌套时的逻辑混淆。
- 避免多余分号:if(条件);会导致无论条件真假,后续代码块都无条件执行。
2. 多路分支(if...else if...else/switch)
if...else if...else 语句
- 语法:多条件判断,依次检查条件,满足则执行对应块,均不满足则执行 else 块。
|
if (条件1) { 语句块1; } else if (条件2) { 语句块2; } else { 语句块3; // 所有条件均不满足时执行 } |
- 注意:if 与 else if 之间不能插入其他语句,否则会打断分支连续性。
switch 语句
- 语法:基于整型表达式的值匹配 case 常量,执行对应代码块。
|
switch (整型表达式) { case 常量1: 语句块1; break; // 跳出switch结构 case 常量2: 语句块2; break; default: 语句块3; // 无匹配时执行(可选) break; } |
- 核心要点:
- 表达式必须为整型:包括 int、char(本质单字节整型)、枚举等。
- case 后必须是整型常量:不能是变量或 const 修饰的变量(const 变量非编译期常量)。
- break 的作用:缺少 break 会导致 “穿透”—— 执行当前 case 后继续执行下一个 case,直到遇到 break 或结束。
- default 的位置:通常放最后(无需 break),但可放任意位置(需加 break 避免穿透)。
- 实际应用:适合多状态场景(如状态机、菜单选择),示例:
|
// 模拟指纹识别流程 int finger_flag = 1; switch (finger_flag) { case 1: printf("请按指纹\n"); finger_flag = 2; // 切换到下一步 break; case 2: printf("指纹验证中\n"); finger_flag = 3; break; // 其他状态... default: printf("退出系统\n"); } |
二、const 修饰符(基础)
- 功能:使变量只读(不可修改),增强代码安全性。
- 语法:
|
const int num = 100; // 两种写法等价 int const num = 100; |
- 注意:
- const 变量初始化后不可赋值(如num = 200;会报错)。
- switch 的 case 标签不能使用 const 变量(case 需编译期确定的常量)。
三、循环结构
1. while 循环
- 逻辑:先判断条件,条件为真则执行循环体,否则退出(可能一次不执行)。
- 语法:
|
while (条件) { 循环体; // 条件为真时重复执行 } |
- 特性:
- 适合 “条件控制” 的循环(如用户输入退出指令前持续运行)。
- 可通过while(1)创建无限循环,配合break手动退出:
|
int flag = 0; while (1) { flag++; if (flag > 5) { break; // 循环执行5次后退出 } } |
- 实际应用:多层循环实现界面跳转(外层循环控制主界面,内层循环控制子界面)。
2. do-while 循环
- 逻辑:先执行循环体,再判断条件(至少执行一次)。
- 语法:
|
do { 循环体; } while (条件); // 注意末尾分号 |
- 特性:
- 适合 “先执行后判断” 的场景(如用户输入验证:至少输入一次,无效则重新输入)。
- 与 while 的区别:do-while 保证循环体至少运行一次。
3. for 循环
- 逻辑:将初始化、条件判断、更新变量集中在循环头,结构紧凑,适合 “次数固定” 的循环。
- 语法:
|
for (表达式1; 表达式2; 表达式3) { 循环体; } // 表达式1:初始化循环变量(如int i=0) // 表达式2:循环条件(如i<10) // 表达式3:更新循环变量(如i++) |
- 特性:
- 三个表达式均可省略,但分号不可省:for(;;)等价于while(1)(无限循环)。
- 可在表达式中使用逗号分隔多个操作:
|
for (int i=0, j=10; i<j; i++, j--) { printf("i=%d, j=%d\n", i, j); } |
-
- 与 while 的转换:for 循环可改写为 while 循环(初始化→条件→循环体→更新变量)。
四、跳转语句(break/continue/goto)
1. break
- 功能:
- 跳出当前 switch 语句。
- 跳出当前层循环(不影响外层循环)。
- 示例:
|
// 跳出循环 for (int i=0; i<100; i++) { if (i == 10) { break; // i=10时退出循环 } } |
2. continue
- 功能:结束当前次循环,直接进入下一次循环(跳过循环体剩余语句)。
- 示例:
|
// 跳过7的倍数 for (int i=0; i<100; i++) { if (i%7 == 0) { continue; // i是7的倍数时,不执行后续打印 } printf("%d\n", i); } |
3. goto
- 功能:无条件跳转到同一代码块内的标签处(标签为标识符:)。
- 语法:
|
label: // 标签 语句; // ... goto label; // 跳转到label处 |
- 适用场景:
- 错误处理:多层循环或嵌套中快速跳转到统一的错误处理逻辑。
- 调试:跳过复杂代码块,直接执行后续逻辑。
- 注意:
- 不推荐频繁使用(破坏程序结构化,降低可读性)。
- 跳转逻辑应保持一致(如均向下跳转),避免混乱。
五、控制流选择策略
|
场景 |
推荐语句 |
原因分析 |
|
二选一判断 |
if-else |
逻辑简单,直观易懂 |
|
多条件判断(离散值) |
switch |
效率高于 if...else if(直接匹配) |
|
多条件判断(范围值) |
if...else if...else |
适合连续范围判断(如 x>10 && x<20) |
|
次数固定的循环 |
for |
初始化、条件、更新集中,结构清晰 |
|
条件控制的循环 |
while |
适合未知循环次数,依赖条件退出 |
|
至少执行一次的循环 |
do-while |
保证循环体至少运行一次 |
|
跳出多层循环 / 错误处理 |
goto(谨慎使用) |
比 break 嵌套更简洁(仅限必要时) |
六、常见错误与注意事项
- 分支结构:
- 遗漏大括号导致逻辑错误(如if(条件) a++; b++;中 b++ 不受条件控制)。
- 混淆==与=(if (a=5) 始终为真,应为 if (a==5))。
- 循环结构:
- for 循环中修改循环变量导致死循环(如for(i=0;i<5;i++) i++;实际循环 3 次)。
- do-while 末尾遗漏分号(语法错误)。
- 跳转语句:
- switch 中遗漏 break 导致穿透(执行多个 case)。
- continue 误用为 break(错误退出循环 vs 跳过本次循环)。
- const 使用:
- 试图修改 const 变量(编译报错)。
2.在 switch 的 case 中使用 const 变量(case 需常量表达式)。
1654

被折叠的 条评论
为什么被折叠?



