9.C Primer Plus 6.1再探while循环
6.1再探while循环

该程序使用long类型以储存更大的整数。尽管C编译器会把0自动转换为 合适的类型,但是为了保持程序的一致性,我们把sum初始化为0L(long类 型的0),而不是0(int类型的0)。
输出结果如下:

6.1.1程序注释
该循环的测试条件是如下表达式:status ==1;
==运算符是C的相等运算符(equality operator),该表达式判断status是 否等于1。
不要把status== 1与status = 1混淆,前者是1与其相等,后者是把1赋给status。
根据测试条件status == 1,只要status等于1,循环就会重复。每次循环,num的当前值都被加到sum上,这样sum的值始终是当前整数之和。当status的值不为1时循环结束。然后程序打印sum的最终值。
要让程序正常运行,每次循环都要获取num的一个新值,并重置status。 程序利用scanf()的两个不同的特性来完成。首先,使用scanf()读取num的一 个新值;然后,检查scanf()的返回值判断是否成功获取值。
如果scanf()成功读取一个整数,就把该 数存入num并返回1,随后返回值将被赋给status(注意,用户输入的值储存 在num中,不是status中)。这样做同时更新了num和status的值,while循环进 入下一次迭代。如果用户输入的不是数字(如, q),scanf()会读取失败并 返回0。此时,status的值就是0,循环结束。因为输入的字符q不是数字,所 以它会被放回输入队列中(实际上,不仅仅是 q,任何非数值的数据都会导 致循环终止,但是提示用户输入q退出程序比提示用户输入一个非数字字符 要简单)。
注意:如果 scanf()在转换值之前出了问题(例如,检测到文件结尾或遇到硬件 问题),会返回一个特殊值EOF(其值通常被定义为-1)。这个值也会引起 循环终止。
该程序利用 scanf()的双重特性避免了在循环中 交互输入时的告知循环何时停止的问题。
假设scanf()没有返回值,那么每次循 环只会改变num的值。虽然可以使用num的值来结束循环,比如把num > 0(num大于0)或num != 0(num不等于0)作为测试条件,但是这样用户就 不能输入某些值,如-3或0。也可以在循环中添加代码,例如每次循环时询 问用户“是否继续循环?”,然后判断用户是否输入y。这个方法有些笨 拙,而且还减慢了输入的速度。使用scanf()的返回值,轻松地避免了这些问题。
程序的结构
总结如下:
把sum初始化为0,
提示用户输入数据,
读取用户输入的数据,
当输入的数据为整数时,
输入添加给sum,
提示用户继续输入,
然后读取下一个输入,
输入完成后,打印sum的值,
上述形式被称为伪代码,是一种用简单的句子表示程 序思路的方法,它与计算机语言的形式相对应。伪代码有助于设计程序的逻 辑。确定程序的逻辑无误之后,再把伪代码翻译成实际的编程代码。使用伪 代码的好处之一是,可以把注意力集中在程序的组织和逻辑上,不用在设计程序时还要分心如何用编程语言来表达自己的想法。例如,可以用缩进来代 表一块代码,不用考虑C的语法要用花括号把这部分代码括起来。
下面的伪代码作为while循环的标准格式:
获得第1个用于测试的值,
当测试为真时,
处理值,
获取下一个值。
6.1.2C风格读取循环
程序清单6.1可以用多种语言编写,但是C语言编写最为简洁,例如:

第二种形式同时使用scanf()的两种不同的特性。首先,如果函数调用成 功,scanf()会把一个值存入num。然后,利用scanf()的返回值(0或1,不是 num的值)控制while循环。因为每次迭代都会判断循环的条件,所以每次迭 代都要调用scanf()读取新的num值来做判断。
换句话说,C的语法特性让你可 以用下面的精简版本替换标准版本:
当获取值和判断值都成功,
处理该值。

浙公网安备 33010602011771号