C ++在输入失败时应该保持变量不变吗?

时间:2010-10-19 13:42:21

标签: c++ iostream

C ++不能保证在输入失败时保持变量不变吗?对于旧版本的gcc,像这样的程序会将i的-1值保持为失败(例如,如果输入的是字母而不是输入的数字)。使用Ubuntu 10.10(gcc 4.4.5)时,如果输入失败,i将重置为零。

#include <iostream>

int main()
{
 int i = -1;
 std::cin >> i;
 std::cout << "i = " << i << '\n';
 return 0;
}

这种行为打破了我的很多代码。我想gcc的人都知道他们在做什么,这很可能是我的错。如果有人知道这个标准,我想知道它对这种情况的看法。

感谢。

3 个答案:

答案 0 :(得分:5)

不要依赖变量。依靠流的状态:

if (std::cin >> i) // "if (!std::cin.fail())" would also work
{
    // ok
}
else
{
    // error
}


至于为什么行为发生了变化,那是因为C ++标准已经发展:

来自C ++ 03:

  

如果发生错误,val不变;   否则它被设置为   结果价值。

从C ++ 0x(嗯......从我有权访问的最后一个草稿):

  

要存储的数值可以是   其中之一:

     
      
  • 零,如果转换函数无法转换整个字段。
  •   
  • 最正(或负)可表示的值,如果字段为   转换为有符号整数类型   代表一个太大的积极价值   (或否定的)代表   VAL。
  •   
  • 最正可表示的值,如果要转换为的字段   无符号整数类型表示一个   无法表示的值   VAL。
  •   
  • 转换后的值,否则。
  •   

答案 1 :(得分:3)

对于这种情况,C ++标准已经改变了所需的行为。这些要求可以在[lib.facet.num.get.virtuals](C ++ 03中的22.2.2.1.2,C ++ 0x中的22.4.2.1.2)中找到。

在C ++ 03中,要求是在出现错误时旧值不变 在C ++ 0x中,要求是在转换错误的情况下存储值0

答案 2 :(得分:1)

如果您希望失败的流入不影响您的变量,并且您不希望它将流置于失败状态,则流入字符串,将字符串解析为临时字符串,如果所有成功的话,继续。

您可以使用istringstream将字符串解析为临时字符。