再给个for循环的用法:
for语句
for语句是C语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:
for(表达式1;表达式2;表达3)
语句; 表达式1 通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。
表达式2 通常是循环条件,一般为关系表达式或逻辑表达式。
表达式3 通常可用来修改循环变量的值,一般是赋值语句。
这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。
一般形式中的“语句”即为循环体语句。for语句的语义是:
1.首先计算表达式1的值。
2.再计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环。
3.然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for 语句的执行过程如图所示。
void main(){
int n,s=0;
for(n=1;n<=100;n++)
s=s+n; printf("s=%d\n",s);
} 用for语句计算s=1+2+3+...+99+100
int n,s=0;
for(n=1;n<=100;n++)
s=s+n; printf("s=%d\n",s);
本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。
void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2);
} 用for语句修改例题。从0开始,输出n个连续的偶数。
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d ",a*2);
本例的for语句中,表达式1已省去,循环变量的初值在for语句之前由scanf语句取得,表达式3是一个逗号表达式,由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 a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;n>0;)
{ a++;n--;
printf("%d ",a*2);
} } 本例中省略了表达式1和表达式3,由循环体内的n--语句进行循环变量n的递减,以控制循环次数。
void main(){
int a=0,n;
printf("\n input n: ");
scanf("%d",&n);
for(;;){ a++;n--; printf("%d ",a*2);
if(n==0)break;
} } 本例中for语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当n值为0时,由break语句中止循环,转去执行for以后的程序。在此情况下,for语句已等效于while( 1)语句。如在循环体中没有相应的控制手段,则造成死循环。
3.循环体可以是空语句。
#include"stdio.h"
void main(){
int n=0; printf("input a string:\n");
for(;getchar()!='\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");
} }
for语句是最灵活也是最常用的循环结构。Java主要提供了两种形式的for语句:数值型for循环和基于集合的for循环。
1. 数值型for循环
数值型for循环的一般形式为:
for(表达式1;表达式2;表达式3)
语句; 在关键字for后的括号内有3个表达式语句,其中表达式1和表达式3可以是任意表达式语句或空语句,甚至是逗号表达式;表达式2必须为boolean型的常量、变量或表达式。它的执行过程如图5-9所示,说明如下:
(1)先求解表达式1,然后求解表达式2,若其值为真(true),则执行for语句中内嵌的循环语句;若其值为假(false),则转到第5步结束循环。
(2)求解表达式3。
(3)转回上面求解表达式2,继续执行。
(4)循环结束,执行for语句下面的一个语句。
在使用数值型for循环时,常把表达式1用于初始化循环变量,表达式2是循环的判定条件,表达式3常用作循环增量表达式。其形式如下:
for(初始化循环变量;循环条件;循环变量增量)
语句; 如例2.6求1 2 3 4 5,其算法实现如下:
【例5.8】
程序执行结果如下:
1 2 3 4 5=120
使用注意事项:
(1)for循环中的表达式1(循环变量初始化)、表达式2(循环条件)和表达式3(循环变量增量)都是可选项, 即可为空语句,但“;”不能缺省。
省略了“表达式1(循环变量初始化)”,表示不对循环控制变量初始化。循环变量的初始化工作可置于for循环之前。
省略了“表达式2(循环条件)”,则for循环将成为死循环,不停的执行循环体。如:
for(int i=2; ;i++)
{ t= t*i; } 相当于: for(int i=2;true;i++)
{ t= t*i; } 省略了“表达式3(循环变量增量)”,则不对循环控制变量进行操作,这时可在语句体中加入修改循环控制变量的语句。如:
for(int i=2;i<=5 ;i++)
{ t= t*i; } 相当于: for(int i=2;i<=5;)
{ t= t*i; i++; } 省略了“表达式1(循环变量初始化)”和“表达式3(循环变量增量)”。如:
for(int i=2;i<=5 ;i++)
{ t= t*i; } 相当于: int i=2; for(;i<=5;)
{ t= t*i; i++; } 当然,3个表达式可以同时省略。如:
for(int i=2;i<=5 ;i++)
{ t= t*i; } 相当于: int i=2; for(;;) { t = t*i;
i++; if(i<=5) break; //如果i<=5,则跳出循环体。
} (2)表达式1和表达式3可以是一个简单表达式也可以是逗号表达式。如:
int t=1; for(int i=2;i<=5;i++)
{ t= t*i; } 相当于: int t,i; for(t=1,i=2;i<=5;t=t*i,i++); //该语句虽简洁,但不够清晰,建议程序中不要这么写。
2. 基于集合的for循环
基于集合的for循环是在JDK5.0版本之后,为简化集合类、枚举和数组的迭代过程而提出来的。其一般形式如下:
for(类型 标识符:可迭代的表达式) 语句;
在关键字for后的括号中有两个控制元素,它们之间用一个冒号“:”分隔开。第一个元素用于指定的一个类型标识符;而第二个元素指定了一个可迭代的表达式(结果通常是集合或数组)。第一个元素指定的类型标识符其类型应与集合或数组中存放的对象相兼容。它的语义可描述如下,其流程如图5-10所示。
类型 标识符 =null;
for(int i=0; i<可迭代表达式结果长度; i++)
{ 标识符= 可迭代表达式结果.get(i);
语句; } 集合类和枚举将在后面章节详细介绍,这里举个在数组中运用的例子。如例2.9有50个学生,要求将他们之中成绩在80分以上者打印出来。