提问帖子:http://topic.csdn.net/u/20110131/23/48848953-828d-443e-a097-a9714de14c8e.html?20367 主要问题集中在:while (cin >> val >> unit),即“cin”作为while循环控制条件的问题。
首先,为什么可以?2楼的回答基本解决了这个问题:
C/C++ code operator bool () { return 流是否有效( true / false ); } istream类重载了上边这个类型转换符,当istream类对象cin出现在while()里时,会调用cin.operator boll()返回true/false; 我觉得这里提到的“流是否有效”比较关键——说起来,刚开始都没看懂,后来才发现,是重载了小括号“()”,bool操作符。这样,第一个问题就解决了。 接着,就还需要弄清楚,什么时候会返回“false”。这里7楼和8楼进行了有关的解释。(不过这里是针对我提出的问题和输入来的,没有包括所有的情况吧) 输入类型与变量类型不匹配,cin对象里会做标记,operator bool就false退出。 回答:在读入代码里,首先执行cin >> val部分,由于val是int型,如果输入数字以外的字符,就会导致数字转换异常(这个转换在bool类型重载里实现的。)。如果前部分输入数字转换成功,则执行后部分cin >> unit,由于unit是char型,所以可以输入数字以及各种字符。但是cin对于空格等一些功能字符过滤啦,所以连续回车视为无效字符,还是要求继续输入; 另外,经过测试如果输入123f,cin可以分别给val=123,unit=f赋值;即一次可以给两个变量赋值。这些操作的规则都是由bool重载决定的。 尤其是8楼提到的“数字转换异常”,这个我觉得对于解答我的疑惑比较关键。我的理解是,当读入数据,准备存入变量时,发现数据类型无法正常或者说合理转换为变量所属的数据类型来进行存储,然后“cin”通过重载的bool操作符(即小括号)返回了“false”。正因为如此,出现非法输入后,才会直接跳出循环,而变量“val”和“unit”都保持上一次读取数据后存储的值。 概括起来,两个关键点:bool操作符重载,数字转换异常。 可以更进一步的探究,重载具体是如何实现的,“cin”的数据读取、存储机制等(相关的内容想必很丰富啊~)。