循环结构的特点:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。
C语言中提供while语句、do-while语句和for语句来实现循环结构。
一、while语句
while语句是当型循环控制语句,一般形式为:
while(表达式) “表达式”为循环条件
语句; 循环体
要求:
(1)while后面的括号()不能省。
(2)while后面的表达式可以是任意类型的表达式,但一般是条件表达式或逻辑表达式。表达式的值是循环的控制条件。
(3)语句部分称为循环体,当需要执行多条语句时应使用复合语句。
例题:用while语句求1~100的累计和。
#include<stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
printf("sum=%d\n");
return 0;
}
运行结果:
sum=5050
注意:
(1)如果while后面的表达式的值一开始就为假,循环体将一次也不执行。
int a=0,b=0;
while(a>0) //a>0为假,b++不执行
b++
(2) 循环体中的语句可以为任意类型的C语句。
(3)退出while循环的情况:
while后面的表达式为假(为0);
循环体内遇到break、return或goto语句。
下面的程序是统计用户输入的字符个数,遇到回车符结束。
int num=0; //字符计数
while(1)
{
if(getche()=='\n') //如果输入的字符是回车符,则返回
return 0;
num++;
}
当执行循环体内的语句return时,它不仅要退出循环,而且要终止return后面的语句的运行,将该循环所在的函数返回。所以,一般情况下,return语句主要用于函数返回。
(4)通常情况下,程序中会利用一个变量来控制while语句的表达式的值,这个变量被称为循环控制变量。例:
#include<stdio.h>
int main()
{
int i; //i未初始化,i应赋值初始值10
/*i时循环控制变量,必须初始化,否则结果不可预知*/
long s=1;
while(i>=1)
s*=i--;
printf("10!=%ld\n",s);
return 0;
}
(5)要在while语句的某处(表达式或循环体内)改变循环控制变量的值,否则极易构成死循环。
i=1;
while(i<100) //死循环,因为i的值没变化,永远小于100
sum+=i;
printf("sum=%d\n",sum);
(6)允许while语句的循环体又是while语句,从而形成双重循环。例如下面一个二重循环:
i=1;
while(i<=9)
{
j=1;
while(i<=9)
{
printf("%d*%d=%d\n",i,j,i*j);
j++;
}
i++;
}
用while语句求1~100累计和
#include<stdio.h>
int main()
{
int i=1,sum=0;
while(i<=100)
{
sum+=i;
i++;
}
printf("sum=%d\n");
return 0;
)
二、do-while语句
直到型循环语句do-while,一般格式为:
do
语句; 循环体
while(表达式); “表达式”为循环条件
要求:
(1)while后面的括号()不能省略。
(2)while最后面的分号;不能省略。
(3)while后面的表达式可以任意类型的表达式,但一般是条件表达式或逻辑表达式。表达式的值是循环的控制条件。
(4)语句部分称为循环体,当需要执行多条语句时,应使用复合语句。
注意事项:
(1)如果do-while后的表达式的值一开始就为假,循环体还是要执行一次。例如:
int a=0,b=0;
do
b++;
while(a>0);
尽管一开始a>0为假,但b++还是要执行一次,所以最后b的值为1。
(2)在if语句、while语句中,表达式后面都不能加分号,而在do-while语句的表达式后则必须有分号,否则将产生语法错误。
(3)循环体中的语句可以为任意类型的C语句。
(4)使用do-while语句时,也需要初始化循环控制变量,否则结果不可预知。
(5)要在do-while语句某处(表达式循环体内)改变循环控制变量的值,否则极易构成死循环。
(6)do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。
用while语句求1~100累计和
#include<stdio.h>
int main()
{
int i=1,sum=0;
do
{
sum+=i;
i++;
} while(i<=100);
printf("sum=%d\n");
return 0;
}
三、for语句
一般格式:
for(表达式1;表达式2;表达式3) “表达式” 为循环条件
语句; 循环体
要求:
(1)for后面的括号不可缺失或省略。
(2)表达式1:一般为赋值表达式,给循环控制变量赋初值;
表达式2:一般为关系表达式或逻辑表达式,作为循环控制条件。
表达式3:一般为赋值表达式,给循环控制变量增量或减量。
(3)表达式之间用分号分隔。
(4)语句都称为循环体,当需要执行多条语句时,应使用复合语句。
注意事项:
(1)表达式1、表达式2、表达式3可以是任何类型的表达式。每个表达式都可由多个表达式组成。
(2)表达式1、表达式2、表达式3都是任选项,可以省略其中一个、两个或全部,但用于间隔的分号不可省略。
求1~100累计和 用下面三种情况进行对比:
情况一:省略其中一个
#include<stdio.h>
int main()
{
int i,sum=0;
i=1;
for( ; i<=100; i++)
sum+=i;
printf("sum=%d\n",sum);
return 0;
}
情况二:省略其中两个
#include<stdio.h>
int main()
{
int i,sum=0;
i=1;
for( ; i<=100; )
sum+=i++;
printf("sum=%d\n",sum);
return 0;
}
情况三: 省略全部
#include<stdio.h>
int main()
{
int i,sum=0;
i=1;
for(; ;)
{
if(i>100) break;
sum+=i++;
}
printf("sum=%d\n",sum);
return 0;
}
(3)如果表达式2为空,则相当于表达式2的值为真。因此下面的程序是死循环。
for(a=1; ;a++)
printf("%d\n",a);
(4) 在for语句前可以单独初始化循环控制变量,也可以利用for语句中的表达式1初始化循环控制变量(见情况一)。
(5) 可以在循环体内干煸循环控制变量的值,也可以利用for语句中的表达式3改变循环控制变量的值(见情况二三)。
(6) 循环体中的语句可以是任意类型的C语句。
(7) for语句可以组成多重循环,也可以与while语句以及do-while语句相互嵌套。
(8) 循环体可以是空语句。如下是计算用户输入的字符数(当输入是回车符时统计结束)。
#include<stdio.h>
int main()
{
int n=0;
printf("input a string:\n");
for(; getchar()!='\n';n++); //后面的分号表示循环体为空语句,不是for语句的结束
printf("%d",n);
return 0;
}
四、循环嵌套
一个循环的循环体中有另一个循环称为循环嵌套。一个 循环外面仅包围一层循环称为二重循环;一个循环外面包围两层称为三重循环;一个循环外面包围许多层循环称为多重循环。
while语句、do-while语句与for语句可以相互嵌套,但应注意一下:
(1)嵌套的各层循环中要用复合语句(用花括号将循环体语句括起来)。
(2)内层和外层的循环控制变量不可以同名,防止造成混乱。
(3)嵌套循环最好采用右缩进格式来书写,保证层次的清晰性。
(4)循环嵌套不可交叉,即一个循环体内必须完整的包含另一个循环 。
执行过程:嵌套循环执行时,先由外层循环进入内层循环,并在内层循环终止后接着执行外层循环,再由外层循环进入内层循环中,当外层循环全部终止时,程序结束。
例如:
#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<=3;i++)
{
printf("i=%d:",i);
for(j=1;j<=3;j++)
printf("j=%-4",j);
printf("\n"); //控制换行
}
return 0;
}