知识点#
5.1 循环控制语句简介与 goto, while, do...while 语句精解#
- @ 循环控制图
- ![[白板/P9 循环控制.canvas|P9 循环控制]]
5.1.1 循环控制语句简介#
- @ 循环控制语句: 使程序代码被反复多次执行的语句
- % C 语言循环语句分类:
goto语句while语句do...while语句for语句
- ! 几乎所有有实用价值的应用程序都会包含循环结构
5.1.2 goto 语句#
[!tip] goto 语句
- @
goto语句: 无条件转向语句,用来跳转到某个程序位置进行执行- 一般形式:
goto 语句标号;- 语句标号是一个标识符,只能由字母、数字、下划线组成,第一个字符必须是字母或下划线
goto label1; // 合法
goto 123; // 不合法,第一个字符是数字
goto 语句的主要用途#
- % 与
if语句一起构成循环结构 - % 从循环体内跳转到循环体外(不推荐,破坏结构化程序设计原则)
// 用 goto 语句实现 1 到 100 的加法
int i = 1, sum = 0;
loop:
if(i <= 100) {
sum = sum + i;
i++;
goto loop;
}
printf("1+2+...+100的和值为%d\n", sum); // 5050
goto 语句注意事项#
- !
goto语句不能跨函数使用 - ! 多数情况下可以用其他循环语句代替
goto,应用场合较少
void func1() {
lbl1:
int k = 1;
goto lbl1; // 合法,同一个函数内
// goto lbl2; // 不合法!不能跨函数跳转
}
void func2() {
lbl2:
int a = 1;
}
5.1.3 while 语句#
[!tip] while 语句
- @
while语句: 当型循环结构,先判断后执行- 一般形式:
while(表达式) 要执行的语句;- ! 最大特点: 先判断表达式的值,为真才执行循环体,为假则一次都不执行
// 用 while 语句实现 1 到 100 的加法
int i = 1, sum = 0;
while(i <= 100) {
sum = sum + i;
i++;
}
printf("1+2+...+100的和值为%d\n", sum); // 5050
while 语句要点#
- ! 多条语句必须用
{}括起来,否则while只执行到第一个分号 - ! 循环体中应该有使循环趋向于结束的语句(如
i++) - ! 如果没有使循环结束的语句,会导致死循环(程序卡死)
5.1.4 do...while 语句#
[!tip] do…while 语句
- @
do...while语句: 直到型循环结构,先执行后判断- 一般形式:
do 要执行的语句 while(表达式);- ! 最大特点: 至少执行一次循环体,然后再判断表达式
// 用 do...while 语句实现 1 到 100 的加法
int i = 1, sum = 0;
do {
sum = sum + i;
i++;
} while(i <= 100);
printf("1+2+...+100的和值为%d\n", sum); // 5050
while 与 do...while 的区别#
- ! 当表达式第一次判断为真时,两种循环结果相同
- ! 当表达式第一次判断为假时,
while循环体一次不执行,do...while至少执行一次
// while: i=20, 条件不满足,循环体一次不执行
int sum = 0, i = 20;
while(i <= 10) {
sum = sum + i;
i++;
}
printf("sum=%d\n", sum); // sum=0
// do...while: i=20, 条件不满足,但循环体执行了一次
int sum = 0, i = 20;
do {
sum = sum + i;
i++;
} while(i <= 10);
printf("sum=%d\n", sum); // sum=20
- ! 实际应用中
while使用更多,do...while使用较少
5.2 for 语句精解#
- @ for循环图
- ![[白板/P10 for循环.canvas|P10 for循环]]
5.2.1 for 语句的一般形式#
[!tip] for 语句
- @
for语句: 非常灵活的循环语句,可处理确定和不确定循环次数的情况- 一般形式:
for(表达式1; 表达式2; 表达式3) 内嵌的语句;- 最常用形式:
for(循环变量赋初值; 循环变量结束条件; 循环变量增加值) 内嵌的语句;
for 语句执行步骤#
- 1 求解表达式1的值(只执行一次)
- 2 求解表达式2的值
- 3 若表达式2为真(非0),执行内嵌语句,同时求解表达式3,反复循环步骤2
- 4 若表达式2为假(0),循环结束
// 用 for 语句实现 1 到 100 的加法
int i, sum = 0;
for(i = 1; i <= 100; i++) {
sum = sum + i;
}
printf("sum=%d\n", sum); // sum=5050
5.2.2 for 语句的主要说明#
省略表达式1#
- ! 表达式1可以省略,但分号不能省略
- ! 应在
for语句之前给循环变量赋初值
int i, sum = 0;
i = 1; // 给循环变量赋初值
for(; i <= 100; i++) {
sum = sum + i;
}
省略表达式2#
- ! 省略表达式2则不判断循环结束条件,循环无终止进行
- ! 必须用
break语句终止循环
int i, sum = 0;
for(i = 1; ; i++) {
sum = sum + i;
if(i >= 100)
break; // 退出 for 循环
}
省略表达式3#
- ! 省略表达式3则必须保证循环能正常结束
int i, sum;
for(sum = 0, i = 1; i <= 100;) { // 逗号表达式作为表达式1
sum = sum + i;
i++; // 放在循环体内保证循环结束
}
省略表达式1和表达式3#
int i, sum;
sum = 0;
i = 1;
for(; i <= 100;) {
sum = sum + i;
i++;
}
三个表达式都省略#
- !
for(;;)等价于while(1),导致无终止循环 - ! 必须在内嵌语句中用
break跳出
int i, sum;
sum = 0;
i = 1;
for(;;) {
sum = sum + i;
if(i >= 100)
break;
i++;
}
表达式1可以与循环变量无关#
int i, sum;
i = 1;
for(sum = 0; i <= 100; i++) { // 表达式1设置sum初值
sum = sum + i;
}
表达式1和表达式3可以是逗号表达式#
int i, j = 10000, sum;
for(sum = 0, i = 1; i <= 100; i++, j--) { // "sum=0,i=1"作为表达式1
sum = sum + i;
}
printf("sum=%d\n", sum); // sum=5050
printf("j=%d\n", j); // j=9900
表达式2的值只要非0就执行循环体#
int i, sum;
sum = 0;
for(i = 0; 8888; i++) { // 8888非0,永远为真
sum = sum + i;
if(i >= 100)
break;
}
- ! 建议中规中矩使用
for语句,最传统的写法:
int i;
for(i = 0; i <= 100; i++) {
// 一系列要执行的语句
}
5.3 循环的嵌套, 比较与 break 语句, continue 语句#
- @ 循环嵌套与控制图
- ![[白板/P11 循环嵌套与控制.canvas|P11 循环嵌套与控制]]
5.3.1 循环的嵌套#
- @ 循环嵌套: 一个循环体内又包含另外一个完整的循环结构
- ! 最常用的是
for语句内部嵌套for语句
// 九九乘法表
int i, j, k;
int icount = 0;
for(i = 1; i <= 9; i++) {
for(j = 1; j <= i; j++) {
k = i * j;
printf("%d*%d=%d ", i, j, k);
icount++;
}
printf("\n");
}
printf("内循环的循环次数为%d次\n", icount); // 45次
// 内循环次数: 1+2+3+4+5+6+7+8+9 = 45
5.3.2 几种循环语句的比较#
| 比较项 | while | do...while | for |
|---|---|---|---|
| 判断时机 | 先判断后执行 | 先执行后判断 | 先判断后执行 |
| 循环体最少执行次数 | 0次 | 1次 | 0次 |
| 可否相互替代 | 可以 | 可以 | 可以 |
| 适用场景 | 不确定循环次数 | 至少执行一次 | 确定循环次数 |
- ! 不提倡使用
goto循环,它破坏结构化程序设计 - ! 对
while、do...while、for可以用break跳出循环,用continue结束本次循环 - ! 对
goto和if构成的循环,不能用break和continue
5.3.3 break 语句和 continue 语句#
break 语句#
[!tip] break 语句
- @
break语句: 跳出循环体或switch语句,提前结束循环- !
break只能用于循环语句和switch语句中,不能用于其他语句- !
break只能跳出它所在的那层循环
// 从1加到100,和值达到4000时退出循环
int i, sum = 0;
for(i = 1; i <= 100; i++) {
sum = sum + i;
if(sum >= 4000)
break; // 跳出整个 for 循环
}
printf("sum=%d\n", sum); // sum=4005
printf("i=%d\n", i); // i=89
break 在嵌套循环中的行为#
- !
break只跳出它所在的那一层循环,不会跳出外层循环
int i, j, k;
for(i = 1; i <= 9; i++) {
for(j = 1; j <= i; j++) {
k = i * j;
printf("%d*%d=%d ", i, j, k);
break; // 只跳出内部 for(j) 循环
}
printf("\n");
break; // 跳出外部 for(i) 循环
}
printf("流程走出来了!\n");
continue 语句#
[!tip] continue 语句
- @
continue语句: 结束本次循环,跳过循环体中余下未执行的语句,继续下一次循环判断- !
continue只能用于三种循环语句(while、do...while、for),不能用于switch
break 与 continue 的区别#
| 语句 | 作用 | 范围 |
|---|---|---|
break | 结束整个循环,跳到循环后面的语句 | 循环语句 + switch |
continue | 只结束本次循环,继续下一次循环判断 | 仅循环语句 |
// 输出1到100之间不能被3整除的数
int i;
for(i = 1; i <= 100; i++) {
if(i % 3 == 0)
continue; // 跳过本次循环,不执行下面的 printf
printf("%d ", i);
}

