C语言分支与循环语句详解 C语言分支与循环语句详解一、分支语句让程序会“思考”1. if 语句2. switch 语句二、循环语句让程序会“重复”1. while 循环2. do-while 循环3. for 循环三、循环控制语句break 和 continue四、实战1. 判断100~200之间的素数2. 给定两个数求这两个数的最大公约数五、嵌套循环与常见陷阱1. 嵌套循环2. 常见错误与建议六、小结在C语言中程序默认按顺序执行但实际开发中我们需要根据条件做出选择分支或者重复执行某段代码循环。掌握分支和循环语句就掌握了程序的“大脑”和“肌肉”。本文将带你系统学习if、switch、for、while和do-while并配合大量示例帮你彻底理解它们的用法和注意事项。一、分支语句让程序会“思考”1.if语句if是最基础的条件判断语句格式如下if(条件表达式){语句// 条件为真时执行}也可以加上else处理相反情况if(条件表达式){语句// 条件为真时执行}else{语句// 条件为假时执行}还可以用else if实现多分支例如评价成绩时if(score90){printf(优秀);}elseif(score60){printf(及格);}else{printf(不及格);}注意事项条件表达式可以是任何能产生0假或非0真值的表达式。即使只有一条语句也建议加上大括号{}避免后续添加语句时出错。不要将误写为否则会变成赋值编译器通常不会报错但逻辑全错。2.switch语句switch用于多分支等值判断如根据整数值跳转比多个else if更清晰。switch(整型表达式){case常量1:// 代码块break;case常量2:// 代码块break;default:// 所有case都不匹配时执行break;}示例根据数字输出星期几intday3;switch(day){case1:printf(周一);break;case2:printf(周二);break;case3:printf(周三);break;case4:printf(周四);break;case5:printf(周五);break;case6:printf(周六);break;case7:printf(周日);break;default:printf(无效日期);}关键点case后面必须是整型常量不能是变量或浮点数。每个case结束时一般会加break否则会“穿透”执行后续所有case这通常是逻辑错误但有时也可利用穿透。default可选通常放在最后。二、循环语句让程序会“重复”1.while循环先判断条件再执行循环体可能一次都不执行。while(条件){// 循环体}示例计算1到100的和intsum0,i1;while(i100){sumi;i;}2.do-while循环先执行一次循环体再判断条件至少执行一次。do{// 循环体}while(条件);// 注意分号常用于菜单输入、密码验证等场景例如charchoice;do{printf(是否继续(y/n): );scanf( %c,choice);// 注意空格跳过换行}while(choice!ychoice!n);3.for循环for集初始化、条件判断、更新于一体结构紧凑最常用。for(初始化;条件;更新){// 循环体}执行顺序初始化 → 条件判断真则进入→ 循环体 → 更新 → 再判断…示例遍历数组intarr[5]{1,2,3,4,5};for(inti0;i5;i){printf(%d ,arr[i]);}注意三个表达式都可以省略但分号必须保留例如for(;;)是死循环。在C99标准后可以在for内声明变量如int i其作用域仅限于循环内部。三、循环控制语句break 和 continuebreak立即跳出当前所在的最内层循环或switch语句。continue跳过本次循环剩余代码直接进入下一次循环迭代在for中会先执行更新部分再判断。示例查找第一个能被7整除的数并跳出for(inti1;i100;i){if(i%70){printf(找到%d\n,i);break;}}示例只打印奇数跳过偶数for(inti1;i10;i){if(i%20)continue;printf(%d ,i);}四、实战1. 判断100~200之间的素数#includestdio.h#includemath.h// 数学库用于 sqrt 函数intmain(){printf(100~200之间的素数为);// 从 101 开始检查到 199每次加 2偶数一定不是素数跳过for(inti101;i200;i2){intflag0;// 标记是否为合数0 表示假设为素数1 表示找到因子// 检查从 3 到 sqrt(i) 的所有奇数因子// 只检查奇数是因为 i 已经是奇数偶数因子不可能整除奇数for(intj3;jsqrt(i);j2){if(i%j0)// 如果 j 能整除 i则 i 不是素数{flag1;// 标记为合数break;// 找到一个因子即可跳出内层循环}}// 如果 flag 仍为 0说明没有找到任何因子i 是素数if(!flag){printf(%d ,i);// 输出素数}}return0;}输出结果100~200之间的素数为101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199这个例子完美融合了for循环外层遍历数字内层检查因子if分支判断是否整除break提前退出内层循环提高效率我第一次运行的时在使用sqrt()的时候未使用头文件math.h结果输出把所有遍历的所有数字都输出了。2. 给定两个数求这两个数的最大公约数#includestdio.hintmain(){intmin0,max0;scanf(%d%d,min,max);// 从键盘读取两个整数分别存入 min 和 max// 确保 min 存放较小的数max 存放较大的数如果输入顺序反了就交换if(minmax){inttempmin;// 临时变量用于交换minmax;maxtemp;}intmax_cf0;// 用于记录当前找到的最大公约数初始为 0// 从 1 到较小数 min 逐一尝试每一个整数 ifor(inti1;imin;i){// 如果 i 能同时整除 min 和 max说明 i 是它们的公约数if(min%i0max%i0){max_cfi;// 更新最大公约数由于 i 不断增大最后记录的就是最大的}}// 输出结果printf(这两个数的最大公约数为%d,max_cf);return0;}这段代码采用的是暴力枚举法穷举从 1 到两个数中较小者的所有整数找出能同时整除两个数的最大那一个。而deepseek给我推荐了一个求最大公约数的优化算法辗转相除法欧几里得算法#includestdio.hintmain(){inta0,b0;scanf(%d%d,a,b);// 确保 a 存放较小的数b 存放较大的数交换使得 a bif(ab){inttempa;ab;btemp;}intmax_cf1;// 用于记录当前找到的最大公约数初始为 0// 辗转相除法求最大公约数while(a)// 当 a 不为 0 时继续循环{inttempb%a;// 计算 b 除以 a 的余数ba;// 把原来的除数 a 作为新的被除数 batemp;// 把余数作为新的除数 a}// 循环结束时 a 为 0此时 b 中存放的就是最大公约数max_cfb;// 将最大公约数存入 max_cfprintf(这两个数的最大公约数为%d,max_cf);return0;}算法说明辗转相除法基于原理gcd(a, b) gcd(b % a, a)不断用较小数除较大数取余直到余数为 0此时较小的数除数即为最大公约数。时间效率O(log n)远高于穷举法的O(n)并且代码简洁不会漏解。我一开始使用穷举法想法和求素数类似从最小值的平方根开始找代码如下intmax_cf1;// 用于记录当前找到的最大公约数初始为 1两数必有公约数 1for(intisqrt(min);imin;i){if(min%i0max%i0){max_cfi;}}验证了几个例子都没问题当我还在沾沾自喜的时候deepseek告诉我代码存在逻辑漏洞从sqrt(min)开始向上遍历到min希望找到能同时整除min和max的最大数。这个思路漏掉了小于sqrt(min)的公约数而最大公约数完全可能小于sqrt(min)。反例min 14max 18真实最大公约数是2因为 142×7182×3²sqrt(14) ≈ 3.74int截断后循环从3开始循环检查3~14没有数能同时整除 14 和 18i7不能整除18i14不能整除18最终max_cf保持初始值1输出错误答案1所以这个算法不完整不能用于求最大公约数。五、嵌套循环与常见陷阱1. 嵌套循环外层循环每执行一次内层循环会完整执行一轮。例如打印九九乘法表for(inti1;i9;i){for(intj1;ji;j){printf(%d×%d%-2d ,j,i,i*j);}printf(\n);}2. 常见错误与建议忘记更新变量导致死循环。例如while (i 10) { /* 没有 i */ }。分号误用for (i0; i10; i); 后面的分号会让循环体为空后面大括号中的代码只执行一次。作用域混乱在for内定义的变量在循环外不可见。switch忘记break导致意外穿透。浮点数作为循环条件可能导致精度问题尽量使用整型。六、小结各语句类型的适用场景分别是if-else任何条件分支尤其是范围判断switch多个等值判断整型/字符for已知循环次数如遍历数组while未知次数先条件判断do-while至少执行一次如菜单循环熟练掌握这些基础语句你就能编写出逻辑清晰、效率良好的C程序。后续学习函数、指针等更高级特性时分支和循环依然是基石。希望这篇博客能帮你彻底理清C语言的分支与循环。如果你有疑问或想深入某个细节欢迎留言讨论