您的位置:首页 > 编程语言 > C语言/C++

C++ cin返回值问题

2018-02-07 16:17 183 查看
转自:http://www.cnblogs.com/alex-tech/archive/2012/03/27/2420197.html

首先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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: