C语言中的 for 语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。
For语句的一般形式为:
for(表达式 1;表达式 2;表达式3)语句
它的执行过程如下:
(1)先求解表达式1。
(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。
(3)求解表达式3。
(4)转回上面第(2)步骤继续执行。
(5)循环结束,执行for 语句下面的一个语句。
可以用图6.6来表示for 语句的执行过程。
图 6.6
for语句最简单的应用形式也就是最易理解的如下形式:
for(循环变量赋初值;循环条件;循环变量增值)语句
例如:
for(i=1;i<=100;i++)sum=sum+i;
它的执行过程与图6.2完全一样。可以看到它相当于以下语句:
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
显然,用for 语句简单、方便。对于以上for语句的一般形式也可以改写为while循环的形式:
表达式1;
while(表达式2)
{语句
表达式3;
}
说明:
(1)for 语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。注意省略表达式1时,其后的分号不能省略。如 for(;i<=100;i++) sum= sum+i;执行时,跳过“求解表达式1”这一步,其他不变。
(2)如果表达式2省略,即不判断循环条件,循环无终止地进行下去。也就是认为表达式2始终为真。见图6.7。
图 6.7
例如:
for(i=1; ;i++) sum=sum+i;
表达式1是一个赋值表达式,表达式2空缺。它相当于:
i=1;
while(1)
{sum=sum+1;
i++;
}
(3)表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。如:
for(i=1;i<=100;)
{sum=sum+i;
i++;
}
在上面的 for 语句中只有表达式1和表达式2,而没有表达式3.i++的操作不放在for语句的表达式3的位置处,而作为循环体的一部分,效果是一样的,都能使循环正常结束。
(4)可以省略表达式1和表达式3,只有表达式2,即只给循环条件。如:
for(;i<=100;)
{sum=sum+i;
i++;}
相当于
while (i<=100)
{sum=sum+i;
i++;}
在这种情况下,完全等同于while语句。可见for 语句比while语句功能强,除了可以给出
循环条件外,还可以赋初值,使循环变量自动增值等。
(5)3个表达式都可省略,如:
for(;;)语句
相当于
while(1)语句
即不设初值,不判断条件(认为表达式2为真值),循环变量不增值。无终止地执行循环体
(6)表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的
其他表达式。如:
for (sum=0;i<=100;i++)sum=sum+i;
表达式3也可以是与循环控制无关的任意表达式。
表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。如:
for(sum=0,i=1;i<=100;i++)sum=sum+i;
或
for(i=0,j=100;i<=j;i++,j--)k=i+j;
表达式1和表达式3都是逗号表达式,各包含两个赋值表达式,即同时设两个初值,使两个变量增值,执行情况见图6.8。
图6.8
在逗号表达式内按自左至右顺序求解,整个逗号表达式的值为
其中最右边的表达式的值。如:
for(i=1;i<=100;í++,i++)sum=sum+i;
相当于
for(i=1;i<=100;i=i+2) sum=sum+i;
(7)表达式一般是关系表达式(如i<=100)或逻辑表达式(如 a<b&&.x<y),但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。分析下面两个例子:
① for(i=0;(c=getchar())! ='\n';i+=c);
在表达式2中先从终端接收一个字符赋给c,然后判断此赋值表达 式的值是否不等于’\n'(换行符);如果不等于'\n’,就执行循环体。此 for 语句的执行过程见图6.9,它的作用是不断输入字符,将它们的 ASCII 码相加,直到输入一个“换行”符为止。
图6.9
注意:此for 语句的循环体为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。
②for( ; (c=getchar())!='\n';)
printf("%c",c);
只有表达式2,而无表达式1和表达式3。其作用是每读入一个字符后立即输出该字符,直到输入一个“换行”为止。请注意,从终端键盘向计算机输入时,是在按Enter键以后才送到内存缓冲区中去的。运行情况:
Computer (输入)
Computer (输出)
而不是
CCoommppuutteerr
即不是从终端敲入一个字符马上输出一个字符,而是按Enter键后数据送入内存缓冲区,然后每次从缓冲区读一个字符,再输出该字符。
从上面介绍可以知道C语言中的for语句比其他语言(如BASIC,PASCAL)中的 FOR 语句功能强得多。可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现,这样程序可以短小简洁。但过分地利用这一特点会使for语句显得杂乱,可读性降低,建议不要把与循环控制无关的内容放到for语句中。