cin,cout,以及其返回值

转载 2012年03月29日 22:40:49

我在考虑这个问题时也是百思不得其解。。好不容易看到这篇文章。。故转载


转自: http://blog.csdn.net/kongbai308416350/article/details/4470914



今天在看c++primer的时候,读到其中这样一段话:

When we use an istream as a condition, the effect is to test the state of the stream. If the stream is validthat is, if it is still possible to read another input then the test succeeds. An istream becomes invalid when we hitend-of-file or encounter an invalid input, such as reading a value that is not an integer. An istream that is in an invalid state will cause the condition to fail.

其对应代码是:while (std::cin >> value)

                                   ...
开始就觉得这样有点不对劲,但是也不知道是哪里不对劲.仔细一想,原来是觉得这个cin的位置十分诡异...

原来我们最常用的就是直接输入或者直接输出.比如cin>>value;或者cout<<value;现在把这个放到while里面进行判断.

难道cin与cout的返回值是bool型的?好像也说不过去.

GOOGLE之~~

 

分下面几点来说明:

1.cin和cout是iostream类的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的地址。

 

 

///

  1. 文件   bits/basic_ios.h     
  2. ....     
  3.         public:     
  4.             operator   void*()   const       
  5.             {   return   this->fail()   ?   0   :   const_cast<basic_ios*>(this);   }     
  6.     
  7.             bool       
  8.             operator!()   const       
  9.             {   return   this->fail();   }     
  10. ....     

 

 

 

 

 

 

 

故能够放入while中判断.

 


C++中cin,cout,以及返回值

转自:http://blog.csdn.net/kongbai308416350/article/details/4470914  今天在看c++primer的时候,读到其中这样一段话: When...
  • ljh0302
  • ljh0302
  • 2015年08月31日 20:58
  • 1621

C++中cin/cout的用法

格式: cin>>变量1>>变量2>>……>>变量n;cin:C++编程语言互换中的标准输入流,需要头文件iostream.hcin代表标准输入设备,使用提取运算符“>>”从设备键盘取得数据,送到输...
  • linjingtu
  • linjingtu
  • 2016年07月03日 11:52
  • 2081

C++的cin/cout为什么比C语言的scanf/printf慢

很早就知道,c的scanf(printf)比c++的快。刷题时尤其明显,在这上面超时是常有的事儿。 但,这是别人告诉我的,c快。 为什么快? 从网上借鉴一个例子做个简单测试: 1.cpp   ...
  • ZQ_onlytime
  • ZQ_onlytime
  • 2015年04月06日 10:35
  • 2399

cin,cout与scanf,printf的速度到底相差多少

昨天在OJ上看到一个很水的题,题意就是两个递增序列,输出合并后新序列的中值(详细描述可参见我的另一篇文章http://hi.baidu.com/i5love1you9/blog/item/250f57...
  • u012966194
  • u012966194
  • 2016年04月25日 20:39
  • 1973

cin,cout,以及其返回值

今天在看c++primer的时候,读到其中这样一段话: When we use an istream as a condition, the effect is to test the stat...
  • txyj08
  • txyj08
  • 2014年09月03日 20:22
  • 212

[笔记]cin、cout与scanf、printf的效率差异对比分析

之前上传UVa227 puzzle时,好不容易AC了,但发现自己用时50(ms),而在VJ上看到人家都是40ms、20ms,于是打开一个20ms的代码查看人家强在哪里。但结果研究了半天感觉差不多,于是...
  • XieNaoban
  • XieNaoban
  • 2016年08月16日 18:52
  • 543

C++输入与输出—cout和cin的用法

输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句结构。输入输出不是由C++本身定义的,而是在编译系统提供的I/O库中定义的。 C++的输出和输入是用“流...
  • zhanghaotian2011
  • zhanghaotian2011
  • 2013年04月30日 00:41
  • 66924

C++ cin 和cout 返回值问题

代码: int _tmain() {   string i;  while (cin >> i)  {    cout  }  return 0; } 程序一直在while 里面循环,不知道为什么,...
  • u012286235
  • u012286235
  • 2013年10月01日 10:00
  • 336

C++输入cout与输出cin

转载于:http://c.biancheng.net/cpp/biancheng/view/116.html 输入和输出并不是C++语言中的正式组成成分。C和C++本身都没有为输入和输出提供专门的语句...
  • shmilxu
  • shmilxu
  • 2016年03月08日 16:42
  • 1412

iostream 缓冲区详解(cin和cout)

缓冲区缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。 缓冲区根据其对应的是输入设备还是输出设...
  • codedoctor
  • codedoctor
  • 2017年12月24日 17:59
  • 65
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cin,cout,以及其返回值
举报原因:
原因补充:

(最多只允许输入30个字)