cin和cout返回值问题

cincout返回值问题

              ---雨竹清风

今天看了段代码感觉怪怪的。

string value;

while(cin>>value)

{

   cout<<value<<endl;

}

哪不对呐?while循环条件,while循环判断条件还能是非bool,非常量型的?

从网上查了一下,下面是引用网上大牛的原话。

分下面几点来说明:

1.cincoutiostream类的2个对象,对象是无所谓返回值的.有返回值的是<<还有>>2个操作符.由于我们知道,操作符其实也就是函数(在操作符重载的时候可以清晰的认识到).>>操作符返回的是它的左操作数(left-operand).对于cin>>value;返回左操作数就是操作的流的引用,也就是istream&.

2.但是好像还是不对,因为while里面判断的是bool,难道还能判断istream&?

打开<ISTREAM>头文件,找到类模板basic_istream的定义,摘出这么两个语来:

typedef basic_istream<_E, _Tr> _Myt;

_Myt& operator>>(......) ......

这说明cin >>的返回值类型就是basic_istream&,可是放到while()中情况又该是怎样的。while()中要求是布尔表达式,难不成basic_istream&类型可以转换成bool类型?继续查看头文件,发现所有的operator重载函数都是<<>>,没有找到用于类型转换的操作那就只好追溯到父类basic_ios了。

打开头文件<IOS.H>,找到ios的定义,其中有这么一条语句,类型转换函数的定义:

operator void *() const { if(state&(badbit|failbit) ) return 0; return (void this; }

有这个函数的定义之后,编译器会在需要的情况下将ios类型自动转换为void*类型。因此,在表达式while (cin >> m >> n)中,括号中的表达式为了匹配bool类型将自动转换为void*类型。如果读入时发生错误返回0,否则返回cin的地址

 

 

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值