4.1.4 循环语句

循环语句用于需要进行反复多次执行若干语句的操作。C51语言中包括3种循环语句:while语句、do-while语句和for语句。虽然这3种语句都是进行循环操作,但在程序中的作用和用法却不相同。在程序中使用循环语句时,要注意恰当地选择合适的循环语句。下面分别介绍这3种循环语句的具体用法。

1.while语句

while循环语句的一般形式如下。


while(表达式)

{

语句;

}


while语句在执行时首先判断表达式值是否为真,如果为真,便执行一次语句,然后再次判断表达式的值,直到表达式的值被判定为假时,才结束循环。while语句结束后,程序便可以接着执行循环体外的后续语句。

技巧while语句根据后面的表达式的值来决定是否执行循环体,当表达式的值为0时,表示为假,当表达式的值为非0时,表示为真。在单片机的程序中,经常可看到使用while(1)这种形式,这时,由于表达式为一个常量,且不为0,则该循环语句将始终循环执行。这种语句称为死循环。

while循环语句的示例程序如下。


include<stdio.h>//头文件

void main()//主函数

{

int i,s;//声明变量

i=100;s=0;//初始化

while(i>0)//while循环,求和

{

s=s+i;//s累加

i=i-1;//循环次数减1

}

printf(“1+2+……+100=%d\n”,s);//输出求和结果

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


1+2+……+100=5050


本例中首先定义并初始化变量i为循环次数,s为累加和。程序中采用了while循环语句,求1加到100的总和。当i小于或等于0时,表达式为假,while循环结束,然后输出求和结果。

使用while循环语句时,要注意以下几点。

❑while语句的特点是先判断表达式即条件,后执行语句。这样可能不执行任何语句就退出。

❑如果循环体内的语句只有一个,则可以省略“{}”。如果循环体内的语句由多行构成,即语句是语句体时,必须用括起来,表示成复合语句的形式。

❑while语句“{}”后面无分号。

❑while语句循环体内允许空语句,此时while语句结尾需要添加分号。示例如下。


while((ch=getchar())!=‘\X0D’);


本例中等待键盘输入字符,直到键入回车时,循环才结束。循环语句只有表达式,作为判定条件,而没有执行语句。

❑while语句循环允许多层循环嵌套使用。

❑在使用while循环语句时,要将表达式或执行语句进行适当的修改,使其可以跳出循环,而不至于造成死循环。

2.do-while语句

do-while语句的一般形式如下。


do

{

语句;

}

while(表达式);


do-while语句在执行时,首先执行一次do后面的语句,然后再判断while后的表达式值是否为真,如果表达式值为真,返回再次执行do后面的语句,直到表达式值为假时,才结束循环。do-while循环语句结束后,程序才可以继续执行循环体外的后续语句。do-while语句的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

int i,s;//声明变量

i=100;s=0;//初始化

do//do-while循环,求和

{

s=s+i;//s累加

i=i-1;//循环次数减1

}

while(i>0);//表达式

printf(“1+2+……+100=%d\n”,s);//输出求和结果

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


1+2+……+100=5050


本例中首先定义并初始化变量i为循环次数,s为累加和。程序中采用了do-while循环语句,求1加到100的总和。当i小于或等于0时,表达式为假,do-while循环结束,然后输出求和结果。

使用do-while循环语句时,要注意以下几点。

❑do-while语句的特点是先执行一次语句,然后再判断条件。因此,do-while语句至少执行一次do后面的语句。

❑如果do-while循环体内的语句只有一条,可以省略“{}”。如果do-while循环体内由多个语句构成语句体时,必须用“{}”括起来,表示成复合语句的形式。

❑do-while语句中的“{}”后面无分号。

❑使用do-while语句循环时,while(表达式)后的“;”不能遗漏。

❑使用do-while语句循环时,需要注意避免构成死循环。

3.for语句

for语句的一般形式如下。


for(表达式1;表达式2;表达式3)

{

语句;

}


其中,表达式1一般为赋值语句,给循环变量进行初始化赋值;表达式2是一个关系逻辑表达式,作为判断循环条件的真假;表达式3定义循环变量的变化方式。当由表达式1初始化循环变量后,由表达式2和表达式3确定循环次数。

for语句在执行时,首先执行表达式1,然后判断表达式2是否为真,如果为真,则执行一次循环体内部的语句和表达式3,否则将结束循环。for循环语句结束后,程序才可以继续执行循环体外的后续语句。for循环语句的程序示例如下。


include<stdio.h>//头文件

void main()//主函数

{

int i,s;//声明变量

i=100;s=0;//初始化

for(i=0;i<=100;i++)//for循环

{

s=s+i;//表达式语句

}

printf(“1+2+……+100=%d\n”,s);//输出求和结果

}


该程序可以在KeilµVision3编译环境中执行,其运行的结果如下所示。


1+2+……+100=5050


本例中首先定义并初始化变量i为循环次数,s为累加和。程序中采用了for循环语句,求从1加到100的总和。当i大于100时,表达式“i<=100”为假,for循环结束,然后输出求和结果。

使用for循环语句时,需要注意以下几点。

❑for语句中的3个表达式都是可选择项,可以任意缺省,但“;”不能省。例如for(;),表示一个无限循环。省略表达式1,即不对循环控制变量进行初始化赋值。省略表达式2,即不判断循环条件的真假。省略表达式3,即不对循环控制变量进行操作。

❑如果for语句中省略表达式3,则可以在循环语句体内加入控制循环变量的语句,从而避免构成一个死循环。

❑for循环语句循环允许多层循环嵌套。

❑for语句循环体中如果只有一条语句,则可以省略“{}”。如果循环体内的语句是多个语句构成的语句体,则必须用“{}”括起来。

❑for语句“{}”后面无分号。

❑for语句循环体内允许空语句,此时for语句结尾需要添加分号。示例如下。


for(i=0;i<100;i++);


本例中for语句没有循环体,只进行空循环,没有任何的操作意义,常用于延时。