C 语言分支与循环:从 if 到 for,一篇讲透程序的两大控制结构

发布时间:2026/10/23 4:59:33
C 语言分支与循环:从 if 到 for,一篇讲透程序的两大控制结构 前言本文面向 C 语言初学者从零开始讲解程序中最常用的两类控制结构分支语句与循环语句。分支语句if单分支、if...else双分支、if...else if...else多分支、三目运算符以及switch分支解决根据条件选择执行哪段代码的问题。循环语句while、do while、for三种循环以及break、continue两个循环控制关键字解决重复执行某段代码的问题。每个知识点都配有可直接编译运行的完整示例并在代码中用中文注释逐行说明执行过程方便边看边敲、边敲边理解。学习目标读完后能够独立写出带条件判断和循环的 C 程序理解各语句的执行流程与适用场景并能根据需求在if与switch、三种循环之间做出合理选择。目录1. 分支语句1.1 if 单分支1.2 if…else 双分支1.3 if…else if…else 多分支1.4 三目运算符1.5 switch 分支2. 循环语句2.1 while 循环2.2 do while 循环2.3 for 循环3. 循环控制关键字3.1 break3.2 continue4. 总结1. 分支语句1.1 if 单分支语法if(条件){// 条件成立时执行的代码}简单示例#includestdio.hintmain(){intage20;// 定义变量 age 为 20if(age18){// 判断 age 18 是否成立printf(已成年\n);// 20 确实大于等于 18条件成立输出“已成年”}return0;}1.2 if…else 双分支语法if(条件){//条件成立时执行的代码}else{//条件不成立时的代码}简单示例#includestdio.hintmain(){intscore55;// 定义变量 score 为 55if(score60){// 判断 score 60 是否成立printf(及格\n);// 55 小于 60条件不成立不执行这里}else{printf(不及格\n);// 条件不成立执行 else 里的代码输出“不及格”}return0;}1.3 if…else if…else 多分支语法if(条件1){//条件1成立执行这里}elseif(条件2){//条件1不成立条件2成立执行这里}elseif(条件3){//条件12不成立条件3成立执行这里}else{//条件123都不成立执行这里}简单示例#includestdio.hintmain(){intscore85;// 定义变量 score 为 85if(score90){// 先判断 score 9085 不小于 90条件不成立printf(优秀\n);}elseif(score80){// 再判断 score 8085 大于等于 80条件成立printf(良好\n);// 执行这里的代码输出“良好”}elseif(score60){printf(及格\n);}else{printf(不及格\n);}return0;}1.4 三目运算符三目运算符是if...else的精简版它不执行语句而是直接算出一个值。语法格式表达式1?表达式2:表达式3读法表达式1 成立就取 表达式2不成立就取 表达式3。其中?相当于如果:相当于否则。因为它得到的是一个值所以可以直接赋值、直接打印也能参与其它运算。和 if…else 对照// 写法一if...else先判断再赋值intmax;if(ab){maxa;}else{maxb;}// 写法二三目运算符一行搞定效果完全一样intmax(ab)?a:b;区别在于if...else是语句只能做事情三目运算符是表达式能算出结果更适合二选一取值。完整示例求两个数中的较大值#includestdio.hintmain(){inta10;// 定义变量 a 为 10intb20;// 定义变量 b 为 20// a b 不成立取冒号后面的 b即 20intmax(ab)?a:b;// 把 20 赋给 maxprintf(较大的数是%d\n,max);// 输出较大的数是20return0;}嵌套注意事项可以嵌套但建议不超过两层否则可读性急剧下降。嵌套时结合方向是从右向左先算最右边的三目表达式。优先级很低只比赋值运算符高和别的运算符混用时一定要加括号。常见错误嵌套不加括号#includestdio.hintmain(){inta5,b10,c15;// 本意求三者最大值// 实际结合方向从右向左等价于 a b ? a : (b c ? b : c)intmaxab?a:bc?b:c;printf(max %d\n,max);// 输出 15本例碰巧正确换组数据就可能出错return0;}这种写法可读性极差属于能跑但不敢维护的代码。正确写法用括号明确嵌套关系#includestdio.hintmain(){inta5,b10,c15;// 加括号后意图清晰先求 b、c 的较大值再和 a 比较intmax(ab)?a:((bc)?b:c);printf(max %d\n,max);// 输出 15return0;}小结三目运算符适合条件简单、二选一取值的场合逻辑一复杂或需要嵌套就老老实实用if...else。1.5 switch 分支语法switch(整型表达式){case常量1:语句;break;case常量2:语句;break;case常量3:语句;break;default:语句;break;}解释1.switch括号里只能是整形int,char,short;不能是浮点和字符串2.case后面必须是常量不能写变量3.break作用跳出switch完整示例按成绩等级分支#includestdio.hintmain(){intscore85;// 定义成绩变量 score初值为 85intlevelscore/10;// 用整除把百分制成绩换算成等级85 / 10 8switch(level){// switch 括号里是整型表达式这里为 8case10:// 100 分单独处理与 90~99 一起归为优秀case9:// 90~99 分level 为 9printf(等级优秀\n);// 命中 case 9 后输出“优秀”break;// break 跳出 switch后面的 case 不再执行case8:// 80~89 分level 为 8本例 85 分命中这里printf(等级良好\n);// 输出“良好”break;// 跳出 switch结束分支判断case7:// 70~79 分case6:// 60~69 分与 70~79 共用同一段处理代码printf(等级及格\n);break;// 跳出 switchdefault:// 以上 case 都不匹配时执行即 60 分以下printf(等级不及格\n);break;// default 放在最后时 break 可省略写上更规范}return0;}运行结果等级良好说明case 10:后面没有语句也没有break会直接“落”到case 9:的代码上这是有意为之的穿透用法用来让多个取值共用同一段处理逻辑。错误示例漏写 break 导致穿透fall-through#includestdio.hintmain(){intmenu2;// 模拟用户输入的菜单编号为 2switch(menu){case1:printf(执行功能一\n);// 漏写 break会继续往下执行 case 2 的代码case2:printf(执行功能二\n);// 漏写 break会继续往下执行 case 3 的代码case3:printf(执行功能三\n);break;// 直到这里才跳出 switchdefault:printf(无效的菜单编号\n);break;}return0;}运行结果与预期只输出“执行功能二”不符执行功能二 执行功能三原因switch只负责找到入口case 2之后会顺序向下执行所有语句直到遇到break或switch结束。漏写break就会把后面case的代码一并执行这就是穿透。修正写法每个 case 处理完立即 break#includestdio.hintmain(){intmenu2;// 模拟用户输入的菜单编号为 2switch(menu){case1:printf(执行功能一\n);break;// 处理完立即跳出避免穿透到 case 2case2:printf(执行功能二\n);break;// 处理完立即跳出避免穿透到 case 3case3:printf(执行功能三\n);break;// 处理完立即跳出default:printf(无效的菜单编号\n);break;// 兜底处理防止非法输入}return0;}运行结果执行功能二小结break是switch的“出口”除刻意让多个case共用代码外每个case分支末尾都应补上breakdefault用于兜底建议始终保留。2. 循环语句2.1 while 循环语法while(条件{//条件成立进入循环}简单示例 c#includestdio.hintmain(){inti1;// 定义循环变量 i初值为 1while(i5){// 判断 i 5 是否成立成立则进入循环printf(i %d\n,i);// 输出当前 i 的值i;// i 自增 1避免死循环关键}printf(循环结束i %d\n,i);// 循环结束时 i 为 6条件不再成立return0;}说明while 是先判断后执行条件一开始就不成立时循环体一次都不会执行。2.2 do while 循环语法do{循环体语句}while判断条件//末尾的分号不能丢说明此循环和while循环有所不同要先执行一次循环体再判断条件 简单示例 c#includestdio.hintmain(){inti1;// 定义循环变量 i初值为 1do{printf(i %d\n,i);// 先执行一次循环体输出 i 的值i;// i 自增 1}while(i5);// 再判断条件成立则继续下一轮printf(循环结束i %d\n,i);// 输出 6return0;}对比示例条件一开始就不成立时do while 仍会执行一次。#includestdio.hintmain(){inti10;// i 初值为 10do{printf(执行了一次i %d\n,i);// 条件不成立也会执行一次i;}while(i5);// 10 5 为假循环结束return0;}2.3 for 循环语法for(表达式1;表达式2;表达式3){循环体;}表达式1初始化 表达式2循环条件判断 表达式3每次循环结束执行 简单示例 c#includestdio.hintmain(){// 表达式1int i 1 初始化表达式2i 5 循环条件表达式3i 每轮结束执行for(inti1;i5;i){printf(i %d\n,i);// 依次输出 1 2 3 4 5}return0;}常见用法示例求 1 到 100 的累加和。#includestdio.hintmain(){intsum0;// 定义累加变量 sum初值为 0for(inti1;i100;i){// i 从 1 循环到 100sumi;// 每轮把 i 累加到 sum 上}printf(1 到 100 的和是%d\n,sum);// 输出 5050return0;}说明for 循环的三个表达式都可以省略但分号不能省省略表达式2时相当于条件恒为真需配合 break 使用。3. 循环控制关键字3.1 break作用直接跳出整个循环循环结束for、while、do while 都能用。简单示例在 1 到 10 中查找第一个能被 7 整除的数找到后立即跳出循环。#includestdio.hintmain(){for(inti1;i10;i){// i 从 1 循环到 10if(i%70){// 判断 i 能否被 7 整除printf(找到第一个能被 7 整除的数%d\n,i);// 7 满足条件输出 7break;// 找到后立即跳出整个 for 循环不再继续}printf(检查 i %d不满足\n,i);// 1~6 会执行到这里}printf(循环已结束\n);// break 之后直接执行这里return0;}说明break 只能跳出当前所在的那一层循环如果循环里还嵌套了 switchbreak 只会跳出 switch不会跳出外层循环。3.2 continue作用跳过本次循环剩下代码直接执行下一轮条件判断。简单示例输出 1 到 10 中的奇数遇到偶数就跳过本次循环。#includestdio.hintmain(){for(inti1;i10;i){// i 从 1 循环到 10if(i%20){// 判断 i 是否为偶数continue;// 是偶数就跳过本轮剩余代码直接进入下一轮}printf(奇数%d\n,i);// 只有奇数会执行到这里输出 1 3 5 7 9}return0;}说明continue 只是结束本次循环循环本身不会终止这一点与 break 有本质区别。break 与 continue 对比#includestdio.hintmain(){printf(break 的效果\n);for(inti1;i5;i){if(i3){break;// i 等于 3 时整个循环结束}printf(i %d\n,i);// 只输出 1、2}printf(continue 的效果\n);for(inti1;i5;i){if(i3){continue;// i 等于 3 时只跳过本轮}printf(i %d\n,i);// 输出 1、2、4、5}return0;}4. 总结本文围绕 C 语言的两大控制结构展开核心要点回顾如下分支语句的选择建议只有成立就做、不成立什么都不做时用if单分支。只有两种互斥情况如及格/不及格时用if...else双分支。存在多个区间或连续范围判断如成绩等级时用if...else if...else注意条件从上到下依次判断命中即跳出。简单的二选一取值可以用三目运算符条件 ? 值1 : 值2简化代码但嵌套不宜超过两层混用其它运算符时务必加括号。判断的是离散的整型常量如菜单编号、星期几时优先用switch结构更清晰记得每个case后加break并用default兜底。三种循环的选用原则while先判断后执行循环次数不确定、由条件决定时使用条件一开始不成立则一次都不执行。do while先执行后判断至少执行一次适合先做再问要不要继续的场景如输入校验、菜单循环注意while(...)后的分号不能丢。for次数明确的循环首选把初始化、条件、迭代写在一行结构紧凑、不易漏写自增导致死循环。循环控制关键字break立即结束整个循环只跳出当前一层常用于找到目标就停止。continue只跳过本次循环剩余代码直接进入下一轮判断循环本身继续。实践建议写循环时先确认三件事——初始值、终止条件、每轮如何变化三者缺一就容易写出死循环或差一错误off-by-one。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询