《C语言入门必修:一篇吃透分支与循环》
2026/7/26 9:43:53 网站建设 项目流程

文章目录

  • 文章简述
  • 分支结构
    • if语句
    • switch语句
  • 循环结构
    • while循环
    • for循环
    • do-while循环
  • 辅助跳转语句break和continue语句
    • break
    • continue语句

文章简述

C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,这里对分支结构(即选择结构)、循环结构进行详细说明,该文章包含分支与循环概念讲解两个辅助跳转语句代码练习个人理解,满足初学者从开始理解动手练习全过程。

温馨提示:先看完全篇自行理解再开始上手体验更佳。

分支结构

包含if语句、switch语句

if语句

语法形式

if(表达式)语句

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行

下面用一个简单的例子来说明

#include<stdio.h>intmain(){intn=0;scanf("%d",&n);if(n%2==1)printf("n是奇数");return0;}

其中,if后方()中为表达式,下方第一行printf内容为表达语句,这就构成了简单的if语句。你可能会有这几个问题:
1.()中的n%2==1是什么意思,以及为什么这么写
2.表达语句还能怎么写才能解决更复杂的问题呢
下面我们一一来看

第一个问题:()中的n%2==1是什么意思,以及为什么这么写
n%2==1,是指n除以2余数是否等于1。
其中“==”是判断两边值是否相等,相等为真,不相等为假,在C语言中,0为假,非0表示真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果不是0,则语句执行
在if语句中必须要用==来判断,不能使用=来判断。从if开始到语句结束,这是一整部分,if()后面不需要添加;否则会阻断语句。
补充一个“防呆”写法防止少写等号,在 C 语言中,如果写成 if (1 == n)(卫语句),如果手误写成 if (1 = n),编译器会直接报错,从而防止逻辑错误。这是很多 C 语言老手的习惯。
在回答底二个问题前,我们先来介绍else
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
我们就要用到else,语法形式如下:

if(表达式)语句1else语句2

我们来写一个简单的判断数字奇偶性的练习:

#include<stdio.h>intmain(){intn=0;scanf("%d",&n);if(n%2==1){printf("n是奇数\n");}else{printf("n是偶数");}}

注:为了便于阅读我们可以在每个部分加上{},同时也可以让我们在{}内输入多个语句,

if(表达式){语句1;语句2;……}else{语句1;语句2;……}

若不加上{},if后就只能接一条语句,即

if(表达式)语句

第二个问题:表达语句还能怎么写才能解决更复杂的问题
答案很明显,结合else,在后面添加多个内容,例如:

#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num%2==1)printf("%d 是奇数\n",num);elseprintf("%d 是偶数\n",num);return0;}

练习:输⼊⼀个年龄,>=18岁就输出:成年,否则就输出:未成年

#include<stdio.h>intmain(){intage=0;scanf("%d",&age);if(age>=18)printf("成年\n");else{printf("未成年\n");}return0;}

进一步的,我们可以在每个部分增加语句:

#include<stdio.h>intmain(){intage=0;scanf("%d",&age);if(age>=18){printf("成年了\n");printf("可以谈恋爱了\n");}else{printf("未成年\n");printf("不能谈恋爱\n");}return0;}

注:else总是跟最接近的if匹配,并不是看else跟谁对齐就跟谁匹配,例如:

#include<stdio.h>intmain(){inta=0;intb=2;if(a==1)if(b==2)printf("hehe\n");elseprintf("haha\n");return0;}

答案是什么都不打印,因为实际上它是这样的

#include<stdio.h>intmain(){inta=0;intb=2;if(a==1){if(b==2)printf("hehe\n");elseprintf("haha\n");}return0;}

当然为了实现更复杂的问题,我们可以利用嵌套if

if else语句中,else可以与另⼀个if 语句连用,构成多重判断。比如:要求输入⼀个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:

#include<stdio.h>intmain(){intnum=0;scanf("%d",&num);if(num==0)printf("输⼊的数字是0\n");elseif(num>0)//这⾥的if相当于嵌套在else语句中,形成了嵌套结构printf("输⼊的数字是正数\n");elseprintf("输⼊的数字是负数\n");return0;}

练习:输⼊⼀个人的年龄,如果年龄<18岁,打印"少年";如果年龄在18岁至44岁打印"⻘年";如果年龄在45岁至59岁打印"中老年";如果年龄在60岁至89岁打印"老年";如果90岁及以上打印"老寿星"

#include<stdio.h>intmain(){intage=0;scanf("%d",&age);if(age<18){printf("少年\n");}elseif(age<=44){printf("⻘年\n");}elseif(age<=59){printf("中⽼年\n");}elseif(age<=89){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的数字,打印对应的星期几

#include<stdio.h>intmain(){intday=0;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语句的特性,上述代码可以简化为:

#include<stdio.h>intmain(){intday=0;scanf("%d",&day);switch(day){case1:case2:case3:case4:case5:printf("工作日\n");break;case6:case7:printf("休息日\n");break;}return0;}

在使⽤switch语句的时候,我们经常可能遇到⼀种情况,比如switch后的表达式中的值无法匹配代码中的case语句的时候,这时候要不就不做处理,要不就得在switch语句中加default子句。
那么以上述例子为基础,代码可以改写为:

#include<stdio.h>intmain(){intday=0;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的值
参考代码:

