cin,cout,以及其返回值

转载 2012年03月25日 12:38:00

转自: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的地址。

  文件   bits/basic_ios.h  
  ....  
          public:  
              operator   void*()   const    
              {   return   this->fail()   ?   0   :   const_cast<basic_ios*>(this);   }  
   
              bool    
              operator!()   const    
              {   return   this->fail();   }  
  ....  

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
  • 217

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

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

vc++中的cin和cout问题

           今天写程序遇到了一个奇怪的问题,编译出错报告是:“error C2065: cout : undeclared identifier”和“error C2065: cin : u...
  • xyls12345
  • xyls12345
  • 2009年06月15日 19:33
  • 6891

cin,cout的加速

cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的...
  • u012476429
  • u012476429
  • 2013年11月20日 11:11
  • 3104

cin和cout的简单实用

从C到C++ 大二开始了,大一学的C,大二开始了C++的课程,首先C语言是结构化和模块化的语言,它是面向过程的,而C++是面向对象的,这就大大的加强了程序员对程序的可利用性和可操作性。 C++保留...
  • shanyongxu
  • shanyongxu
  • 2014年09月26日 13:26
  • 703

cin cout 快速输入输出(效率优化)

iostream很慢?? 在这里,我不得不纠正大家以为iostream很慢的这样一个以讹传讹流毒无穷的错误观念。 大家观察到的iostream慢,通常都是因为C++需要保持对C的IO ...
  • wxfwxf328
  • wxfwxf328
  • 2012年01月20日 15:22
  • 2974

C++ 中的cin,cout 为什么不需要类型说明

C语言中的printf()和scanf()函数的操作十分严格,必须指明相应的变量和数据的类型。但是C++里面的cin和cout却无须说明。这是因为他们能够从数据的书写格式上识别出他们的类型: cin...
  • myself_helper
  • myself_helper
  • 2013年04月02日 18:39
  • 819

C++中cin/cout的用法

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

九度cin/cout耗时原因

做九度题的时候,由于数据量大,很多情况下得用scanf和printf代替cin和cout用于输入输出,不然会报错超时不能AC。 有三条建议用于提高C++的输入输出速度: At the firs...
  • wtyvhreal
  • wtyvhreal
  • 2014年12月13日 15:25
  • 4783

04-C++-cin与scanf cout与printf效率问题

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的re...
  • l2580258
  • l2580258
  • 2016年05月05日 00:47
  • 1871
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cin,cout,以及其返回值
举报原因:
原因补充:

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