循环结构是程序中一种很重要的结构。其特点是, 在给定条件成立时,反复执行某程序段,直到条件不成立为止。 给定的条件称为循环条件,反复执行的程序段称为循环体。 C语言提供了多种循环语句,可以组成各种不同形式的循环结构。
0 }) \# [0 O+ N' P( v2 ~ while语句
4 J6 B$ X+ c# w" K while语句的一般形式为: while语句; 其中表达式是循环条件,语句为循环体。" M# k. m& t& r4 b) D8 ]
while语句的语义是:计算表达式的值,当值为真时, 执行循环体语句。其执行过程可用图3—4表示。 统计从键盘输入一行字符的个数。
3 H6 f& M, D ^% A2 k Y #include stdio.h; h0 K4 X; Z: `" u7 h
void main int n=0;+ M$ Q7 i/ [+ k4 D
printf;
$ {$ s* L7 ]; l1 y' V! Z" E" V while!=‘“n‘)) ]9 H% K3 D2 P! k- {+ v5 [
n++;
# n% [( x8 h8 D) t' S printf;
, s' A0 r/ n4 I4 V. M4 ` 本例程序中的循环条件为getchar!=‘“n‘,其意义是, 只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。( d( \ n( E; E6 n0 I6 v) h' Z
使用while语句应注意以下几点:
, Q$ [1 i; a1 j- M5 U3 z6 U( a 1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真即可继续循环。
- k F6 ^9 d2 N# ~! h; J void main int a=0,n;
0 @' n6 A2 k* w$ M ]0 g8 F8 ? printf;
: |7 ?6 u3 u" v! A7 q! {/ u scanf;
7 N: ~1 Q& V7 z# G5 _, P while$ W: }2 {2 m: T, v3 r
printf;# X% J8 |! M6 Z) U7 x- X7 {8 f
本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于" ]8 ]- V' k) e7 f# o7 O) j5 o
2.循环体如包括有一个以上的语句,则必须用括起来, 组成复合语句。- D8 m5 } l' O8 L6 h3 b7 P2 B
3.应注意循环条件的选择以避免死循环。
8 V9 e" e( I$ }, d$ } void main int a,n=0;
( B3 x( W Q. {' v! u while) _5 C* _3 S2 X' v4 u
printf;
f0 a' n6 @7 S' W/ Q 本例中while语句的循环条件为赋值表达式a=5, 因此该表达式的值永远为真,而循环体中又没有其它中止循环的手段, 因此该循环将无休止地进行下去,形成死循环。4.允许while语句的循环体又是while语句,从而形成双重循环。: c4 w/ z: ~ u- n3 `/ k
do-while语句
8 F' w8 |/ h" a1 k) J7 W8 M3 q1 K do-while语句的一般形式为:
) @: ^' Z/ s6 t. L; W% u8 L, W do {5 T0 _; }- U& ^( Y" R5 t- ^
语句;
8 I0 r) v s. @9 S0 [) z while;% ~' E3 `/ x, \ W2 s. T
其中语句是循环体,表达式是循环条件。
4 B- D$ ], a. Z2 A6 I% d do-while语句的语义是:' Y9 i( C& J; P( S5 U
先执行循环体语句一次, 再判别表达式的值,若为真则继续循环,否则终止循环。
- J" n! u( ]- X3 }1 q do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
1 q0 S, ^3 t9 K" n- L" K% H2 L while语句和do-while语句一般都可以相互改写。6 O0 K$ S) c2 Y
void main: m0 K. W6 k; D( g+ @
int a=0,n;
' {6 M0 ]7 U4 |$ U, B+ z2 ` printf;/ \, o F8 S4 o
scanf;7 K p% p! R4 ^) Q: Q9 v
do printf;
5 }" U1 s/ P7 e; Q- o7 {0 ] while ;! R" Q% p8 z0 L! P0 S
在本例中,循环条件改为n,否则将多执行一次循环。这是由于先执行后判断而造成的。$ H6 Q/ d) c+ a% R5 R( N
对于do-while语句还应注意以下几点:/ w4 P) P. F( K4 c( k. H6 a W
1.在if语句,while语句中, 表达式后面都不能加分号, 而在 do-while语句的表达式后面则必须加分号。
% u: ?; [- _/ b! P; S 2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。
3 z" w; K* y+ S4 V 3.在do和while之间的循环体由多个语句组成时,也必须用括起来组成一个复合语句。
; S, U& U. I0 T. o k 4.do-while和while语句相互替换时,要注意修改循环控制条件。6 E1 w$ I, G' {3 x3 s- X* b
for语句' i1 [, V* i( U
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:4 G9 F9 P8 v6 r9 F0 S ^
for, G) a' ]/ |" G
语句:) y+ p1 e) i1 z% u; a$ D; C
表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。0 n. F2 b* ~8 M% F! b- J/ m q) A/ y
表达式2通常是循环条件,一般为关系表达式或逻辑表达式。: Y7 H. h+ `+ ^0 f3 {
表达式3通常可用来修改循环变量的值,一般是赋值语句。2 S; E; c# W) w* C+ O
这三个表达式都可以是逗号表达式, 即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。$ j- T- s' S) ]9 B/ N/ P
一般形式中的“语句”即为循环体语句。for语句的语义是:/ V1 `( X+ H: N; n8 t6 Z# C5 N1 g
1.首先计算表达式1的值。
6 B$ j5 C6 ^/ j: D 2.再计算表达式2的值,若值为真则执行循环体一次, 否则跳出循环。! t2 M I0 `9 D r/ {
3.然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for 语句的执行过程如图所示。
: B% j+ q5 g; p2 E2 n2 a& J void main, f# t1 j6 @+ }- D( n$ {5 l; `$ q
用for语句计算s=1+2+3+...+99+100& K3 Q4 E7 G. A1 K, _
int n,s=0;( |+ ~' f& l% I+ h
for
3 n- ^. A# Q" Q1 h" ` s=s+n;3 t6 a: A7 i1 Y" d; j% ~* o
printf;/ v- d' o* L! \+ m6 `
本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。
3 ~ z4 y* O! C: A% ~ void main a: A7 `1 C' C% e1 T( f; _
用for语句修改例题。从0开始,输出n个连续的偶数。; |( h% ]) ?' g5 f2 K
int a=0,n;
6 J8 @( Z; s! I! O printf;
# k3 ~, N! n( I' q% w scanf;
! J. G) g+ K \0 D for: P/ k1 |; `6 Z S
printf;* \4 m9 P, W& b* ^" X J/ ~
本例的for语句中,表达式1已省去,循环变量的初值在for语句之前由scanf语句取得,表达式3是一个逗号表达式,由a++,n 两个表达式组成。每循环一次a自增1,n自减1。a的变化使输出的偶数递增,n的变化控制循次数。4 @5 B0 ?& O3 c% ~
在使用for语句中要注意以下几点
/ u6 u5 c% _- U 1.for语句中的各表达式都可省略,但分号间隔符不能少。如:for省去了表达式1。for省去了表达式2。" ~ |" S( J: |* k
for省去了表达式3。for省去了全部表达式。
1 I% c, S) c/ @- |( L! B% ]2 U/ ~ 2.在循环变量已赋初值时,可省去表达式1,如例3.27即属于这种情形。如省去表达式2或表达式3则将造成无限循环, 这时应在循环体内设法结束循环。例题即属于此情况。2 D7 Q& K* r+ M. C! y6 \
void main
/ U8 F% E4 F7 |* X. S. u6 W } int a=0,n;
2 e6 h8 l9 R5 e/ A# |0 M) C printf;2 v$ \' t% K- H% u3 M4 R% A$ S
scanf;
6 Z& ?4 |' V) c$ ^ f6 |* M6 e$ F5 D1 F for
! C" @; `' u( R2 ?+ J0 d5 M" N 本例中省略了表达式1和表达式3,由循环体内的n语句进行循环变量n的递减,以控制循环次数。* k" g6 x \0 D' J
void main
. x4 k' S: P8 A$ u! `( E }
4 P* Q# C: R) r8 ^ int a=0,n;
m6 r; }7 V1 f. f* Z$ `2 k printf;6 C1 D$ v. i* K0 W
scanf;2 R1 h3 E& T0 O; I. u
for8 a+ I& V& u6 T$ r g7 v" A5 h; H
本例中for语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当n值为0时,由break语句中止循环,转去执行for以后的程序。在此情况下,for语句已等效于while语句。如在循环体中没有相应的控制手段,则造成死循环。 |