【提问整理】为什么没有赋值?“cin”作为循环条件?

    技术2024-07-25  22

    提问帖子: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”的数据读取、存储机制等(相关的内容想必很丰富啊~)。  
          这是我博客上的第一篇文章,最后还是想说点什么。       首先,这个问题,我觉得暂时我的疑惑是没有的,至于结帖结得是否恰当——换言之,问题的讨论是否充分了,我没有把握。算是作为新人的一种忐忑吧,嘿嘿。       其次,在网上看了一些人的文章、提问、解答等等,越来越深的一个感受就是,自己现在所学的东西太浅太浅,我需要下的功夫还有太多太多。真的,又一次激起了我抓紧时间,努力的奋斗的激情。       再次,希望自己可以保持一种探究、好奇的精神,有点钻劲(不是钻牛角尖,一棵树上吊死那种。。),多去思考,多去动手,多去请教,多查资料,多看书学习。还有培养良好的习惯。       最后,尝试下,用博客来记录自己一点点的足迹,也监督自己,鞭策自己。
    最新回复(0)