cin
在判断文件打开成功与否或是连续从流中读取数据时,就要用到对流对像的操作,比如 if(!cin) 或是 whie(cin) 。对于 while(cin>>val),cin 是一个流对象,而>>运算符返回左边的流对象,也就是说 cin>>val 返回 cin,于是 while(cin>>val) 就等于是 while(cin),问题就变成了一个流对象在判断语句中的合法性。
不管是 while(cin) 还是 if(cin),都是合法的。假如我们自己定义一个类,然后定义该类的对象,然后使用 if 语句来判断它是不合法的。这说明,流对象具有某种转换函数,可以将一个流对象转换成判断语句可以识别的类型。
打开 iOStream.h 文件,找到 cin 的定义,发现是来自于 istream.h,其中的模板类 basic_istream 继承自 basic_ios,打开 basic_ios 的定义,发现它有两个重载函数。operator void *() const 和 bool operator!() const。这两个函数使得流对象可作为判断语句的内容。
operator void *() const; 函数在 while(cin) 或是 if(cin) 时被调用,将流对象转换成 void * 类型。
bool operator!() const; 函数在 while(!cin) 或是 if(!cin) 时被调用,将流对象转换成 bool 类型。
需要指出的是,上述两个类型转换都是隐式的。因此,可以简单的理解调用过程为:
while(cin) =====> while(!cin.fail()) //while the stream is OK
while(!cin) =====> while(cin.fail()) //while the stream is NOT OK
相关阅读
HTML中cellpadding与cellspacing的区别解析
单元格(cell) -- 表格的内容单元格边距(表格填充)(cellpadding) -- 代表单元格外面的一个距离,用于隔开单元格与单元格空间单元格
C++中的cin, cin.getline, getline等混合使用时不能输
在学习C++时,经常会遇到一个问题,就是需要混合使用cin>>, cin.getline(), getline()时,有时会碰到不等你输入,就直接运行下一行的情况
Unity Cinemachine插件学习笔记,结合Timeline实现简单
1. 轨道设置如图 0和4重合,模拟一个闭环。的属性都是用来看的,没有实际影响。Looped如果选择了,就会将第一个点和最后一个点连接。
转自: C++中cin的详细用法 - CSDN博客 https://blog.csdn.net/k346k346/article/details/48213811
cin、cin.get()、cin.getline()、getline()的区别
测试平台g++ 5.4.0和VS2015社区版。 输入原理简述: 程序的输入都建有一个缓冲区,即输入缓冲区。每次输入过程是这样的,当一次键盘输