《C语言入门必修:一篇吃透分支与循环》

发布时间:2026/7/26 9:44:15
《C语言入门必修:一篇吃透分支与循环》 文章目录文章简述分支结构if语句switch语句循环结构while循环for循环do-while循环辅助跳转语句break和continue语句breakcontinue语句文章简述C语言是结构化的程序设计语言这里的结构指的是顺序结构、选择结构、循环结构C语言是能够实现这三种结构的,这里对分支结构(即选择结构)、循环结构进行详细说明该文章包含分支与循环概念讲解、两个辅助跳转语句、代码练习、个人理解满足初学者从开始理解到动手练习全过程。温馨提示:先看完全篇自行理解再开始上手体验更佳。分支结构包含if语句、switch语句if语句语法形式if(表达式)语句表达式成立(为真)则语句执行表达式不成立(为假)则语句不执行下面用一个简单的例子来说明#includestdio.hintmain(){intn0;scanf(%d,n);if(n%21)printf(n是奇数);return0;}其中if后方中为表达式下方第一行printf内容为表达语句这就构成了简单的if语句。你可能会有这几个问题1.中的n%21是什么意思以及为什么这么写2.表达语句还能怎么写才能解决更复杂的问题呢下面我们一一来看第一个问题中的n%21是什么意思以及为什么这么写n%21,是指n除以2余数是否等于1。其中“”是判断两边值是否相等相等为真不相等为假在C语言中0为假非0表示真也就是表达式的结果如果是0则语句不执行表达式的结果如果不是0则语句执行在if语句中必须要用来判断不能使用来判断。从if开始到语句结束这是一整部分if()后面不需要添加;否则会阻断语句。补充一个“防呆”写法防止少写等号,在 C 语言中如果写成 if (1 n)卫语句如果手误写成 if (1 n)编译器会直接报错从而防止逻辑错误。这是很多 C 语言老手的习惯。在回答底二个问题前我们先来介绍else如果⼀个数不是奇数那就是偶数了如果任意⼀个整数我们要清楚的判断是奇数还是偶数怎么表示呢我们就要用到else语法形式如下if(表达式)语句1else语句2我们来写一个简单的判断数字奇偶性的练习#includestdio.hintmain(){intn0;scanf(%d,n);if(n%21){printf(n是奇数\n);}else{printf(n是偶数);}}注为了便于阅读我们可以在每个部分加上{}同时也可以让我们在{}内输入多个语句if(表达式){语句1;语句2;……}else{语句1;语句2;……}若不加上{}if后就只能接一条语句即if(表达式)语句第二个问题表达语句还能怎么写才能解决更复杂的问题答案很明显结合else在后面添加多个内容例如#includestdio.hintmain(){intnum0;scanf(%d,num);if(num%21)printf(%d 是奇数\n,num);elseprintf(%d 是偶数\n,num);return0;}练习输⼊⼀个年龄18岁就输出成年否则就输出未成年#includestdio.hintmain(){intage0;scanf(%d,age);if(age18)printf(成年\n);else{printf(未成年\n);}return0;}进一步的我们可以在每个部分增加语句#includestdio.hintmain(){intage0;scanf(%d,age);if(age18){printf(成年了\n);printf(可以谈恋爱了\n);}else{printf(未成年\n);printf(不能谈恋爱\n);}return0;}注else总是跟最接近的if匹配并不是看else跟谁对齐就跟谁匹配例如#includestdio.hintmain(){inta0;intb2;if(a1)if(b2)printf(hehe\n);elseprintf(haha\n);return0;}答案是什么都不打印,因为实际上它是这样的#includestdio.hintmain(){inta0;intb2;if(a1){if(b2)printf(hehe\n);elseprintf(haha\n);}return0;}当然为了实现更复杂的问题我们可以利用嵌套if在if else语句中else可以与另⼀个if 语句连用构成多重判断。比如要求输入⼀个整数判断输入的整数是0还是正数或者负数。请看如下代码#includestdio.hintmain(){intnum0;scanf(%d,num);if(num0)printf(输⼊的数字是0\n);elseif(num0)//这⾥的if相当于嵌套在else语句中形成了嵌套结构printf(输⼊的数字是正数\n);elseprintf(输⼊的数字是负数\n);return0;}练习输⼊⼀个人的年龄如果年龄18岁打印少年如果年龄在18岁至44岁打印⻘年如果年龄在45岁至59岁打印中老年如果年龄在60岁至89岁打印老年如果90岁及以上打印老寿星#includestdio.hintmain(){intage0;scanf(%d,age);if(age18){printf(少年\n);}elseif(age44){printf(⻘年\n);}elseif(age59){printf(中⽼年\n);}elseif(age89){printf(⽼年\n);}else{printf(⽼寿星\n);}return0;}switch语句switch语句是⼀种特殊形式的if…else 结构⽤于判断条件有多个结果的情况。它把多重的else if 改成更易用可读性更好的形式。switch(表达式)//必须是整型表达式{case结果1:语句//case后面必须 空格, case后的值必须是整形常量表达break;//每⼀个case 语句中的代码执⾏完成后需要加上break,才能跳出这个switch 语句。case结果2:语句//break;...default:语句//表示不满足上述所有情况下运行的代码}C89/C99 标准下switch 后面不能是浮点(float/double)或字符串。如果读者尝试switch(3.14)编译会报错。练习输⼊⼀个1~7的数字打印对应的星期几#includestdio.hintmain(){intday0;scanf(%d,day);switch(day){case1:printf(星期⼀\n);break;case2:printf(星期⼆\n);break;case3:printf(星期三\n);break;case4:printf(星期四\n);break;case5:printf(星期五\n);break;case6:printf(星期六\n);break;case7:printf(星期天\n);break;}return0;}如果输出内容变为工作日与休息日利用break与switch语句的特性上述代码可以简化为#includestdio.hintmain(){intday0;scanf(%d,day);switch(day){case1:case2:case3:case4:case5:printf(工作日\n);break;case6:case7:printf(休息日\n);break;}return0;}在使⽤switch语句的时候我们经常可能遇到⼀种情况比如switch后的表达式中的值无法匹配代码中的case语句的时候这时候要不就不做处理要不就得在switch语句中加default子句。那么以上述例子为基础代码可以改写为#includestdio.hintmain(){intday0;scanf(%d,day);switch(day){case1:case2:case3:case4:case5:printf(工作日\n);break;case6:case7:printf(休息日\n);break;default:printf(输入错误\n);break;}return0;}在switch语句中case子句和default子句有要求顺序吗default只能放在最后吗答在switch语句中case语句与default语句是没有顺序要求的只要你的顺序是满足你的需求就可以循环结构while循环while(表达式)语句//与if语句同理如果循环体想包含更多的语句可以加上⼤括号练习在屏幕上打印1~10的值参考代码#includestdio.hintmain(){intn1;while(n10){printf(%d ,n);nn1;}return0;}练习输⼊⼀个正的整数逆序打印这个整数的每⼀位如输入1234输出4 3 2 1#includestdio.hintmain(){intn0;scanf(%d,n);while(n)//当n0时为假循环结束{printf(%d ,n%10);n/10;}return0;}for循环for(表达式1;表达式2;表达式3)//每个表达式之间用;隔开语句//如果循环体想包含更多的语句可以加上⼤括号下面详细说说每个表达式的作用表达式1初始化变量表达式2判断表达式3调整例如for(inti0;i10;i)//当然变量也可以在循环外创建只用初始化i0这个表达式表达的意思是变量i初始化为0执行循环的条件是i小于10每次循环结束后ii1整个循环的过程中表达式1初始化部分只被执行1次剩下的就是表达式2、循环语句、表达式3在循环。练习在屏幕上打印1~10的值#includestdio.hintmain(){inti0;for(i1;i10;i){printf(%d ,i);}return0;}下面我们进阶一点尝试将上述讲过的循环结合使用练习计算1~100之间3的倍数的数字之和#includestdio.hintmain(){intsum0;//创建变量用来储存和for(inti1;i100;i){if(i%30)//判断条件{sumi;}printf(1~100之间3的倍数的数字之和为%d,sum);}return0;}当然上述代码还存在简化空间比如1、2肯定不是3的倍数所以我们直接从可以从3开始即i3我们也知道3的倍数本质上是多个3之和63*23393*3333……那么我们就可以把每次循环结束后的调整代码修改为i3代码就可以写成#includestdio.hintmain(){intsum0;//创建变量用来储存和for(inti3;i100;i3){if(i%30)//判断条件{sumi;}printf(1~100之间3的倍数的数字之和为%d,sum);}return0;}do-while循环在循环语句中do-while语句的使⽤最少它的语法如下:do语句//如果循环体想包含更多的语句也可以加上⼤括号{}while(表达式)while和for这两种循环都是先判断条件如果满足就进⼊循环执行循环语句如果不满足就跳出循环而do while循环则是先直接进入循环体执行循环语句然后再执行while后的判断表达式表达式为真就会进⾏下⼀次表达式为假则不再继续循环。省流版先干活干完后看老板脸色判断条件老板说行真就继续干老板说不行假就下班所以在do while 语句中循环体是至少执行一次的这是do while循环比较特殊的地方。多说无益下面我们直接来看一个例子打印1~10的值#includestdio.hintmain(){inti1;do{printf(%d ,i);ii1;}while(i10);return0;}练习输⼊一个正整数计算这个整数是几位数例如输入1234 输出4输入12 输出 2#includestdio.hintmain(){intn0;scanf(%d,n);inta0;//用来统计位数do{a;nn/10;}while(n);//当n0时循环结束printf(%d\n,a);return0;}辅助跳转语句break和continue语句break作用1.在循环里直接终止整个循环例如#includestdio.hintmain(){inti1;while(i10){if(i5)break;printf(%d ,i);ii1;}return0;}我们运行看看可以知道在i5的时候满足了if的判断条件执行了break之后i的值就没有继续向后加了可知break无论循环是否完成都直接跳出了整个while循环2.在switch里直接终止整个循环跳出循环体这个作用在switch部分做过说明这里不详细介绍continue语句只能用于循环结构不能用在switch作用跳过本次循环剩余代码直接进入下一次循环我拿同样的代码演示一下#includestdio.hintmain(){inti1;while(i10){if(i5)continue;printf(%d ,i);ii1;}return0;}i5时执行continue跳过下面所有代码导致i未执行i的值始终为5一直循环下去下面我用for循环演示一下用break#includestdio.hintmain(){inti1;for(i1;i10;i){if(i5)break;printf(%d ,i);}return0;}用continue#includestdio.hintmain(){inti1;for(i1;i10;i){if(i5)continue;printf(%d ,i);}return0;}对比可以发现break跳出循环5及以后的所有数都不再打印而continue只是跳出了5这一次循环最后我们以一个练习来结束这个部分找出100~200之间的素数并打印在屏幕上#includestdio.hintmain(){for(inti100;i200;i)//产生100~200的数字{intj1;intflag0;//用作标记for(j2;ji;j){if(i%j0){flag1;break;//不是素数跳出j的循环检测下一个i值}}if(flag0){printf(%d,i);//打印素数}}return0;}再介绍一种可以简化的地方#includestdio.hintmain(){inti0;for(i100;i200;i){intj0;intflag0;// 标记是否为素数0表示是1表示不是// 优化只需要试除到 sqrt(i) 即可for(j2;j*ji;j){if(i%j0){flag1;// 发现因子不是素数break;// 跳出内层循环提高效率}}// 如果 flag 依然为 0说明是素数if(flag0){printf(%d ,i);}}return0;}感兴趣的读者可以去了解一下数学原理这里我不做过多叙述完