与while语句相比for语句更为灵活,不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,for语句完全可以代替while语句。
1.for语句的一般形式为:
for(表达式1;表达式2;表达式3)
语句
3个表达式的作用:
表达式1:设置初始条件,只执行1次。可以为0个,1个或多个变量。
表达式2:是循环条件表达式,用来判定是否继续循环。在每次执行循环体之前先执行表达式2。
表达式3:作为循环的调整,例如使循环变量增值,表达式3是在执行完循环体之后再执行。
2.常用的for语句的形式:
for(循环变量赋初值;循环条件;循环变量增值)
语句
例如:

for(i=1;i<100;i++)sum=sum+i;

①”i=1″是给循环变量赋初值为1
②”i<100"是指定循环条件
③”i++”是循环变量i的值不断增加1,以便最终满足终止循环的条件,使循环结束,也就是:循环变量i的初值为1,循环变量增量为1,循环变量最终值是100,每执行一次循环,i加1,直到i大于100,就不再执行了。
3.for语句的执行过程:
(1)求解表达式1。
(2)求解表达式2。若此条件表达式的值为真(非0),则执行for语句中的循环体,然后执行第(3)步,若条件表达式的值为假(0),则循环结束,转到第(5)步。
(3)求解表达式3。
(4)转回(2)继续执行。
在执行完循环体后,循环变量的值超过循环终值,循环结束。其规律为:循环变量沿着变化的方向超过循环终值,循环就结束了。
(5)循环结束,执行for语句下面一个语句。
4.for语句与while语句的改写
for语句:
for(表达式1;表达式2;表达式3)语句
改写为while语句:
表达式1;
while(表达式2)
{
语句
表达式3
}
二者无条件等价。
5.for语句的一些变化
(1)省略表达式1,即不设置处置,但是不可以省略表达式1后面的分号。
注意:因为省略了表达式1,没有对循环变量赋初值,所以为了正常执行循环,应该在for语句之前给循环变量赋初值。

int i=1;for(;i<100;i++)sum=sum+i;

(2)省略表达式2,不设置和检查循环条件
此时循环将无终止地进行下去,也就是表达式2始终为真。

for(i=1;;i++)sum=sum+i;

就相当于

i=1while(1){sum=sum+i;i++;}

循环无终止进行,i的值不断加大,sum的值也不断累积。
(3)省略表达式3,但是要另设法保证循环可以正常结束。

for(i=1;i<100;){sum=sum+i;i++;}

i++的操作不放在表达式3的位置,而是作为循环体的一部分,效果是一样的,都能使循环正常结束。但是如果表达式3和循环体中都无此”i++”,则循环将无终止执行下去。
(4)只有表达式2,没有表达式1和表达式3。应当在for语句之前给循环变量赋初值,否则循环无法正常进行;在循环体当中使循环变量增值,否则循环将无终止执行下去。

int i = 1;for(;i<100;){sum=sum+i;i++;}

相当于

int i = 1;while(i<100){sum=sum+i;i++;}

(5)省略3个表达式

for(;;)printf("%d",i);

相当于

while1printf("%d",i);

即不设置初值也不判断循环条件(认为表达式2为真),循环变量也补增值,无终止执行循环体语句,显然这样做没有实用价值。
(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式,表达式3也可以是与循环控制无关的任意表达式,但无论怎样写for语句,都必须使循环能正常执行。

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

(7)表达式1和表达式3可以是一个简单的表达式,也可以是一个逗号表达式,即包含一个以上的简单表达式,中间用逗号隔开。
如:

for(sum=0,i=0;i<100;i++)sum=sum+i;
for(i=0,j=100;i<=j;i++,j--)k=i+j;

在逗号表达式内要按照自左向右的顺序求解,整个逗号表达式的值为最右边表达式的值
例如:

for(i=1;i<100;i++,i++)sum=sum+i;

相当于

for(i=1;i<100;i=i+2)sum=sum+i;

(8)表达式2一般是关系表达式(如i<100)或逻辑表达式(a<b && x<y),但也可以是数值表达式或者字符表达式,只要其值为非0,就执行循环体
for(i=0;(c=getchar())!='\n';i+=c)
表达式2先从终端接受一个字符给c,然后判断此赋值表达式是否不等于’\n’(换行符),如果不等于’\n’,就执行循环体。
这个for语句的循环体为空语句,是因为把本来要在循环体内处理的内容放到了表达式3中。
for(;(c=getchar())!='\n';) printf("%c",c);
for语句只有表达式2,没有表达式1和表达式3,作用是没读入一个字符后立即输出该字符,直到输入一个’\n’为止。
要注意的是,从终端向计算机输入时,是在按Enter键以后才将一批数据送到内存缓冲区去。因此不是从终端输入一个字符马上输出一个字符,而是在按下Enter键之后数据才送到内存缓冲区,然后每次从缓冲区读一个字符,再输出该字符。
(9)C99允许在for语句的表达式1中定义变量并赋初值。

for(int i=1;i<100;i++)sum=sum+i;

但是要注意,在表达式1中所定义的变量的有效范围只限于for循环中,在循环外不能使用此变量。