C语言提供 forwhiledo-while 三种循环语句来实现循环结构。

while 语句

先判断,当满足表达式时才执行。(当型循环)

有可能一次都不循环

1
2
3
4
while (循环控制表达式)
{
语句序列
}

do-while 语句

先执行,若满足表达式,再次执行,直到不满足条件为止。(直到型循环)

至少循环一次

1
2
3
4
5
do
{
语句序列

}while(循环控制表达式)

for 语句

属于当型循环

知道循环次数的情况下更适合使用该语句

1
2
3
4
for (初始化表达式;循环控制表达式;增值表达式)
{
语句序列
}
  • 初始化表达式:一个或多个(逗号分隔)赋值语句,它用来控制变量的初始值;
  • 循环控制表达式:它决定什么时候退出循环;
  • 增值表达式:定义控制循环变量每循环一次后按什么方式变化。

for语句可以用while语句来等价实现:

1
2
3
4
5
while (循环控制表达式)
{
语句序列
增值表达式;
}

嵌套循环

嵌套循环(多重循环)就是在循环结构的循环体中又出现循环结构。

while、do-while 和 for 这三种循环均可以相互嵌套。

计数控制的循环

循环次数事先已知的循环称为计数控制的循环。

习惯上,用 for 语句编写。

如累加求和、累乘求积问题。

条件控制的循环

循环次数事先未知的循环,通常由一个条件控制,称为条件控制的循环。

用 while 和 do-while 语句编程更方便。

流程的转移控制

goto 语句、break 语句、continue 语句和 return 语句是C语言中用于控制流程转移的跳转语句。

goto 语句

goto 语句为无条件转向语句,既可以向下转,也可以往回转。

1
2
3
        goto 语句标号;  //从这里跳转到最下面 ↓
......
语句标号:...... //跳转到这里 ← ←
1
2
3
语句标号:......         //跳转到这里 ←      ←
......
goto 语句标号; //从这里跳转到最上面 ↑

作用是不需要任何条件的情况下直接使程序跳转到语句标号所标识的语句去执行,良好的编程风格应该少用或慎用goto语句。

例题:读入5个正整数并且显示它们。当程序读入的数据为负数时,程序立即终止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
main()
{
int i,n;
for (i = 1; i <= 5; i++)
{
printf("Please enter n:");
scanf("%d",&n);
if (n < 0) goto END; //从这跳转 ↓
printf("n = %d\n",n);
}

END:printf("n = %d\n",n); //跳到这 ←

}

break 语句

break 语句除了用于退出switch结构外,还可以用于由 while、do-while 和 for 构成的循环语句的循环体中。当执行循环体遇到break语句时,循环将立即终止,跳出循环语句从之后的第一条语句开始执行。

1
2
3
4
5
6
7
8
while (表达式1)
{
...
if (表达式2) break; //从这里跳出循环到下面第一条语句 ↓
...
}

循环后的第一条语句 //跳转到这里 ← ←
1
2
3
4
5
6
7
8
9
do
{
...
if (表达式2) break; //从这里跳出循环到下面第一条语句 ↓
...

}while (表达式1);

循环后的第一条语句 //跳转到这里 ← ←
1
2
3
4
5
6
7
8
for (;表达式1;)
{
...
if (表达式2) break; //从这里跳出循环到下面第一条语句 ↓
...
}

循环后的第一条语句 //跳转到这里 ← ←

若希望跳转的位置是循环语句之后的语句,则可以用break语句代替goto语句。

例题:读入5个正整数并且显示它们。当程序读入的数据为负数时,程序立即终止。(上面用了goto语句,这里用break语句写一遍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
main()
{
int i,n;
for (i = 1; i <= 5; i++)
{
printf("Please enter n:");
scanf("%d",&n);
if (n < 0) break; //从这跳转 ↓
printf("n = %d\n",n);
}

printf("n = %d\n",n); //跳到这 ←

}

虽然break语句和goto语句都可以终止整个循环的执行,但二者的本质区别在于:

  • goto语句可以任意方向跳转,控制流程跳转到任意语句
  • break语句只能往后跳出,到循环语句之后的第一条语句

因为goto语句随意跳转可能导致程序流程混乱,break语句可以避免这种情况。

continue 语句

当在循环体中遇到continue语句时,程序将跳过continue语句后面的尚未执行的循环语句,重新开始下一次循环,即只结束本次循环的运行,并不终止整个循环的运行。

意思就是:不跳出这个循环,而是从continue这里回去,继续从头开始执行这个循环。

1
2
3
4
5
6
//某个循环结构
{
...
if (表达式) continue;
...
}

在嵌套循环的情况下,break语句和continue语句只对包含他们的最内层的循环语句起作用,不能用break语句跳出多重循环。跳出多重循环需要用break一层一层地跳出。显然,goto语句是跳出多重循环的一条捷径。