cin、!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 *() constbool 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

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值