注册 登录
编程论坛 C++教室

请问一下cin的返回值是什么?

nwpu063417 发布于 2008-03-07 01:27, 13665 次点击
刚学C++最一道ACM时,遇到如下代码:
int main()
{
    int a,b;
    while(cin >> a >> b)
        cout << a+b << endl;
}
请问循环终止的条件是什么?cin的返回值是什么?  谢谢大家了
10 回复
#2
hezal2008-03-07 02:16
当你输入了a和b 的值后,循环就停止了吧.
#3
nwpu0634172008-03-07 11:55
[bo]以下是引用 [un]hezal[/un] 在 2008-3-7 02:16 的发言:[/bo]

当你输入了a和b 的值后,循环就停止了吧.


不是的,我不知道什么时候循环停止
#4
blueboy820062008-03-07 12:24
Ctrl+d
结束符
#5
blueboy820062008-03-07 12:28
ctrl+ z 应该也可以吧
#6
aipb20072008-03-07 12:56
首先,cin是个对象,没有所谓返回
>>输入操作符返回流对象的引用,cin >> x 返回istream&,cout << x返回oostream&

if可直接判断流,如if (cin)
while间接判断,如while (cin >> x)
若流被标记错误(读取失败)就返回false.
ctrl+z,F6可跳出循环,这代表eof(文件结束符)
#7
a198705022008-03-08 10:29
版主的回答十分详细!!顶!
#8
nwpu0634172008-03-09 01:32
谢谢aipb2007  
能解释一下什么时候流被标记错误么?
#9
aipb20072008-03-09 12:31
在ios,istream和ostream类中,还定义了若干输入输出函数,它们主要用于错误处理,流的刷新以及流输入输出方式的控制.
    错误处理
    在对一个流对象进行I/O操作时,可能会产生错误。当错误发生时,错误的性质被记录在ios类的一个数据成员中。

    ios类中定义的描述错误状态的常量:
       goodbit-------------没有错误,正常状态 
       eofbit--------------到达流的结尾
       failbit-------------I/O操作失败,清除状态字后,可以对流继续进行操作。
       badbit--------------试图进行非法操作,清除状态字后,流可能还可以使用。
       hardfail------------致命错误,不可恢复的错误。
    对应于这些位,可用ios中定义的如下函数来检查流的当前状态位:
       int good()---------如果正常,返回非0值
       int bad()----------如果badbit被设置,返回非0值
       int eof()----------如果eofbit被设置,返回非0值
       int fail()---------如果failbit被设置,返回非0值
       int rdstate()------返回当前错误状态位.

    流的其它成员函数可以从流中读取字符或字符串,对流进行无格式化的输入 输出操作,以及直接控制对流的I/O操作。

返回类型         ostream类的成员                   描      述
ostream&         put(char ch)                 向流中输出一个字符ch,不进行任何转换
ostream&        write(char*,int)         向流中输出指定长度的字符串,不进行转换
ostream&         flush( )                           刷新流,输出所有缓冲的但还未输出的数据
ostream&        seekp(streampos)         移动流的当前指针到给定的绝对位置
ostream&     seekp(sereamoff,seek_dir)   流的当前指针类似与文件的当前指针
streampos        teelp( )                        返回流的当前指针的绝对位置

istream类的成员函数

返回类型           istream类的成员                描       述
 int                      get( )                              读取并返回一个字符
istream&            get(char&c)                  读取字符并存入c中
istream&             putback( )                 将最近读取的字符放回流中
istream&           read(char*,int)          读取规定长度的字符串到缓冲区中
int                      peek( )                               返回流中下一个字符,但不移动文件指针
istream&          seekg(streampos)           移动当前指针到一绝对地址
istream&        seekg(streampos,seek_dir)    移动当前指针到一相对地址
streampos              tellg( )                    返回当前指针



其他地方找的,很多函数我也没常用过,自己看吧!
#10
xuxuliu2010-03-26 08:22
这个我倒是略知一二,但是不是完全知道。就是当在缓冲区读取到的数据与>>后面的变量类型不匹配的时候,就会结束。比如说在楼主程序里,a,b是int的,你如果在下面的cin>>里面输入的是非int的(比如说是‘a'或其它)就会结束。。。
#11
lix662011-04-25 21:20
一、关于输入运算符和cin的成员函数
cin >> a;
>> 是运算符, 有运算结果, 结果就是cin本身。
正因如此, 才可以书写下面语句:
cin >> a >> b;
该语句中的 >> 运算从左至右进行, 第一步 cin >> a 的结果是 cin
因此 cin >> a >> b 在完成a的输入后, 就变成了 cin >> b, 相当于
(cin >> a) >> b;

若用输入数据时发生了错误, 可用 cin.bad()、cin.fail()、cin.eof()来检测, 正如前面的回复所说。
另一种方法是用cin.good()来判断输入是否成功。下面是一个演示程序:
int a;
cin >> a;
while (! cin.good())
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << "请重新输入: ";
  cin >> a;    // 重新输入
}
cout << "a = " << a << endl;
如果用户输入 haha<回车>, 将会提示用户重新输入。

二、关于cin的类型转换
if(...) 和 while (...) 语句的条件表达式, 被视为逻辑值, 非零为真, 零为假。
当 cin 出现在 if 语句和 while 语句的条件表达式中时, 将会自动转换为 bool 类型。
下面是 cin 转换为 bool 类型的例子:
bool b;
b = cin; // cin 转换为 bool 值并赋值给变量 b

cin 转换为逻辑类型时, 到底是什么值呢? 它是根据 cin 的状态决定的, 其结果与good函数的值一致。
所以可以将上面的演示程序可以简化为:
int a;
cin >> a;
while (! cin)
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << "请重新输入: ";
  cin >> a;    // 重新输入
}
cout << "a = " << a << endl;

这个程序中有两处书写了相同的代码 cin >> a, 而该运算的结果就是 cin, 故可以再简化为:
int a;
while (! (cin >> a))
{
  cin.clear(); // 清除错误标记
  cin.sync();  // 清除已输入的字符
  cout << "请重新输入: ";
}
cout << "a = " << a << endl;

现在再看ACM的程序就不难看懂了。
int main()
{
  int a, b;
  while (cin >> a >> b)
  {
    cout << a + b << endl;
  }
  return 0;
}

不知楼主是否满意?
1