while(cin>>a)的原理
来源:互联网 发布:拍摄淘宝图要如何布光 编辑:程序博客网 时间:2024/05/20 00:51
>>运算符返回的是流对象的引用,那么题目就变成了 while(cin);
这好像有点奇怪,上网找了答案
这是地址点击打开链接
以下是复制过来的内容,不是本人原创:
今天看书的时候看到代码while(cin>>val),忽然就在想这样写的合法性是如何判定的。我们都知道cin是一个流对象,而>>运算符返回左边的流对象,也就是说cin>>val返回cin,于是while(cin>>val)就变成了while(cin),问题就变成了一个流对象在判断语句中的合法性。
不管是while(cin)还是if(cin),都是合法的,为什么呢?我们自己定义一个类,然后定义该类的对象,然后使用if语句来判断它是不合法的。这说明,流对象具有某种转换函数,可以将一个流对象转换成判断语句可以识别的类型。
经过在网上的搜索查询发现,流对象确实存在这样的转换。
打开iostream.h文件,找到cin的定义,发现是来自于istream.h,其中的模板类basic_istream继承自basic_ios,打开basic_ios的定义,发现它继承自ios_base,再次定位到ios_base类,发现它有两个重载函数。operator void *() const和bool operator!() const。这两个函数使得流对象可作为判断语句的内容。(参考网页)
operator void *() const;函数在while(cin)或是if(cin)时被调用,将流对象转换成void*类型。
bool operator!() const;函数在while(!cin)或是if(!cin)时被调用,将流对象转换成bool类型。
///当流处于goodbit状态时,读入成功码,返回cin地址,并转换为void*型,继续循环 operator void* () const{ ///流的状态由>>操作符调用ios改变,当读到eof或者输入不符合所写入的类型时设置badbit和failbit if (state & (badbit | failbit)) ///一种直观的写法 return 0;///当流处于badbit或failbit状态时,返回0,循环停止 return (void*)this;///返回的是cin,相当于while(cin) }
需要指出的是,上述两个类型转换都是隐式的。
既然我们找到了while(cin)合法的原因,自然需要试验一下。
我们定义一个类A,在A中定义上述两个函数,然后定义A的一个对象a,使用if(a)和if(!a)来验证一下。代码如下:
#include<iostream> using namespace std; class A { public: A() {} ~A() {} operator void* () const { cout << "cast to void*; "; return (void *)this; } bool operator ! () const { cout << "cast to bool; "; return true; } }; int main() { A a; if (a) cout << "first" << endl; if (!a) cout << "second" << endl; return 0; }
运行以上程序,结果为cast to void*; first和cast to bool; second。
结果表明,if(a)隐式调用了operator void* ()函数,if(!a)隐式调用了bool operator ! ()函数。
上述两个函数其实是操作符的重载过程。使用这种重载函数,我们就可以像使用cin一样,用if语句对我们的对象做判断了。
- while(cin>>a)的原理
- while(cin>>val)的原理浅析
- while(cin)的理解
- while(cin>>string)的使用方法
- 第一章 快速入门 关于while(cin>>a)
- if(cin) while(cin) 以及 while(cin>>x) 条件表达式中的 流对象cin 的用法
- 设计函数求一元多项式的导数 while(cin>>a>>b){cout<<a<<b;}
- while(cin>>a)在文件输入时,切换时会出现的问题
- cin的返回值与while(cin>>x)问题
- while(cin>>str)无法结束的问题
- while(cin>>str)结束的问题
- 有关while(cin>>str)的问题
- while(cin>>val)的调用机理
- 如何退出while(cin>>value)的循环
- while(cin>>str)无法结束的问题
- C++中while(cin)的理解
- cin作为while循环的条件
- while(cin>>word)循环的退出方法
- [Leetcode] - Longest Substring Without Repeating Characters
- LeetCode 之堆栈 stack
- 知识点积累(三)
- linux中fork()函数详解
- 鼠标右键点击没有新建命令有什么方法解决
- while(cin>>a)的原理
- 深入理解C语言
- 关于ListView和Button同在一个布局,Button置底的问题
- UML 的九种模型图
- hdu2045 不容易系列之(3)—— LELE的RPG难题
- 一中单调队列专题
- MessageFormat用法
- 全世界医生都靠技术吃饭,中国医生靠卖药吃饭
- 专栏成书亦可行也!——leo鉴书48