#include<stdio.h>intmain(){intn=1;while(n<=10){printf("%d ",n);n=n+1;}return0;}

练习:输⼊⼀个正的整数,逆序打印这个整数的每⼀位,如:
输入:1234
输出:4 3 2 1

#include<stdio.h>intmain(){intn=0;scanf("%d",&n);while(n)//当n==0时为假,循环结束{printf("%d ",n%10);n/=10;}return0;}

for循环

for(表达式1;表达式2;表达式3)//每个表达式之间用`;`隔开语句//如果循环体想包含更多的语句,可以加上⼤括号

下面详细说说每个表达式的作用
表达式1:初始化变量
表达式2:判断
表达式3:调整

例如:

for(inti=0;i<10;i++)//当然变量也可以在循环外创建,只用初始化i=0

这个表达式表达的意思是:变量i初始化为0,执行循环的条件是i小于10,每次循环结束后i=i+1
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

练习:在屏幕上打印1~10的值

#include<stdio.h>intmain(){inti=0;for(i=1;i<=10;i++){printf("%d ",i);}return0;}

下面我们进阶一点,尝试将上述讲过的循环结合使用
练习:计算1~100之间3的倍数的数字之和

#include<stdio.h>intmain(){intsum=0;//创建变量用来储存和for(inti=1;i<=100;i++){if(i%3==0)//判断条件{sum+=i;}printf("1~100之间3的倍数的数字之和为%d",sum);}return0;}

当然上述代码还存在简化空间,比如1、2肯定不是3的倍数,所以我们直接从可以从3开始,即i=3;我们也知道3的倍数本质上是多个3之和,
6=3*2=3+3
9=3*3=3+3+3
……
那么我们就可以把每次循环结束后的调整代码修改为i+=3
代码就可以写成:

#include<stdio.h>intmain(){intsum=0;//创建变量用来储存和for(inti=3;i<=100;i+=3){if(i%3==0)//判断条件{sum+=i;}printf("1~100之间3的倍数的数字之和为%d",sum);}return0;}

do-while循环

在循环语句中do-while语句的使⽤最少,它的语法如下:

do语句//如果循环体想包含更多的语句,也可以加上⼤括号{}while(表达式)

whilefor这两种循环都是先判断,条件如果满足就进⼊循环,执行循环语句,如果不满足就跳出循环;而do while循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。(省流版:先干活,干完后看老板脸色(判断条件),老板说行(真)就继续干,老板说不行(假)就下班)

所以在do while 语句中循环体是至少执行一次的,这是do while循环比较特殊的地方。

多说无益,下面我们直接来看一个例子:

打印1~10的值

#include<stdio.h>intmain(){inti=1;do{printf("%d ",i);i=i+1;}while(i<=10);return0;}

练习:输⼊一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出 : 2

#include<stdio.h>intmain(){intn=0;scanf("%d",&n);inta=0;//用来统计位数do{a++;n=n/10;}while(n);//当n==0时循环结束printf("%d\n",a);return0;}

辅助跳转语句break和continue语句

break

作用:
1.在循环里直接终止整个循环
例如:

#include<stdio.h>intmain(){inti=1;while(i<=10){if(i==5)break;printf("%d ",i);i=i+1;}return0;}

我们运行看看


可以知道,在i==5的时候满足了if的判断条件,执行了break之后i的值就没有继续向后加了,可知break无论循环是否完成都直接跳出了整个while循环

2.在switch里直接终止整个循环,跳出循环体
这个作用在switch部分做过说明,这里不详细介绍

continue语句

只能用于循环结构不能用在switch

作用:跳过本次循环剩余代码直接进入下一次循环,我拿同样的代码演示一下

#include<stdio.h>intmain(){inti=1;while(i<=10){if(i==5)continue;printf("%d ",i);i=i+1;}return0;}

i==5时,执行continue,跳过下面所有代码,导致i++未执行,i的值始终为5,一直循环下去
下面我用for循环演示一下
用break

#include<stdio.h>intmain(){inti=1;for(i=1;i<=10;i++){if(i==5)break;printf("%d ",i);}return0;}

用continue

#include<stdio.h>intmain(){inti=1;for(i=1;i<=10;i++){if(i==5)continue;printf("%d ",i);}return0;}

对比可以发现,break跳出循环5及以后的所有数都不再打印,而continue只是跳出了5这一次循环

最后我们以一个练习来结束这个部分
找出100~200之间的素数,并打印在屏幕上

#include<stdio.h>intmain(){for(inti=100;i<=200;i++)//产生100~200的数字{intj=1;intflag=0;//用作标记for(j=2;j<i;j++){if(i%j==0){flag=1;break;//不是素数,跳出j的循环,检测下一个i值}}if(flag==0){printf("%d",i);//打印素数}}return0;}

再介绍一种可以简化的地方

#include<stdio.h>intmain(){inti=0;for(i=100;i<=200;i++){intj=0;intflag=0;// 标记是否为素数,0表示是,1表示不是// 优化:只需要试除到 sqrt(i) 即可for(j=2;j*j<=i;j++){if(i%j==0){flag=1;// 发现因子,不是素数break;// 跳出内层循环,提高效率}}// 如果 flag 依然为 0,说明是素数if(flag==0){printf("%d ",i);}}return0;}

感兴趣的读者可以去了解一下数学原理,这里我不做过多叙述


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询