August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
现在,我们必须处理数值,事实上这不是一件容易的事。如何获得123这个数值呢?当然,它可由100+20+3得来,但12.34又如何获得呢?另外,我们应该允许使用科学计数法(如12.34e5)吗?为了正确实现这些功能,可能需要花几个小时甚至几天时间,幸运的是,我们可以不必做这个工作。输入流能够解析C++字面常量,并能将其转换为double类型的数值。因此,我们所要做的只是如何在get()函数中告诉cin完成这些工作而已:
某种程度上,我们是随意选择了‘8’来表示“数值”这类单词。
那么,我们如何知道输入中出现了一个数值呢?如果根据经验来推测,或者是参考C++文献(如附录A),我们会发现一个数值常量必须以一个阿拉伯数字或者小数点开头。因此,我们可以在程序中检测这些符号,来判断是否出现数值。接下来,我们希望cin完成数值的读取,但我们已经读入了第一个字符(一个阿拉伯数字或小数点)。因此,我们需要将第一个字符的数值和cin读入的后续字符的值结合起来。例如,输入123,我们会得到1,cin读入23,我们需要将100与23相加。这太繁琐了!幸运的是(并不是偶然的),cin与Token_stream的工作方式类似,也可以把已经读出的字符放回输入流中。因此,不用做繁琐的数学运算,我们只需把第一个字符放回cin,然后由cin读入整个数值。
请注意,我们如何一次又一次地避免做复杂的工作,代之以寻找简单的解决方案——通常是借助于C++库。这就是程序设计的本质:不断地寻找更简单的方法。这与“优秀的程序员都是懒惰的”(看起来有些好笑?)不谋而合。从这个角度说(当然,也只有从这个角度),我们应该“懒惰”,如果能找到一个更简单的方法,我们何必写那么多代码呢? ...