程序清单6.1 summing.c
/*summing.c--对用户输入的整数求和*/
#include <stdio.h>
int main (void)
{
long num;
long sum=0L; /*把sum初始化为0*/
int status;
printf("Please enter an integer to be summed.(q to quit):\n");
status = scanf("%ld",&num);
while (status==1)
{
sum=sum+num;
printf("Please enter next integer (q to quit):\n");
status=scanf("%ld",&num);
}
printf("Those integer sum to %ld.\n",sum);
return 0;
}
6.11 程序注释
这个循环的判断表达式是:status==1;==运算符是C的相等运算符。当status的值不为1时终止循环。
要使程序正确运行,在每次循环中应该为num获取一个新值,并且重置status。程序使用scanf()的两个不同的功能做到这一点。首先使用scanf()来尝试为num读入新值,然后使用scanf()的返回值来报告执行是否成功(scanf()返回成功读取项目的个数)。如果您输入的不是一个数字,例如q,那么scanf()就不能读入一个整数,所以它的返回值和status都为0.这将使循环终止 。
如果scanf()在尝试转换一个数值时遇到了问题(例如,检测到文件的尾部或者遇到硬件问题),它就会返回一个特殊值EOF,这个值一般被定义为-1.这个值同样也会导致循环终止。
总之,因为while循环是一个入口条件循环,所以程序必须在进入循环体之前获取输入并检查status的值。这就是程序在while之前有一个scanf()调用的原因。要使循环继续执行,在循环中需要一个读语句,这样程序才可以得到下一个输入的状态。这就是程序在while循环的结尾处还有一个scanf()的原因,它为下一次循环做准备。可以把如下用法做为循环的标准格式:
get first value to be tested
whlie the test is successful
process value
get next value
6.1.2 C风格的读循环
下面的结构:
status = scanf("%ld",&num);
while (status==1)
{
/*loop actions*/
status == scanf("%ld",&num)
}
可以用下面的形式代替:
while (scanf("%ld",&num)==1)
{
/* loop actions*/
}
第二种形式同时使用了scanf()的两种不同用法。首先,如果调用成功,函数会把一个值放在num中;第二,函数的返回值(1或0)用来控制循环。
来源:oschina
链接:https://my.oschina.net/u/2754880/blog/681291