【C语言从入门到进阶】分支与循环详解:if、switch、for、while、do while、break、continue 一篇搞懂

📅 2026/8/27 12:31:48
【C语言从入门到进阶】分支与循环详解:if、switch、for、while、do while、break、continue 一篇搞懂
文章目录前言一、学习分支前必须掌握的基础知识1.1 C语言中的真和假1.2 关系运算符1.3 逻辑运算符二、什么是分支结构2.1 单分支if2.2 双分支if...else2.3 多分支if...else if...else2.4 if嵌套switch多分支2.6 switch中的break与case穿透2.7 if和switch应该如何选择三、什么是循环四、三种基本循环4.1while循环死循环4.2 for循环4.3 for循环的执行顺序4.4 while和for的关系4.5 do...while循环4.6 while与do...while的区别4.7 三种循环总结循环控制break与continue5.1 break5.2 continue5.3 break与continue区别六、循环的进阶使用嵌套循环6.1 案例九九乘法表6.2 案例2打印4× \times×5的矩形七、分支与循环的综合应用案例猜数字游戏八、常见错误与最终总结8.1 把 写成 8.2 if后面误加分号8.3 switch忘记break8.4 忘记修改循环变量8.5循环边界错误前言在学习C语言时我们最开始接触的程序通常是按照代码从上到下依次执行的例如#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){printf(Hello!\n);printf(Im Yeqiu.\n);printf(Goodbye!\n);return0;}程序员会按照代码书写的顺序依次执行三个printf。但是在真正的程序中我们往往会遇到更加复杂的问题如果考试成绩大于等于60分就显示”及格“否则显示”不及格“如果用户输入1就执行功能A输入2就执行功能B连续输出1~100重复输入密码直到输入正确为止。显然仅仅依靠”从上到下执行“无法更好的解决这些问题。因此C语言提供了两种非常重要的程序控制结构分支结构Branch根据不同条件选择不同代码执行。循环结构Loop在满足一定条件时重复执行一段代码。它们和顺序结构一起构成了程序设计中最基本的三种结构顺序结构分支结构循环结构本文将详细介绍C语言的分支语句和循环语句。一、学习分支前必须掌握的基础知识在真正学习 if 和 switch 之前需要先理解 C 语言到底是怎样判断一个条件是否成立的。这一部分建议先解决三个问题什么是真和假怎样比较两个数据怎样组合多个条件1.1 C语言中的真和假C语言规定0→ \to→假非0→ \to→真例如if(1){printf(执行\n);}由于 1 是非 0因此条件成立。而if(0){printf(不会执行\n);}条件为假所以代码不会执行因此需要记住;在C语言中0表示假非0表示真。1.2 关系运算符实际编程中我们通常不会直接写if (1)而是通过比较数据得到真假结果。常见的关系运算符有运算符含义大于小于大于等于小于等于等于!不等于例如if (score 60)表示判断score 是否大于等于 60。这里需要特别注意表示判断是否相等。而表示赋值。例如int a 10;表示把 10 赋值给变量 a。所以if (a 10)和if (a 10)含义完全不同。这是初学 C 语言时非常容易出现的错误。1.3 逻辑运算符有时候一个条件还不够需要同时判断多个条件。这时候就需要逻辑运算符。运算符含义逻辑与并且| |逻辑与或者逻辑非取反并且例如if (age 18 age 60)表示age 18并且age 60两个条件都成立整个条件才成立。||或者例如if (day 6 || day 7)表示day 等于 6或者day 等于 7只要其中一个条件成立整个条件就成立。!取反例如if (!flag)表示把 flag 原来的真假结果反过来。二、什么是分支结构前面的知识解决了;“条件怎么写”接下来正式解决“条件成立以后怎么办”所谓”分支“可以理解为程序在执行到某个位置时需要进行一次”选择“。例如如果今天下雨 就带伞 否则 不带伞程序中的逻辑也是类似的。例如我们输入一个整数判断它是正数还是负数#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){intnum0;scanf(%d,num);if(num0)printf(正数\n);elseprintf(非正数\n);return0;}这里的num0就是程序进行判断的条件。如果条件成立就执行printf(正数\n);否则执行printf(非正数\n);C语言中常见的分支语句主要有ifif…elseif…else if…elseswitch…case…default下面分别介绍。2.1 单分支if基本形式为if(条件){语句;}例如intage20;if(age18){printf(已经成年\n);}程序首先判断age18如果这个表达式成立就执行大括号中的代码。如果条件不成立则直接跳过if中的代码。因此 if 适合条件成立就执行不成立什么也不用做。2.2 双分支if…else如果希望条件成立执行一种情况不成立执行另外一种情况就使用if(条件){条件成立执行;}else{条件不成立执行;}例如判断奇偶数intnum0;scanf(%d,num);if(num%20){printf(偶数\n);}else{printf(奇数\n);}2.3 多分支if…else if…else如果程序存在三种甚至更多情况可以使用if(条件1){语句1}elseif(条件2){语句2}elseif(条件3){语句3}else{语句4}例如成绩等级if(score90){printf(优秀\n);}elseif(score80){printf(良好\n);}elseif(score60){printf(及格\n);}else{printf(不及格\n);}这里最重要的是程序会从上往下依次判断一旦某个条件成立后面的分支不会继续执行。因此判断顺序非常重要。2.4 if嵌套if 中还可以继续使用 if。例如if(num10num100){if(num%20){printf(这是10~100之间的偶数\n);}}这种结构称为分支嵌套不过如果条件并不复杂也可以写成if(num10num100num%20){printf(这是10~100之间的偶数\n);}实际编程中应该优先考虑代码的可读性。switch多分支如果需要判断的不是一个范围而是几个固定值就可以使用switch基本语法switch(表达式){case常量1:语句;break;case常量2:语句;break;default:语句;break;}例如intchoice0;scanf(%d,choice);switch(choice){case1:printf(开始游戏\n);break;case2:printf(游戏设置\n);break;case3:printf(退出游戏\n);break;default:printf(输入错误\n);break;}2.6 switch中的break与case穿透这里第一次正式介绍 break。在 switch 中break 表示立即结束当前的switch如果没有写 breakswitch(num){case1:printf(one\n);case2:printf(two\n);default:printf(three\n);}当num1;可能得到one two three这就是case 穿透fall-through因此正常情况下建议在每个 case 后写break;2.7 if和switch应该如何选择最后把两种分支统一比较情况推荐判断大小if判断范围if多个复杂条件if判断几个固定值switch菜单选择switch可以简单理解if 擅长判断条件switch 擅长匹配固定值三、什么是循环学习完分支以后再进入循环。假设要输出一次Hello可以写printf(Hello\n);如果输出 5 次可以写 5 个 printf。但是如果输出 10000 次就不可能手动写 10000 行代码。因此需要循环循环就是在满足一定条件时让某一段代码重复执行。C 语言中最常见的三种循环whilefordo...while这三种循环本质上都可以完成重复执行但使用方式不同。四、三种基本循环这一部分将按照while↓for↓do…while三种循环对比的顺序学习。4.1while循环基本语法while(条件){循环体;}例如输出 1~10inti1;while(i10){printf(%d ,i);i;}执行过程初始化 i1↓ 判断 i10↓ 是否成立 ↙ ↘ 是 否 ↓ ↓ 执行循环体 结束循环 ↓ 修改 i ↓ 重新判断这里可以顺便引出一个非常重要的问题死循环例如inti1;while(i10){printf(%d\n,i);}因为没有i;所以i 永远等于1导致i10永远成立循环就不会结束。因此写循环时一定要思考循环条件有没有机会变成假4.2 for循环掌握 while 后再学习 for 会更加容易理解。基本语法for(初始化;判断条件;调整){循环体;}例如for(inti1;i10;i){printf(%d ,i);}这里inti1表示初始化。i10;表示循环条件。i表示循环变量调整。4.3 for循环的执行顺序这是 for 循环中最需要重点讲清楚的地方。for(inti1;i5;i){printf(%d ,i);}真正的执行顺序是① 初始化inti1↓ ② 判断 i5↓ ③ 执行循环体 ↓ ④ i↓ ⑤ 再次判断 ↓ 重复执行需要特别注意初始化只执行一次之后重复的是判断 → 循环体 → 调整4.4 while和for的关系例如inti1;while(i10){printf(%d ,i);i;}与for(inti1;i10;i){printf(%d ,i);}实现的效果基本相同。一般来说循环次数明确就选择for例如输出1~100 循环100次 遍历数组而循环次数不确定但结束条件明确就选择 while例如不断输入密码 直到密码正确4.5 do…while循环最后来学习 do…while基本语法do{循环体;}while(条件);例如inti1;do{printf(%d ,i);i;}while(i10);4.6 while与do…while的区别这是 do…while 最重要的知识点。while先判断再执行而 do…while:先执行在判断例如inti100;while(i10){printf(Hello\n);}一次都不会执行。而inti100;do{printf(Hello\n);}while(i10);仍然会输出一次Hello因此do…while 至少执行一次4.7 三种循环总结学习完三种循环之后再统一比较:循环特点常见应用for初始化、判断、调整集中循环次数明确while先判断后执行循环次数不确定do…while先执行后判断至少执行一次循环控制break与continue三种基本循环学完以后再学习breakcontinue5.1 break在循环中break 的作用是立即结束整个循环例如for(inti1;i10;i){if(i5){break;}printf(%d ,i);}结果12345.2 continuecontinue的作用是结束本次循环继续下一次循环例如for(inti1;i10;i){if(i5){continue;}printf(%d ,i);}结果12346789105.3 break与continue区别可以直接记成break↓ 结束整个循环continue↓ 跳过本次循环 ↓ 继续下一次六、循环的进阶使用嵌套循环学习完一个循环以后再进入多个循环之间的组合。例如for(inti1;i3;i){for(intj1;j3;j){printf(i %d, j %d\n,i,j);}}这里外层循环执行 3 次每执行一次外层循环内层循环完整执行 3 次所以总共执行3 × 3 9次。6.1 案例九九乘法表代码#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){for(inti1;i9;i){for(intj1;ji;j){printf(%d * %d %d ,j,i,i*j);}printf(\n);}return0;这里最重要的是ji内层循环次数会随着外层变量 i 变化这也是嵌套循环非常典型的应用。6.2 案例2打印4× \times×5的矩形代码#define_CRT_SECURE_NO_WARNINGS#includestdio.hintmain(){for(inti0;i4;i){for(intj0;j5;j){printf(*);}printf(\n);}return0;}可以理解为外层循环 → 控制行 内层循环 → 控制列七、分支与循环的综合应用案例猜数字游戏这里主要通过综合案例猜数字游戏来演示代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestdlib.h#includetime.hvoidgame(){intcount5;intrrand()%1001;while(count){intguess0;printf(你还有%d次机会请输入数字\n,count);scanf(%d,guess);if(guessr)printf(猜大了\n);elseif(guessr)printf(猜小了\n);else{printf(恭喜你猜对了\n);break;}count--;if(count0){printf(很遗憾次数用完了游戏结束\n);break;}}}intmain(){srand((unsignedint)time(NULL));intinput0;do{printf(--------------------\n);printf(----- 1.play -----\n);printf(----- 0.exit -----\n);printf(--------------------\n);printf(请输入\n);scanf(%d,input);switch(input){case1:game();break;case0:printf(退出游戏\n);break;default:printf(输入错误请重新输入\n);break;}}while(input);return0;}注这里涉及到函数以及随机数等知识后续文章会讲到暂且忽略此部分中分支负责判断用户猜大了、猜小了还是猜对了循环负责如果没有猜对就让用户继续猜break负责猜对以后退出循环八、常见错误与最终总结最后部分总结一下易错的点不要把错误分散在文章各处否则文章容易显得碎8.1 把 写成 错误if(a10)正确if(a10)8.2 if后面误加分号错误if(a10);{printf(a 10\n);}正确if(a10){printf(a 10\n);}8.3 switch忘记break容易造成case穿透8.4 忘记修改循环变量例如while(i10){printf(%d,i);}这样会造成死循环8.5循环边界错误例如for(inti1;i10;i)表示范围1~9而for(inti1;i10;i)表示范围1~10因此一定要注意 和 的区别至此C 语言中的分支与循环就基本学习完成了总结就两句话分支决定程序“走哪条路”循环决定程序“这条路走多少遍”掌握分支与循环之后我们就可以开始编写真正具有判断能力和重复执行能力的程序为之后学习数组、函数、指针等内容打下基础。