循环程序结构:for
加入嵌入式技术QQ群:398294860,免费获取嵌入式技术文档,嵌入式最新学习路线指南,更多嵌入式教程,访问宅学部落淘宝店:https://wanglitao.taobao.com/
在上一节的while循环中,为了让一段代码重复执行三次,我们定义了一个 i 变量,用来控制循环的次数:
#include <stdio.h>
int main(void)
{
int sum;
int a, b;
int i = 0; //语句1,初始化循环控制变量
while(i < 3) //语句2,判断循环条件是否为真
{
printf("input a b: "); //真正要循环运行的代码
scanf("%d %d", &a, &b); //真正要循环运行的代码
sum = a + b; //真正要循环运行的代码
printf("sum = %d\n", sum); //真正要循环运行的代码
i++; //语句3,执行完一次循环后,循环控制变量加1
}
return 0;
}
从上面的注释可以看到:为了要循环运行大括号代码块内的4行代码,我们添加了语句1、语句2和语句3来控制循环的次数。这些控制语句分散在不同的地方,跟真正要循环运行的代码混在一起,显得十分松散,耦合性不强。
这一节,我们可以使用for循环来改造它:
#include <stdio.h>
int main(void)
{
int sum;
int a, b;
for(int i = 0; i < 3; i++)
// 语句1 语句3 语句2
{
printf("input a b:"); //真正要循环运行的代码
scanf("%d %d", &a, &b); //真正要循环运行的代码
sum = a + b; //真正要循环运行的代码
printf("sum = %d\n", sum);//真正要循环运行的代码
}
return 0;
}
通过上面的程序我们可以看到:while循环通过for语句改造后,大括号包起来的代码块代码是真正要循环运行的代码,而跟循环控制相关的语句则全部提取,并集中到了for语句的小括号内。通过这种设计,循环控制语句和真正要循环运行的代码实现了隔离,逻辑清晰,泾渭分明,程序的可读性更高。
for循环的使用方法如下:
for(初始化表达式1;条件判断表达式2;自增表达式3)
{
执行语句1;
执行语句2;
}
for循环中代码块内的代码,是真正要循环运行的代码。控制循环次数的语句在小括号内,一般由三个表达式组成:初始化表达式、条件判断表达式、自增表达式,各个表达式之间用分号隔开。for循环的执行流程如下所示:
- 初始化表达式1会首先执行,且只执行一次,用来初始化循环控制变量
- 接下来会执行条件判断表达式2,判断循环条件是否为真,为真则执行循环代码,为假则不执行循环代码,结束for循环。
- 若循环条件为真,执行完循环代码后,会接着执行自增表达式3,修改循环控制变量
- 修改好循环控制变量后,会接着重复第2步:执行循环判断表达式2,看是否继续下一次循环
for循环的灵活使用
for循环中的三个表达式是可选的,不一定非得写全。在实际的编程中,根据实际的场景和业务需要,for循环可以有很多灵活地写法。比如,如果我们想实现一个死循环,可以采用下面的形式:
for( ; ;)
{
执行语句1;
执行语句2;
}
当条件判断表达式为空时,for循环就变成了无限循环,相当于while(1)。
自增表达式3也可以省略,把它放到循环体中:
for(初始化表达式1;条件判断表达式2;)
{
执行语句1;
执行语句2;
自增表达式3;
}
有些条件判断表达式并不一定都是整数比较大小,会有各种各有的判断:比如输入非空判断、结束符判断、出错处理判断、特定字符检测判断等,此时我们要根据实际的使用场景来灵活地设置for循环。
专门为嵌入式设计的C语言进阶视频教程:《C语言嵌入式Linux高级编程》,一共9期,涉及计算机体系结构、ARM汇编与反汇编、程序的编译链接原理、堆栈内存、Linux内核的面向对象编程思想、多任务编程、C语言的模块化编程等专题,具体课程详情可点击淘宝:C语言嵌入式Linux高级编程