循环1C语言的重复语句用于设置循环。循环是重复执行其他语句的一种语句,循环中重复执行的语句就是循环体C语句中,每个循环都有一个控制表达式。每次执行循环体时都要对控制表达式进行计算。◦如果表达式为真,也就是不为零,那么继续执行循环。2C提供三种循环语句:◦while语句:用于判定控制表达式在循环体执行之前的循环。◦do语句:用于判定控制表达式在循环体执行之后的循环。◦for语句:对于自增或自减计数变量的循环十分方便。3使用while语句是最简单、最基本的设置循环方法。While语句格式如下:while(表达式)语句表达式即为控制表达式;语句则是循环体。4while语句示例:while(in)/*控制表达式*/i=i*2;/*循环体*/执行while语句时,首先计算控制表达式的值。如果值不为零(真),那么执行循环体,接着再次判定表达式。这个过程持续进行直到最终控制表达式的值变为零。5while语句示例:计算大于或等于数n的最小的2次幂:i=1;while(in)i=i*2;设n为10时,下面跟踪显示了while语句执行情况:i=1;i现在值为1.in成立吗?是,继续。i=i*2;i现在为2.in成立吗?是,继续。i=i*2;i现在为4。in成立吗?是,继续。i=i*2;i现在为8。in成立吗?是,继续。i=i*2;i现在为16。in成立吗?不成立,退出循环。6虽然循环体必须是单独的一条语句,但这只是个技术问题。如果需要多条语句,那么只要用一对大括号构造成单独一条复合语句就可以了:while(i0){printf(Tminus%dandcounting\n,i);i--;}即使没有严格要求的时候,一些程序员始终使用大括号括住循环体:while(in){i=i*2;}7下面的语句显示一串“倒数计数”信息:i=10;while(i0){printf(Tminus%dandcounting\n,i);i--;}整个过程持续到显示信息为“Tminus1andcounting”。8关于while语句的一些讨论:◦在while循环终止时,控制表达式的值为假。因此,当通过表达式i0控制循环终止时,i必须是小于或等于0的。◦可能根本不执行while循环体。因为控制表达式是在循环体执行之前进行判定。◦while语句常常可以有多重写法。更加简明的递减计数循环如下:while(i0)printf(Tminus%dandcounting\n,i--);9如果控制表达式的值始终是非零值的话,while语句将无法终止。C语句程序员有时故意用非零常量作为控制表达式来构造无限循环:while(1)…除非循环体含有跳出循环控制的语句(break,goto,return)或调用了导致程序终止的函数,否则上述这种形式的while语句将永远执行下去。10程序square.c用一个while语句显示平方值表格。用户指定平方值表格的行数:Thisprogramprintsatableofsquares.Enternumberofentriesintable:511243941652511square.c/*Printsatableofsquaresusingawhilestatement*/#includestdio.hintmain(void){inti,n;printf(Thisprogramprintsatableofsquares.\n);printf(Enternumberofentriesintable:);scanf(%d,&n);i=1;while(i=n){printf(%10d%10d\n,i,i*i);i++;}return0;}12程序sum.c对用户输入的整数数列求和:Thisprogramsumsaseriesofintegers.Enterintegers(0toterminate):8237150Thesumis:107程序需要使用循环,循环采用scanf函数读取用户输入数,然后再把这个数加到运算的总和中。13sum.c/*Sumsaseriesofnumbers*/#includestdio.hintmain(void){intn,sum=0;printf(Thisprogramsumsaseriesofintegers.\n);printf(Enterintegers(0toterminate):);scanf(%d,&n);while(n!=0){sum+=n;scanf(%d,&n);}printf(Thesumis:%d\n,sum);return0;}14运行结果:50501001nn1001nn说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。运行结果:5050do语句的一般格式如下:do语句while(表达式);执行do语句时,先执行循环体,再计算控制表达式的值。如果表达式的值非零,那么再次执行循环体,然后再次计算表达式的值。17使用do语句重写前面的“倒数计数”程序:i=10;do{printf(Tminus%dandcounting\n,i);--i;}while(i0);do语句和while语句没有本质的区别。唯一的不同在于do语句的循环体至少会被执行一次。18最好对所有的do语句都使用大括号包括循环体,因为没有大括号的do语句很容易被误认为是while语句:doprintf(Tminus%dandcounting\n,i--);while(i0);粗心的读者可能会把单词while误认为是while语句的开始。19while(i=100)运行结果:50501001nn运行结果:50501001nn程序numdigits.c计算用户输入的整数的位数:Enteranonnegativeinteger:60Thenumberhas2digit(s).方法是将将用户输入的整数反复除以10,直到结果变为0,除的次数就是用户输入整数的位数。do语句比while语句更适合,因为每个整数,即便是0都至少有一位数字。22numdigits.c/*Calculatesthenumberofdigitsinaninteger*/#includestdio.hintmain(void){intdigits=0,n;printf(Enteranonnegativeinteger:);scanf(%d,&n);do{n/=10;digits++;}while(n0);printf(Thenumberhas%ddigit(s).\n,digits);return0;}23for语句适合应用在使用“计数”变量的循环中,然而它也灵活用于许多其他类型的循环中。for语句的一般格式如下:for(表达式1;表达式2;表达式3)语句表达式1、表达式2和表达式3全都是表达式。示例:for(i=10;i0;i--)printf(Tminus%dandcounting\n,i);24for语句的执行流程for(表达式1;表达式2;表达式3)语句;25for语句和while语句关系紧密。除了极少数情况,for循环总可以等价替换为while循环:表达式1;while(表达式2){语句表达式3;}表达式1是在循环开始执行前,只执行一次的初始化步骤。26表达式2控制用于控制循环的终止(循环持续执行,只要表达式2的值非零)。表达式3是在每次循环的最后被执行的一个操作。按照这种模式,上面的for循环可以改写为如下的while循环:i=10;while(i0){printf(Tminus%dandcounting\n,i);i--;}27研究等价的while语句有助于更好地理解for语句。例如,假设把先前for循环示例中的i--替换为--i:for(i=10;i0;--i)printf(Tminus%dandcounting\n,i);等价的while循环显示上述的替换对循环没有任何影响:i=10;while(i0){printf(Tminus%dandcounting\n,i);--i;}28由于for语句中的第一和第三表达式都是以语句的方式执行的,所以它们的值互不相关——它们有用仅仅是因为有副作用。所以,这两个表达式常常是赋值表达式或自增/自减表达式。29for语句对于“向上加”(变量自增)或“向下减”(变量自减)的循环来说是最好的选择。对于向上加或向下减共有n次的情况,for语句经常会采用下列形式中的一种。从0向上加到n–1:for(i=0;in;i++)…从1向上加到n:for(i=1;i=n;i++)…从n-1向下减到0:for(i=n-1;i=0;i--)…从n向下减到1:for(i=n;i0;i--)…30常见语句错误:◦在控制表达式中用(大于)代替(反之亦然)。“向上加”使用或=运算符;“向下减使用或〉=运算符。◦在控制表达式中使用==代替,=,,或=。◦编写的控制表达式用i=n代替in,会产生“循环次数差一次”错误。31C语言允许省略任意或全部的表达式。如果省略第一个表达式,那么在执行循环前没有初始化的操作:i=10;for(;i0;--i)printf(Tminus%dandcounting\n,i);如果省略第三个表达式,那么循环体需确保第二个表达式的值最终会变为假:for(i=10;i0;)printf(Tminus%dandcounting\n,i--);32当第一和第三表达式都省略时,for循环与while循环没有任何区别:for(;i0;)printf(Tminus%dandcounting\n,i--);等价于while(i0)printf(Tminus%dandcounting\n,i--);while语句的形式更清楚,因此更可取。33如果省略第二个表达式,那么它默认为真,因此for语句不会终止(除非以某种其他形式停止)。例如:某些程序员用下列的for语句建立无限循环:for(;;)…34C99中,for语句的第一个表达式能被替换为一个声明(定义)。这个特性允许程序员在for循环中定义变量:for(inti=0;in;i++)…这样,变量i不需要在for循环前定义。35在for语句中定义的变量不能在循环体外访问,即在循环外不可见):for(inti=0;in;i++){…printf(%d,i);/*legal;iisvisibleinsideloop*/…}printf(%d,i);/***WRONG***/36让for语句定义自己的循环控制变量通常是个好的做法,方便且让程序易于理解。当然,如果程序需要在循环结束后访问这样的变量,那么就需要采用for语句常规的方式。for语句可以定义多个相同类型的变量:for(inti=0,j=0;in;i++)…37有时,for语句可能需要多个初始表达式,或在每次循环时一次对几个变量进行自增(减)操作。可以在for语句的第一和第三表达式中使用逗号表达式实现这些想法。逗号表达式具有如下形式:表达式1,表达式2这里表达式1和表达式2可以是任意两个表达式。38逗号表达式的计算分两步实现:◦第一,计算表达式1并丢弃计算结果。◦第二,计算表达式2并将计算结果作为整个逗号表达式的结果。计算表达式1始终是有意义的。当计算逗号表达式++i,i+j,i先自增,然后计算i+j◦假设,变量i和j的值分别为1和5,那么上面逗号表达式的值为7,而i的值将自增为2。39逗号运算符是左结合性的,所以编译器把下列表达式:i=1,j=2,k=i+j解释为:((i=1),(j=2)),(k=(i+j))即左边的操作先于右边的执行,这样表达式i=1,j=2,和k=i+j将从左到右执行。40逗