8.C程序三大结构之循环结构
8.1.循环结构功能:将一组语句重复多次执行
三种类型循环:for循环,while循环,do...while循环
8.2.for循环
a)语法格式:
for(表达式1; 表达式2; 表达式3) {
循环语句;
}
语义(执行流程):
第一步骤:首先计算,运行表达式1(只做一次)
第二步骤:然后计算,运行表达式2
如果表达式2的结果为真,那么就执行运行循环语句
如果表达式2的结果为假,那么for循环结束退出
第三步骤:如果如果表达式2的结果为真,那么就执行运行循环语句,并且当循环语句执行完毕
再接着计算,运行表达式3,表达式3运行完毕,重复第二步骤
b)for循环的使用形式:
形式1:
int i;
for(i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
注意:这里i有对应的专业术语:循环变量
形式2:
int i = 0;
for(; i < 5; i++) {
printf("i = %d\n", i);
}
形式3:
int i = 0;
for(; i < 5; ) {
printf("i = %d\n", i);
i++; //循环变量放在循环语句中
}
形式4:死循环
for(;;) {
printf("hello,world\n");
}
注意:按ctrl+c键退出程序
int i = 0;
for(;;) {
printf("i = %d\n", i);
i++; //循环变量放在循环语句中
if(i >= 5) {
break; //中断,结束for循环,如果for循环是嵌套,只是中断最内层for循环
}
}
形式5:
int i, j;
for(i = 0, j = 0; i < 5 && j < 5; i++, j++) {
printf("i = %d, j = %d\n", i, j);
}
形式6:
for(int i = 0; i < 5; i++) {
printf("i = %d\n", i);
}
printf("i = %d\n", i); //gcc报错
注意:如果循环变量定义是在表达式1中完成,那么循环变量只能用于for循环
for循环之外不可用
形式7:
int i;
for(i = 0; i < 5; i++) {
if(3 == i) {
continue; //中断,结束本次循环,继续下一次循环
//当i=3时,执行continue关键字,
//后面的循环语句不再执行,直接去执行表达式3,i++
然后重复下一次循环
}
printf("i = %d\n", i);
}
作业:打印100以内的奇数
1 3 5 7 ...
作业:打印图案
**********
**********
**********
**********
**********
for(....) { //负责打印多少行
for(....) //负责打印一行多少个*
}
c)for循环语句中如果仅有一条语句,{}可以省略(建议不要这么干)
for(int i = 0; i < 5; i++)
printf("i = %d\n", i);
8.3.while循环
a)语法格式
while(循环控制表达式) {
循环语句;
}
语义,执行流程:
第一步骤:首先计算,运算循环控制表达式
如果计算的结果为真,那么执行循环语句
如果计算的结果为假,while循环直接结束
第二步骤:当循环语句执行完毕,继续执行运行第一步骤
例如:
int i = 0;
while(i < 5) {
printf("i = %d\n", i);
i++;
}
while死循环:
while(1) {
printf("hello,world\n");
}
b)注意:如果while的循环语句只有一条,{}可以不加(由衷建议不要这么做)
int i = 0;
while(i++ < 5)
printf("i = %d\n", i);
8.4.do-while循环
a)语法格式
do {
循环语句;
}while(循环控制表达式); //切记此分号不可省略
语义:执行流程:
第一步骤:先执行循环语句; //第一次没有做判断
第二步骤:然后计算,运行循环表达式
如果为真,继续执行循环语句,后续依次重复
如果为假,循环结束
特点:do-while至少执行一次!
例如:
int i = 0;
do {
printf("i = %d\n", i);
}while(i++ < 5);
8.5.goto语句(从哪来滚回哪去)
1)作用:可以让CPU跳转到任何一条语句去执行(孙悟空翻跟头)
应用:linux内核操作系统大量使用goto语句(linus)
2)语法:
goto 标签名; //标签名就是指定要跳转的地方
注意:标签名根据标识符命名规则来定
3)使用形式:两种
形式1:
标签名:
语句
...
goto 标签名;
....
例如:
label:
printf("1\n");
goto label;
printf("2\n");
形式2:
goto 标签名;
....
标签名:
语句;
...
例如:
goto label;
printf("2\n");
label:
printf("1\n");
练习:用goto实现0+1+2+...+100
4)linux内核源码中goto语句经典使用模板
需求:启动一个程序,分配三块内存,只要有一块内存分配失败,程序结束,并且把之前分配
成功的内存释放归还给linux操作系统
参考代码:goto.c
/* goto.c */
#include <stdio.h>
int main(void)
{
int ret = 0; //0:表示分配内存成功;1:表示分配内存失败
printf("分配第一块内存.\n");
// ret = 1; //表示第一块分配失败了
// printf("第一块分配失败了.\n");
if(1 == ret)
goto free1;
printf("分配第二块内存.\n");
// ret = 1; //表示第二块分配失败了
// printf("第二块分配失败了.\n");
if(1 == ret)
goto free2;
printf("分配第三块内存.\n");
// ret = 1; //表示第三块分配失败了
// printf("第三块分配失败了.\n");
if(1 == ret)
goto free3;
printf("三块内存都分配成功.\n");
return 0; //给操作系统返回成功
free3:
printf("释放第二块内存.\n");
free2:
printf("释放第一块内存.\n");
free1:
return ret; //给操作系统返回失败
}