有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句限制性,接着是第二个语句,依次类推。
编程语言提供了更为复杂执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:
C语言提供了一下几种循环类型。
循环类型 | 描述 |
---|---|
while循环 | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 |
for循环 | 多次执行一个语句序列,简化管理循环变量的代码。 |
do…while循环 | 除了它是在循环主体结尾测试条件外,其他均与while语句类似 |
嵌套循环 | 可以再while、for或do…while循环内使用一个或多个循环。 |
只要给定的条件为真,C语言中的while循环语句会重复执行一个目标语句。
C语言中while循环的语法:
while(condition)
{
statement(s);
}
在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。
condition可以是任意的表达式,当为任意非零值时都为true。当条件为true是执行循环。当条件为false时,退出循环,程序流将继续执行紧接着循环的下一条语句。
在这里,while循环的关键点是循环可能一次都不会执行。当条件为false时,会跳过循环主体,直接执行紧接着while循环的下一条语句。
实例
#include
int main()
{
//局部变量定义
int a=10;
//while循环执行
while(a<20)
{
printf("a的值:%d\n",a);
a++;
}
return 0;
}
当上面代码被编译和执行时,会产生下列结果:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
for循环允许编写一个执行指定次数的循环控制结构。
C语言中for循环的语法:
for(init;condition;increment)
{
statement(s);
}
下面是for循环的控制流:
#include
int main ()
{
/* for 循环执行 */
for( int a = 10; a < 20; a = a + 1 )
{
printf("a 的值: %d\n", a);
}
return 0;
}
当上面的代码被编译和执行时,会产生下列结果:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
不想for和while循环,它们是在循环头部测试循环条件。在C语言中,do…while循环是在循环的尾部检查它的条件。
do…while循环与while循环类似,但是do…while循环会确保至少执行一次循环。
C语言do…while循环的语法:
do
{
statement(s);
}while(condition);
注意,条件表达式出现在循环的尾部,所以循环中的statement(s)会在条件被测试之前至少执行一次。
如果条件为真,控制流会跳转回上面的do,然后重新执行循环中的statement(s)。这个过程会不断重复,知道给定条件变为假为止。
实例:
#include
int main()
{
//局部变量定义
int a=10;
//do循环执行
do
{
printf("a的值:%d\n",a);
a=a+1;
}while(a<20);
return 0;
}
当上面的代码被编译和执行时,会产生下列结果:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
C语言允许在一个循环内使用另一个循环。
C语言中嵌套for循环语句的语法:
for (initialization; condition; increment/decrement)
{
statement(s);
for (initialization; condition; increment/decrement)
{
statement(s);
... ... ...
}
... ... ...
}
while (condition1)
{
statement(s);
while (condition2)
{
statement(s);
... ... ...
}
... ... ...
}
do
{
statement(s);
do
{
statement(s);
... ... ...
}while (condition2);
... ... ...
}while (condition1);
关于嵌套循环有一点值得注意,可以再任何类型的循环内嵌套其他任何类型的循环。比如,一个for循环可以嵌套在一个while循环内,反之亦然。
实例:
下面程序使用了一个嵌套的for循环来查找2到100中的质数:
for循环实例:
#include
int main()
{
//局部变量定义
int i,j;
for(i=2;i<100;i++)
{
for(j=2;j<=(i/j);j++)
if(!(i%j)) break;//如果找到就不是质数
if(j>(i/j))
printf("%d是质数\n",i);
}
return 0;
}
当上面代码被编译和执行时,会产生下列结果:
2 是质数
3 是质数
5 是质数
7 是质数
11 是质数
13 是质数
17 是质数
19 是质数
23 是质数
29 是质数
31 是质数
37 是质数
41 是质数
43 是质数
47 是质数
53 是质数
59 是质数
61 是质数
67 是质数
71 是质数
73 是质数
79 是质数
83 是质数
89 是质数
97 是质数
while 嵌套实例
#include
int main()
{
int i=1,j;
while (i <= 5)
{
j=1;
while (j <= i )
{
printf("%d ",j);
j++;
}
printf("\n");
i++;
}
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
do-while 嵌套实例
#include
int main()
{
int i=1,j;
do
{
j=1;
do
{
printf("*");
j++;
}while(j <= i);
i++;
printf("\n");
}while(i <= 5);
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
*
**
***
****
*****
循环控制语句改变代码的执行顺序。通过它可以实现代码的跳转。
C语言提供了下列的循环控制语句。
控制语句 | 描述 |
---|---|
break语句 | 终止循环或switch语句,程序流将继续执行紧接着循环或switch的下一条语句。 |
continue语句 | 告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。 |
goto语句 | 将控制转移到被标记的语句。但是不建议在程序中使用goto语句 |
如果条件永远不为假,则循环将变成无线循环。for循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,可以将某些条件表达式留空来构成一个无线循环。
实例:
#include
int main ()
{
for( ; ; )
{
printf("该循环会永远执行下去!\n");
}
return 0;
}
当条件表达式不存在时,它被假设为真。也可以设置一个初始值和增量表达式,但是一般情况下,C程序员偏向于使用for( ; ; )结构来表示一个无限循环。
注意: 可以按Ctrl+C键终止一个无限循环。
举例:
使用while,for分别输出1–100以内的所有的奇数和偶数的和:
使用while
#include
int main(){
int sum=0;
int num=1;
int sum2=0;
int num2=2;
while(num<100){
sum=sum+num;
num=num+2;
}
printf("奇数和为:%d\n",sum);
while(num2<=100){
sum2=sum2+num2;
num2=num2+2;
}
printf("偶数和为:%d\n",sum2);
}
使用for:
#include
int main(){
int sum=0;
int sum2=0;
int num,num2;
for(num=1;num<100;num=num+2){
sum=sum+num;
}
printf("奇数和%d\n",sum);
for(num2=2;num2<=100;num2=num2+2){
sum2=sum2+num2;
}
printf("偶数和%d\n",sum2);
}
用do…while求算术平方根:
#include
double DoSqrt(double z){
double a=1;
double b=0;
double c=0;
do{
if(b*b0.000001);
return (b+c)/2;
}
int main(){
double x, y;
printf("请输入一个数字:");
scanf("%lf", &x);
if(x<0){
printf("输入错误。");
} else {
y=DoSqrt(x);
printf("%g 的平方根为: %g.\n", x, y);
}
int z=1;
do{
main();
z++;
}while(z>10);
return 0;
}
注意: 一定要注意 break 语句与 continue 语句的区别,前者是结束整个循环过程,后者这是结束本次循环。