一、分支结构
1. if 语句(单分支)
这是 if 语句最基础的用法,仅在条件成立时执行特定代码块。
- 语法格式:
运行if (条件表达式) {
// 条件为真(非0)时执行的语句块
语句1;
语句2;
}
// 无论条件真假,都会执行的后续代码
后续语句;
- 执行逻辑:
- 首先计算 “条件表达式” 的值。
- 若结果为真(非 0,如 1、-5、3.14 等),则执行大括号内的所有语句。
- 若结果为假(0),则跳过大括号内的语句,直接执行 “后续语句”。
- 关键注意点:
- 条件表达式必须用小括号 () 包裹,这是语法要求,不可省略。
- 若语句块仅包含 1 条语句,大括号
{}可省略,但建议始终保留,避免后续添加代码时出现逻辑错误。
2. if-else 语句(双分支)
当需要 “二选一” 执行代码时,使用 if-else 结构,条件成立执行一段代码,不成立则执行另一段。
- 语法格式:
if (条件表达式) {
// 条件为真时执行的语句块(分支1)
} else {
// 条件为假时执行的语句块(分支2)
}
- 执行逻辑:
- 条件为真时,只执行 if 后的语句块,跳过 else 后的语句块。
- 条件为假时,只执行 else 后的语句块,跳过 if 后的语句块。
- 两个分支必有一个且仅有一个会被执行,不会同时执行或都不执行。
- 典型应用场景:
- 判断一个数字是正数还是非正数。
- 检查用户输入的密码是否正确(正确则登录,错误则提示)。
- 判断学生成绩是否及格(及格显示 “通过”,不及格显示 “未通过”)。
3. if-else if-else 语句(多分支)
当需要判断多个条件、选择多个分支时,使用该结构,按顺序检查条件,满足首个条件即执行对应分支。
- 语法格式:
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件1为假、条件2为真时执行
} else if (条件3) {
// 条件1、2为假,条件3为真时执行
}
// ... 可添加更多else if
else {
// 所有条件都为假时执行(可选)
}
- 执行逻辑:
- 从 “条件 1” 开始依次判断,一旦某个条件为真,就执行对应的语句块。
- 执行完该语句块后,直接跳出整个 if-else if-else 结构,不再检查后续条件。
- 若所有条件都为假,且存在 else 分支,则执行 else 内的语句块;若没有 else,则不执行任何分支。
- 注意事项:
- else if 可以根据需求设置任意多个,数量没有限制。
- else 是可选的,若所有条件之外的情况无需处理,可省略 else。
4. switch 语句
switch 语句是 C 语言中另一种重要的分支结构,适用于多条件判断且条件值为离散常量的场景,比多层 if-else if 结构更简洁高效。
(1)switch 语句的基本语法
switch (表达式) {
case 常量1:
// 当表达式值等于常量1时执行的语句
语句块1;
break; // 跳出switch结构
case 常量2:
// 当表达式值等于常量2时执行的语句
语句块2;
break;
// ... 更多case分支
default:
// 当表达式值与所有case常量都不匹配时执行的语句(可选)
语句块n;
break;
}
(2)核心执行逻辑
- 先计算
switch后括号中表达式的值(必须是整型或字符型,如 int、char 等)。 - 将表达式的值与各个
case后的常量依次比较:- 若匹配某个常量,则从该
case对应的语句块开始执行。 - 若所有
case都不匹配,且存在default,则执行default后的语句块。
- 若匹配某个常量,则从该
- 遇到
break语句时,立即跳出整个switch结构,执行后续代码。
(3)关键注意事项
-
表达式类型限制:表达式结果必须是整型或字符型(如 int、short、long、char 等),不能是浮点型(如 float、double)或字符串。
-
case 常量要求:
- 必须是常量(如 10、'A'、宏定义的值),不能是变量或表达式。
- 多个 case 不能使用相同的常量(会导致编译错误)。
-
break 语句的作用:
break用于终止当前 case 的执行并跳出 switch 结构。- 若省略
break,会发生 **“case 穿透”**:执行完当前 case 后,会继续执行下一个 case 的语句(无论是否匹配),直到遇到 break 或 switch 结束。
// 示例:case穿透现象
int num = 2;
switch(num) {
case 1: printf("1 "); // 不匹配,跳过
case 2: printf("2 "); // 匹配,执行
case 3: printf("3 "); // 无break,继续执行
default: printf("end");
}
// 输出:2 3 end(而非仅输出2)
-
default 的位置:
default是可选分支,用于处理 “所有 case 都不匹配” 的情况。- 可放在 switch 中的任意位置(不一定在最后),但通常建议放在末尾。
(4)适用场景与优缺点
-
适用场景:多条件判断且条件值为离散常量的情况,如:
- 菜单选择(1 - 查看、2 - 添加、3 - 删除)。
- 月份判断(1-12 月)。
- 字符命令处理('A' 表示前进、'B' 表示后退)。
二、循环结构
1. while 循环(先判断后执行)
while 循环是最基础的循环形式,特点是 “先检查条件,再决定是否执行”,循环体有可能一次都不执行。
- 语法格式:
- while (条件表达式) {
// 条件为真时执行的循环体
循环语句;
// (关键)使条件趋于假的语句(如变量自增/自减)
}- 执行逻辑:
- 计算 “条件表达式” 的值。
- 若条件为真(非 0),执行循环体;执行完后回到步骤 1,再次判断条件。
- 若条件为假(0),直接跳出循环,执行循环后的代码。
- 关键注意点:
- 必须在循环体内设置 “使条件趋于假” 的语句(如
i++、count--),否则会导致死循环(循环永远无法退出)。- 若循环体仅 1 条语句,大括号
{}可省略,但建议保留以保证代码可读性。- 典型场景:不确定循环次数,仅知道循环终止条件(如 “读取用户输入,直到输入 0 为止”)。
2. do-while 循环(先执行后判断)
do-while 循环与 while 循环逻辑相似,核心区别是 “先执行 1 次循环体,再判断条件”,确保循环体至少执行 1 次。
- 语法格式:
do {
// 先执行1次的循环体
循环语句;
// 使条件趋于假的语句
} while (条件表达式); // 注意:末尾必须加分号- 执行逻辑:
- 先执行 1 次循环体(无论条件是否成立)。
- 执行完后,计算 “条件表达式” 的值。
- 若条件为真,回到步骤 1 继续执行循环体;若为假,跳出循环。
- 关键注意点:
- 循环体末尾的分号
;不可省略,这是语法强制要求。- 适用场景明确:需要 “先执行,后判断” 的场景(如 “密码输入验证,必须先让用户输入 1 次密码再判断是否正确”)。
3. for 循环(初始化、判断、更新一体化)
for 循环是最常用的循环形式,将 “循环变量初始化、条件判断、变量更新” 三个操作集中在一处,结构紧凑、可读性高。
- 语法格式:
for (初始化表达式; 条件表达式; 更新表达式) {
// 条件为真时执行的循环体
循环语句;
}- 各部分作用:
- 初始化表达式:仅在循环开始时执行 1 次,用于定义和初始化循环变量(如
int i = 0)。- 条件表达式:每次执行循环体前判断,为真则执行循环体,为假则退出(如
i < 10)。- 更新表达式:每次执行完循环体后执行,用于修改循环变量(如
i++),使条件趋于假。- 执行逻辑:
- 执行 “初始化表达式”(仅 1 次)。
- 判断 “条件表达式”:
- 若为真,执行循环体 → 执行 “更新表达式” → 回到步骤 2。
- 若为假,跳出循环。
- 灵活用法:
- 初始化、更新表达式可省略(但分号
;不能省),如for (; i < 10; ) { ... }(类似 while 循环)。- 可同时控制多个变量,如
for (int i = 0, j = 10; i < j; i++, j--)。- 典型场景:已知明确循环次数的场景(如 “循环 10 次打印数字”“遍历数组的 10 个元素”)。
4. 循环控制语句
循环控制语句用于 “主动干预循环流程”,可提前跳出循环或跳过当前轮次,常用的有break和continue。
(1)break 语句
- 作用:立即跳出当前所在的循环(while/do-while/for)或 switch 语句,执行循环外的后续代码。
- 语法示例:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break; // 当i=5时,直接跳出for循环
}
printf("%d ", i); // 输出:0 1 2 3 4
}- 注意:
break仅跳出 “当前一层循环”,若存在循环嵌套,不会影响外层循环。
(2)continue 语句
- 作用:跳过当前轮次循环体的剩余语句,直接进入下一次循环的 “条件判断”(不终止循环)。
- 语法示例:
for (int i = 0; i < 5; i++) {
if (i == 2) {
continue; // 当i=2时,跳过下方printf,直接进入下一轮(i=3)
}
printf("%d ", i); // 输出:0 1 3 4
}
- 注意:
continue不会修改循环变量,需确保循环变量在 “更新表达式” 或循环体内正常变化,避免死循环。
三、分支与循环的嵌套
1.分支结构的嵌套
在 if/else 或 switch 语句的语句块中,再次包含分支结构,用于处理多层级的条件判断。
(1) if 语句的嵌套(最常用)
- 语法示例:
- if (外层条件) {
// 外层条件为真
if (内层条件1) {
执行语句1; // 外层+内层1均为真
} else {
执行语句2; // 外层为真、内层1为假
}
} else {
// 外层条件为假
if (内层条件2) {
执行语句3; // 外层为假、内层2为真
}
}- 典型场景:多层级判断(如 “先判断是否成年,成年后再判断是否有驾照”)。
(2) switch 语句的嵌套
- 语法示例:
switch (外层变量) {
case 1:
printf("选择1\n");
switch (内层变量) {
case 'A': printf("子选项A\n"); break;
case 'B': printf("子选项B\n"); break;
}
break;
case 2:
printf("选择2\n");
break;
}
- 注意事项:内层 switch 的 break 仅跳出内层结构,不影响外层 switch。
2.循环结构的嵌套
在一个循环的循环体中包含另一个循环,用于处理多维重复逻辑(如遍历二维数组、打印图形)。
(1) 常见嵌套组合
- for 循环嵌套 for 循环(最常用):
// 示例:打印3行4列的星号矩阵
for (int i = 0; i < 3; i++) { // 外层循环:控制行数
for (int j = 0; j < 4; j++) { // 内层循环:控制每行的列数
printf("* ");
}
printf("\n"); // 每行结束后换行
}- while 循环嵌套 for 循环:
int row = 0;
while (row < 3) { // 外层while控制行数
for (int col = 0; col < 3; col++) { // 内层for控制列数
printf("%d ", row + col);
}
printf("\n");
row++;
}
(2)核心注意事项
- 内层循环会完全执行完一轮,外层循环才会进入下一次(如上述矩阵示例,内层循环打印 4 个星号后,外层循环才换行)。
- 避免过多嵌套层级(建议不超过 3 层),否则代码可读性和维护性会大幅下降。
- 循环变量命名要区分(如外层用 i,内层用 j),避免变量冲突。
3.分支与循环的混合嵌套
分支结构与循环结构相互包含,是实际开发中最常用的组合,用于 “在循环中判断条件” 或 “在分支中执行重复操作”。
(1)循环中嵌套分支
- 语法示例:
// 示例:遍历1-10,打印其中的偶数
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) { // 循环中判断是否为偶数
printf("%d ", i); // 输出:2 4 6 8 10
}
}- 典型场景:循环中筛选数据、根据条件执行不同操作(如防盗系统中,循环检测传感器状态,满足报警条件则触发报警)。
2. 分支中嵌套循环
- 语法示例:
int choice = 2;
if (choice == 1) {
printf("打印3个数字:\n");
for (int i = 1; i <= 3; i++) { // 分支中执行循环
printf("%d ", i);
}
} else {
printf("打印2个字母:\n");
int j = 0;
while (j < 2) { // 分支中执行while循环
printf("%c ", 'A' + j);
j++;
}
}
- 典型场景:根据用户选择执行不同的循环操作(如菜单功能中,选择 “查看日志” 则循环打印日志,选择 “统计数据” 则循环计算数据)。
815

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



