1、循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C 语言提供了多种循环语句,可以组成各种不同形式的循环结构。 while 语句 while 语句的一般形式为: while(表达式) 语句; 其中表达式是循环条件,语句为循环体。 while 语句的语义是:计算表达式的值,当值为真( 非 0)时, 执行循环体语句。其执行过程可用图 34 表示。 统计从键盘输入一行字符的个数。 #include void main() int n=0; printf(input a string:n); w
2、hile(getchar()!=n) n ; printf(d,n); int n=0; printf(input a string:n); while(getchar()!=n) n ; printf(d,n); 本例程序中的循环条件为 getchar()!=n,其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体 n 完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。 使用 while 语句应注意以下几点: 1.while 语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非 0)即可继续循环。 void main() int a=0,n; printf
3、(n input n: ); scanf(d, while (n-) printf(d ,a *2); int a=0,n; printf(n input n: ); scanf(d, while (n-) printf(d ,a *2); 本例程序将执行 n 次循环,每执行一次,n 值减 1。循环体输出表达式 a *2 的值。该表达式等效于(a*2;a ) 2.循环体如包括有一个以上的语句,则必须用 括起来, 组成复合语句。 3.应注意循环条件的选择以避免死循环。 void main() int a,n=0; while(a=5) printf(d ,n ); int a,n=0; whil
4、e(a=5) printf(d ,n ); 本例中 while 语句的循环条件为赋值表达式 a=5, 因此该表达式的值永远为真,而循环体中又没有其它中止循环的手段, 因此该循环将无休止地进行下去,形成死循环。4.允许 while 语句的循环体又是 while 语句,从而形成双重循环。 do-while 语句 do-while 语句的一般形式为: do 语句; while(表达式); 其中语句是循环体,表达式是循环条件。 do-while 语句的语义是: 先执行循环体语句一次, 再判别表达式的值,若为真(非 0)则继续循环,否则终止循环。 do-while 语句和 while 语句的区别在于 d
5、o-while 是先执行后判断,因此 do-while 至少要执行一次循环体。而 while 是先判断后执行,如果条件不满足,则一次循环体语句也不执行。 while 语句和 do-while 语句一般都可以相互改写。 void main() int a=0,n; printf(n input n: ); scanf(d, do printf(d ,a *2); while (-n); int a=0,n; printf(n input n: ); scanf(d, do printf(d ,a *2); while (-n); 在本例中,循环条件改为-n,否则将多执行一次循环。这是由于先执行后
6、判断而造成的。 对于 do-while 语句还应注意以下几点: 1.在 if 语句,while 语句中, 表达式后面都不能加分号, 而在 do-while 语句的表达式后面则必须加分号。 2.do-while 语句也可以组成多重循环,而且也可以和 while 语句相互嵌套。 3.在 do 和 while 之间的循环体由多个语句组成时,也必须用括起来组成一个复合语句。 4.do-while 和 while 语句相互替换时,要注意修改循环控制条件。 for 语句 for 语句是 C 语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为: for(表达式 1;表达式 2;表达 3) 语句:
7、表达式 1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在 for 语句外给循环变量赋初值,此时可以省略该表达式。 表达式 2 通常是循环条件,一般为关系表达式或逻辑表达式。 表达式 3 通常可用来修改循环变量的值,一般是赋值语句。 这三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。 一般形式中的“语句”即为循环体语句。for 语句的语义是: 1.首先计算表达式 1 的值。 2.再计算表达式 2 的值,若值为真(非 0)则执行循环体一次, 否则跳出循环。 3.然后再计算表达式 3 的值,转回第 2 步重复执行。在整个 for 循环过程中
8、,表达式 1 只计算一次,表达式 2 和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for 语句的执行过程如图所示。 void main() int n,s=0; for(n=1;n0;a ,n-) printf(d ,a*2); 用 for 语句修改例题。从 0 开始,输出 n 个连续的偶数。 int a=0,n; printf(n input n: ); scanf(d, for(;n0;a ,n-) printf(d ,a*2); 本例的 for 语句中,表达式 1 已省去,循环变量的初值在 for 语句之前由 scanf 语句取得,表达式 3 是一个逗号表达式,由
9、a , n- 两个表达式组成。每循环一次 a 自增 1,n 自减 1。a 的变化使输出的偶数递增,n 的变化控制循次数。 在使用 for 语句中要注意以下几点 1.for 语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式) 省去了表达式 1。for(表达式;表达式)省去了表达式 2。 for(表达式;表达式;)省去了表达式 3。for(;) 省去了全部表达式。 2.在循环变量已赋初值时,可省去表达式 1,如例 3.27 即属于这种情形。如省去表达式 2 或表达式 3 则将造成无限循环, 这时应在循环体内设法结束循环。例题即属于此情况。 void main() int
10、a=0,n; printf(n input n: ); scanf(d, for(;n0;) a ;n-; printf(d ,a*2); int a=0,n; printf(n input n: ); scanf(d, for(;n0;) a ;n-; printf(d ,a*2); 本例中省略了表达式 1 和表达式 3,由循环体内的 n-语句进行循环变量 n 的递减,以控制循环次数。 void main() int a=0,n; printf(n input n: ); scanf(d, for(;) a ;n-; printf(d ,a*2); if(n=0)break; int a=0
11、,n; printf(n input n: ); scanf(d, for(;) a ;n-; printf(d ,a*2); if(n=0)break; 本例中 for 语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当 n 值为 0 时,由 break 语句中止循环,转去执行 for 以后的程序。在此情况下, for 语句已等效于 while( 1)语句。如在循环体中没有相应的控制手段,则造成死循环。 3.循环体可以是空语句。 #includestdio.h void main() int n=0; printf(input a string:n); for(;g
12、etchar()!=n;n ); printf(d,n); 本例中,省去了 for 语句的表达式 1,表达式 3 也不是用来修改循环变量,而是用作输入字符的计数。这样, 就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的 printf 语句当成循环体来执行。反过来说,如循环体不为空语句时, 决不能在表达式的括号后加分号, 这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。 4.for 语句也可与 while,do-while 语句相互嵌套,构成多重循环。以下形成都合法的嵌套。 (1)for() while() (2)do for() while(); (3)while() for() (4)for() for() void main() int i,j,k; for(i=1;i=3;i ) for(j=1;j=3-i 5;j ) printf( ); for(k=1;k=2*i-1 5;k ) if(k=5) printf( ); else printf(*); printf(n);