6.1 概述
循环结构的特点是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。如打印10万次"hello world"。其中给定的条件称为循环条件;反复执行的程序段称为循环体。
C语言提供了多种循环语句,可以构成不同形式的循环结构:
- 用goto语句和if语句构成循环
- 用while语句
- 用do-while语句
- 用for语句
6.2 goto语句以及用goto语句构成循环
goto语句的基本语法格式如下:
goto 语句标号;
语法说明:
- 语句标号是一个有效的标识符,这个标识符加上一个
:一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。 - 语句标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。
- 通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。
- goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。
示例:
#include <stdio.h>
int main() {
// 用goto语句和if语句构成循环,来计算1到100所有数的和
int i = 1, sum = 0;
loop:// 语句标号名自定义即可
if (i <= 100) {
sum += i;
i++;
goto loop;// 跳到语句标号处
}
printf("1+2+...+100=%d", sum);
}
6.3 while语句
while语句的语法如下:
while(表达式){
循环体
}
语义:计算表达式的值,当值为真(非0)时, 执行循环体语句。
示例:
#include <stdio.h>
int main() {
// 用while循环计算1到100所有数的总和
int i = 1, sum = 0;
while (i <= 100) {
sum += i;
i++;
}
printf("1+2+...+100=%d", sum);
}
注意事项:
- while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。如
while(n--)也是可以的。 - 循环体如包括有一个以上的语句,则必须用
{}括起来,组成复合语句。推荐即使只有一条语句也括起来。
6.4 do-while语句
do-while语句的基本语法如下:
do{
语句
}while(表达式);
示例:
#include <stdio.h>
int main() {
// 用do-while循环计算1到100所有数的总和
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i <= 100);
printf("1+2+...+100=%d", sum);
}
注意事项:
- 这个循环与while循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。
- do-while循环至少要执行一次循环语句。
- 当有许多语句参加循环时, 要用"{“和”}"把它们括起来。
6.5 for语句
for语句很常用,它的语法如下:
for(表达式1; 表达式2; 表达式3){
语句
}
// 容易理解的形式
// 循环变量赋初值总是一个赋值语句, 它用来给循环控制变量赋初值
// 循环条件是一个关系表达式,它决定什么时候退出循环
// 循环变量增量,定义循环控制变量每循环一次后按什么方式变化
// 这三个部分之间用`;`分开
for(循环变量赋初值; 循环条件; 循环变量增量){
语句
}
它的执行过程如下:
- 先求解表达式1。
- 求解表达式2,若其值为真(非0),则执行for语句中指定的内嵌语句,则执行下面的第3步;若其值为假(0),则结束循环,转到第5步。
- 求解表达式3。
- 转回上面第2步继续执行。
- 循环结束,执行for语句下面的一个语句。
示例:
#include <stdio.h>
int main() {
// 用for循环计算1到100所有数的总和
int i, sum = 0;
// 先给i赋初值1,判断i是否小于等于100, 若是则执行语句,之后值增加1。再重新判断, 直到条件为假,即i>100时,结束循环。
for (i = 1; i <= 100; i++) {
sum += i;
}
printf("1+2+...+100=%d", sum);
}
注意事项:
- for循环中的“表达式1(循环变量赋初值)”、“表达式2(循环条件)”和“表达式3(循环变量增量)”都是选择项, 即可以缺省,但“;”不能缺省。如
for(;;)。 - 省略了“表达式1(循环变量赋初值)”, 表示不对循环控制变量赋初值。
- 省略了“表达式2(循环条件)”, 则不做其它处理时便成为死循环。如
for(i=1;;i++)便是死循环。 - 省略了“表达式3(循环变量增量)”, 则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。如
for(i=1; i<=100; ){sum+=i; i++;}。 - 省略了“表达式1(循环变量赋初值)”和“表达式3(循环变量增量)”。如
for(; i<=100; ){sum+=i; i++;}等价于while(i<=100){sum+=i; i++;}。 - 3个表达式都可以省略。如
for(;;)语句等价于while(1)语句。 - 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式。如
for(sum=0;i<=100;i++){sum+=i;}。 - 表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。如
for(sum=0,i=1;i<=100;i++){sum+=i;};如for(i=0,j=100; i<=100; i++,j--){k=i+j;}。 - 表达式2一般是关系表达式或逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。如
for(;(c=getchar())!='\n';){printf("%c",c);}。
6.6 循环的嵌套
循环语句中还可以有循环,while、do-while、for循环都可以相互嵌套。示例如下:
#include <stdio.h>
int main() {
int i, j, k;
printf("i j k\n");
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
for (k = 0; k < 2; k++) {
printf("%d %d %d\n", i, j, k);
}
}
}
}
例如,使用双层循环来打印一个九九乘法表:
#include <stdio.h>
int main() {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%d\t", i, j, (i * j));
}
printf("\n");
}
}
打印结果如下:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
6.7 几种循环的比较
- 四种循环都可以用来处理同一个问题,一般可以互相代替。但一般不提倡用goto型循环。
- while和do-while循环,循环体中应包括使循环趋于结束的语句。for语句功能最强。
- 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成,而for语句可以在表达式1中实现循环变量的初始化。
6.8 break和continue语句
6.8.1 break语句
break语句通常用于循环语句和switch语句中:
- 当break用于switch语句中时,可以使程序跳出switch而执行switch以后的语句。
- 当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。即满足条件时便跳出循环。
示例:
int main() {
while (1) {
char c = getchar();
// 当输入大写字母'Q'后退出循环
if (c == 'Q') {
break;
}
printf("%c", c);
}
}
注意事项:
- break语句对if-else的条件语句不起作用。
- 在多层循环中, 一个break语句只向外跳一层。
6.8.2 continue语句
continue语句的作用是跳过本次循环而强制执行下一次循环。continue语句只用在for、while、do-while等循环体中,常与if条件语句一起使用,用来加速循环。
int main() {
// 打印0到100之间的所有偶数
for (int i = 0; i <= 100; i++) {
if (i % 2 == 0) {
printf("%d\t", i);
}
}
}
本文详细介绍了C语言中的循环结构,包括while、do-while、for循环,并通过实例展示了它们的用法。此外,还提到了循环的嵌套和使用break、continue语句控制循环流程的方法。强调了在适当情况下避免使用goto语句,以及各种循环语句在解决问题时的适用性和优缺点。
493

被折叠的 条评论
为什么被折叠?



