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的语法特性让你可 以用下面的精简版本替换标准版本:

当获取值和判断值都成功,

处理该值。

posted @ 2022-02-06 12:55  喻雅芬  阅读(46)  评论(0)    收藏  举报