while(cin>>index0>>str>>index1)
我有点不理解,希望帮帮忙,谢谢
将cin的返回值作为bool值来处理;如果index0、str、index1都有正确输入则执行while循环,否则退出while循环。
while(cin>>index0>>str>>index1)
分解一下
int a = cin>>index0;
int b = a>>str;
int c = b>>index1;
while(c)
我这是java风格的,请注意
我们不应该问cin返回值是什么,我觉得我们应该关注">>"输入操作符,其实是它到底返回了什么。因为cin是标准输入istream的一个对象,一个对象能返回什么吗?对象有返回值吗?好像没有吧!在C++primer里面讲到过,cin>>x>>y。有这么一行代码,我们讨论下">>"这个输入操作符,这个操作符接收一个istream对象作为其做操作数,接收一个对象作为其右操作数。">>"操作符返回其左操作数作为结果,这样也就可以解释为什么上面可以将两个输入操作合并了。因为cin>>x返回cin对象,接着又可以进行cin>>y。所以我们就可以顺利进行输入了。
为了分析简便以下内容假设index0、index1类型为int;str为string对象.
这段代码涉及到两个运算符重载:
第一个:重载移位运算符
//版本1:从输入流读取整形数据
istream& operator>> (istream &, int &);
//版本2:从输入流读取string对象
istream& operator>> (istream &, string &);
从以上重载函数的原型可以看出while语句中的条件实际与下列函数调用等价
operator>> (operator>>(operator>> (std::cin, index0), str), index1);
std::cin是一个istream对象,以上代码的含义是:
step1:以std::cin和index0为实参调用operator>> ()函数的版本1,返回值为istream对象;
step2:用setp1中返回的istream对象和str为实参调用operator>> ()函数的版本2,返回值为istream对象;
step3:用setp2中返回的istream对象和str为实参调用operator>> ()函数的版本2,返回值为istream对象;
显然step3函数调用的返回值就是cin >> index0 >> str >> index1;这条语句的返回值。从函数原型来看,step3中调用函数的返回值类型为istream&,而while语句的判断条件接受一个bool型的表达式,这里能够编译成功并正确运行必然存在从isteam类型到bool类型的转换。
这种转化是如何实现的呢?这就涉及到第二个运算符重载了:
istream类有如下成员函数
//类型转换运算符的返回类型是确定的,无法指定返回类型,但它有返回值。
operator bool();
如上istream类实现了bool()类型转换运算符的重载,那么在while语句中,根据需求编译器自动调用此函数完成从istream对象到bool型的转换。
现在,只剩下一个问题了!
当发生转化时,一个istream对象什么时候被转化成true?什么时候被转化成false呢?
从使用流对象的角度来看,一般来说出现错误时,如类型不匹配以及读取到文件尾时结果为false。
简单来讲就是连续输入三个变量,变量类型分别是index(),str,index1对应的类型,如果输入合法并成功读取则进行while循环
当发生转化时,一个istream对象什么时候被转化成true?什么时候被转化成false呢?从使用流对象的角度来看,一般来说出现错误时,如类型不匹配以及读取到文件尾时结果为false。将cin的返回值作为bool值来处理;如果index0、str、index1都有正确输入则执行while循环,否则退出while循环。