[cpp] I/O操作符号返回数值问题
I/O操作符号(<<和>>)返回数值
最近博问里有几个问题都牵涉到这一点了,简单做笔记说明一下。
首先cin是一个对象,不会"返回"值,>>和<<才是方法,具有返回值。>>和<<操作符的运算顺序是由左向右边,所以下面的两种语句描述其实是一致的:
cin>>a>>b>>c;
(((cin>>a)>>b)>>c);
操作cin>>a的意义: 调用istream
的operator>>方法读取数据并存入变量a中。那么>>或者<<的返回值是什么呢?这里说的返回值并不是指读入变量中的值,而是返回赋给左值的数据,在这里, >>返回的是cin,追踪源码可以发现这一点:
istream& operator>> (istream& is, char& ch );
istream& operator>> (istream& is, signed char& ch );
istream& operator>> (istream& is, unsigned char& ch );
istream& operator>> (istream& is, char* str );
istream& operator>> (istream& is, signed char* str );
istream& operator>> (istream& is, unsigned char* str )
当然也可以测试如下:
if ((cin >> a) == cin) {
cout << "Equal" << endl; // Yes
} else {
cout << "Not Equal" << endl;
}
为什么可以使用cin作为真值判定条件
cin可以被如下使用:
if(cin){}
if(cin>>a>>b){}
while(cin>>a){}
上面说到了>>的返回值是cin,所里上面的真值判定等同于:
if(cin){}
if(cin){}
while(cin){}
如果cin的状态ok则为真,如果cin遇到eof或者发生错误则返回false, 为什么可以使用cin作为真值判定条件?
首先看cin是如何定义的:
extern istream cin;
这样的一个值怎么可以作为if的真值判定条件呢?这是因为在if(cin)或者while(cin)的时候,其实是调用了一个istream的方法,写一行简单的代码反汇编看一下:int main() {
if(cin){}
return 0;
}
对应的汇编代码如下:
其实所有派生自ios的类都可以被强制转换为一个指针,如果设置了错误标志位则指针为null,否则非null,测试如下代码:
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ifstream is;
is.open ("test.txt");
if ( (void*)is == 0)// Equal to if(is)
cerr << "Error opening 'test.txt'\n";
return 0;
}