C 语言分支与循环语句深度详解 一、前置核心概念语句分号;结尾的代码单元代码块复合语句{ }包裹逻辑上视为一条语句分支 / 循环后多条代码必须加大括号逻辑真假C 语言没有布尔类型0代表假非 0 任意数字都代表真。第一部分分支语句选择结构1. if 分支1.1 单 if语法c运行if(表达式) 语句; // 只有一条可省略{}执行逻辑表达式结果非 0 → 执行内部代码否则跳过。 易错坑不加{}时if 仅控制紧跟的第一条语句。c运行// 错误示范 if(10) printf(1); printf(2); // 这条永远执行不受if控制 // 正确多语句写法 if(10){ printf(1); printf(2); }1.2 if else 二选一c运行if(表达式) 语句1; else 语句2;互斥表达式为真执行 if假执行 else只能走一条。1.3 if else if 多分支互斥判断c运行if(a 60){ printf(不及格); }else if(a 80){ printf(中等); }else if(a 90){ printf(良好); }else{ printf(优秀); }执行规则从上到下依次判断找到第一个成立条件直接执行剩余分支全部跳过。1.4 悬空 else高频易错难点else 永远匹配离它最近、未配对的 if和缩进无关c运行int a0, b1; if(a 1) if(b 1) printf(yes); else printf(no);肉眼看 else 想匹配外层 if实际匹配内层 if 解决用大括号明确划分代码块。2. switch 分支整型多条件匹配基础语法c运行switch(整型表达式){ // 只能int/char/short不能浮点、字符串 case 常量1: 语句; break; // 跳出switch case 常量2: 语句; break; default: // 所有case都不匹配才执行 语句; }关键特性 1穿透性无 break 会顺序执行后续 casec运行int n2; switch(n){ case 1: printf(1); case 2: printf(2); case 3: printf(3); } // 输出23适用场景多条件执行同一套逻辑利用穿透简化代码。关键特性 2case 必须是常量不能放变量c运行int x5; case x: // 编译报错case后只能写数字、字符常量关键特性 3default 位置任意default 可以写在最前面、中间、最后不影响逻辑习惯放末尾。3. 三目运算符极简分支条件 ? 表达式1 : 表达式2逻辑条件为真执行 1否则执行 2有返回值c运行int max a b ? a : b;等价于c运行int max; if(ab) maxa; else maxb;第二部分循环语句重复结构循环四要素初始化、循环条件、循环体、更新变量1. while 循环先判断后执行可能一次都不跑语法c运行while(判断表达式) { 循环体; 更新变量; }执行流程计算表达式真 → 执行循环体回到步骤 1假 → 直接跳出循环。示例打印 1~10c运行int i1; while(i10){ printf(%d ,i); i; // 必须更新否则死循环 }坑忘记更新循环变量条件永久成立 → 死循环。2. do while 循环先执行后判断至少执行 1 次语法c运行do{ 循环体; 更新变量; }while(表达式); // 末尾分号不能丢区别 while无论条件真假循环体一定会先跑一遍。 适用场景菜单输入、至少执行一次交互逻辑。3. for 循环结构最清晰分三段c运行for(初始化; 判断条件; 更新表达式) { 循环体; }执行顺序固定不变初始化仅执行 1 次判断条件假循环结束真执行循环体 → 执行更新表达式 → 回到步骤 2三段全部可省略c运行for(;;) // 等价while(1)无限死循环for 循环优势初始化、更新集中写在一行适合已知循环次数场景c运行// 打印1~10标准写法 for(int i1; i10; i){ printf(%d ,i); }第三部分循环控制关键字 break /continue1. breakswitch 中跳出 switch 分支循环中直接终止当前整个循环跳到循环外代码。c运行for(int i1;i10;i){ if(i5) break; printf(%d ,i); } // 输出1 2 3 42. continue仅终止本次循环直接进入下一次判断不跳出整体循环。c运行for(int i1;i5;i){ if(i3) continue; printf(%d ,i); } // 输出1 2 4 5 // i3时跳过打印直接i进入下一轮第四部分嵌套分支 嵌套循环深度理解1. 分支嵌套if 内部套 if、switch 套 if 都合法核心依靠{}划分层级解决悬空 else 问题。2. 循环嵌套多层循环break/continue仅控制自身所在的一层循环不影响外层。 例九九乘法表外层行内层列c运行for(int i1;i9;i){ for(int j1;ji;j){ printf(%d*%d%d ,j,i,i*j); } printf(\n); }跳出多层循环方案标记 gotoC 语言唯一推荐使用场景c运行for(int i1;i10;i){ for(int j1;j10;j){ if(i*j 30) goto end_loop; // 直接跳到标记处 } } end_loop: ; // 标记第五部分高频底层易错点1. 判断表达式常见错误1赋值和等于混淆c运行if(a5) // 永远为真等价if(5) if(a5) // 判断a是否等于52浮点数不能直接 判断浮点存储有精度误差不能写if(f 1.0)改用差值极小范围判断。2. 死循环产生场景while/for 忘记更新循环变量while(1)/for(;;)无限循环条件永远为真while(i0)且 i 只递增。3. 分号陷阱c运行// 循环后多了分号循环体为空语句后面代码脱离循环 for(int i0;i5;i); { printf(test); // 只执行一次 } // do while 末尾必须带分号丢失会编译报错 do{}while(i10);第六部分三大循环使用场景总结for循环次数明确遍历数组、固定次数打印while循环次数未知先判断再执行读取文件直到末尾do while必须先执行一次用户输入菜单至少展示一次界面。第七部分综合实战例题巩固例题 1分支判断成绩等级c运行#include stdio.h int main() { int score; scanf(%d, score); if(score 0 || score 100){ printf(成绩非法); }else if(score 60){ printf(不及格); }else if(score 80){ printf(中等); }else if(score 90){ printf(良好); }else{ printf(优秀); } return 0; }例题 2循环求 1~100 偶数和c运行#include stdio.h int main() { int sum0; for(int i1;i100;i){ if(i%2 ! 0) continue; // 奇数跳过 sum i; } printf(%d, sum); return 0; }例题 3菜单 do-while 循环c运行#include stdio.h int main() { int op; do{ printf(1.功能1 2.功能2 0.退出\n); scanf(%d, op); switch(op){ case 1: printf(执行功能1\n); break; case 2: printf(执行功能2\n); break; case 0: printf(退出程序\n); break; default: printf(输入错误\n); } }while(op ! 0); return 0; }谢谢