【C语言】选择结构和循环结构的进阶
本篇目录
- 1. 选择结构的嵌套
- 1.1 if-else的嵌套:多层级判断
- 1.2 switch-case的嵌套
- 1.3 选择结构与逻辑运算符的结合
- 2. 循环结构的嵌套
- 2.1 嵌套循环:多层重复执行
- 2.2 循环控制的技巧
- 3. 其他
- 3.1 本篇参考/来源
在学习本篇之前,请巩固上节的知识点📖
1. 选择结构的嵌套
在很多问题的处理上,单层的选择或者是不断堆积的else会显得格外的低效,这时候我们可以用到嵌套,将复杂的步骤进行简化。
1.1 if-else的嵌套:多层级判断
当需要在一个条件分支中再做细分判断时,可以使用 if-else 的嵌套结构。
其中的逻辑是先判断大条件,再在大条件下判断小条件。
语法架构为
if(外层条件){//外层为真时执行的代码if(内层条件1){//内层条件1为真时执行的代码}else{//内层条件1位假时执行的代码}
}else{//外层为假时执行的代码
}
其实很好理解,类似一个病人在医院挂号。
医院会先判断“是否为急诊”(外层条件),若为急诊再判断“是否危及生命”(内层条件1);若不是急诊,则按照普通看病流程处理。

例1. 判断一个数是否为能被3整除的偶数
int num = 6;
if(num%2 == 0){ //可以被2整除就是偶数if(num%3 == 0){ //能否被3整除printf("%d是能被3整除的偶数\n",num);}else{printf("%d是偶数,但不能被3整除\n",num);}
}else{printf("%d不是偶数\n",num);
}
注意事项
- 嵌套层级建议不超过3层,因为过多的层级会降低代码的可读性,让人难以理解
- 内层的 if-else 需要严格缩进,明确与外层之间的关系
1.2 switch-case的嵌套
不只是常见的 if-else 支持嵌套, switch-case 也支持嵌套。
而且具有“穿透性”,体现在:省略break时继续执行下一个case。
int a;
switch(a/b){ //将a以b为一组,进行不同层级的划分case 1:switch(a){ //根据a的值进行判断case 1 :printf("..");break;...}case 2:...
}
当多个case需要执行相同逻辑时,可省略中间case的break,实现“区间批量处理”。
例2.按分数段进行评级(90-100为A,80-89位B…)
int score = 85;
switch(score/10){ // 整除10后,可以划分分数段case 10:case 9:printf("等级A\n"); //10和9共享逻辑case 8:printf("等级B\n");case 7:printf("等级C\n");case 6:printf("等级D\n");default:printf("等级E\n");
}
- 在电梯的内部,如果我们按下“10楼”和“9楼”都需要停在9楼以上区域,电梯可以连续停靠(穿透),直到触发“9楼”的停靠指令(break)。

1.3 选择结构与逻辑运算符的结合
在第一节基本语法结构中,我们学习了逻辑运算符&&(与)、||(或)、!(非)。
合理的使用这些逻辑运算符,可以代替部分嵌套结构。
如上节中5和7的最小公倍数中,我们使用了"i % 5 == 0 && i % 7 == 0"去代替了if( i%5==0 )中再嵌套if ( i %7 == 0)的情况。
同理,我们可以将例1的程序简化:
int num = 6;
if(num%2 == 0 && num%3 == 0){ //同时可以被2和3整除的数printf("%d是能被3整除的偶数\n",num);
}else{printf("%d不是偶数\n",num);
}
优点
- 相比较嵌套 if-else 或者 if 的多层嵌套,运用逻辑运算符组合的条件更直观,且执行效率更高。
2. 循环结构的嵌套
循环结构的嵌套是实现矩阵运算、排序算法等的基础。
·矩阵运算涉及到多维数组,在学习到数组的时候会进行讲解。
·排序算法:如对一串数字进行大小排序,诸多算法中常见的。
2.1 嵌套循环:多层重复执行
嵌套循环很好理解,就是一个循环里面中再嵌套另一个循环,外层循环控制着“轮次”,内层循环控制“没轮的重复次数”。
这个流程图可能有些许复杂,我来简单讲一下:
- 对一个数先进行判断是否满足外层条件,不满足直接退出外层循环,满足则进行到步骤2
- 对这个数再进行内层条件的判断,直到不满足内层条件后,退出内层的循环返回到外层循环
- 在外层更新后,判断是否满足外层条件,满足则直接退出外层循环,不满足则重复步骤2、3

只有外层条件不满足时,整个循环才结束,如上图所示⬆️
例3.打印5行5列的正方形星号
for(int i=0; i<5; i++){ //5行for(int j=0; j<5; j++){ //每行5个printf("*");}printf("\n"); //每行结束后换行
}
- * * * * - * * * * - * * * * - * * * * - * * * *
同理,九九乘法表也可以按照这个逻辑进行打印。
2.2 循环控制的技巧
- break与标志位
在多层循环中,需要一次性跳出所有的循环时,仅用break是无法实现的(因为只能跳出当前层),我们可以使用标志位来进行跳出(在最外层循环中的条件判断里添加,常与逻辑运算符结合使用)。
标志位:一个记录循环状态的变量,可以是一个布尔值,为真时结束循环。后续会使用到。
- continue与复杂条件
continue可以结合逻辑判断,跳过循环中“不需要处理”的迭代,减少无效的计算 - 减少重复计算
循环内部的重复计算会降低效率,尤其在多层嵌套循环中,需将“与循环变量无关的计算”移到循环外。
3. 其他
3.1 本篇参考/来源
- 图片由本人绘制而成
