在输入流失败后,输入变量的影响

4
我正在处理以下代码。
#include <iostream>

int main()
{
  std::cout << "Enter numbers separated by whitespace (use -1 to quit): ";
  int i = 0;
  while (i != -1) {
    std::cin >> i;        
    std::cout << "You entered " << i << '\n';
  }
}

我知道使用while (std::cin >> i)会更好,但我不理解一个特定的情况。 如果我提供无效输入,循环将变成无限循环,因为输入流进入了失败状态。我的问题是输入变量i会发生什么?在我的情况下,它变成了0,而不管之前输入的值是什么。为什么在无效输入后它会改变为0?这是预定义的行为吗?


如果输入失败,则流的输入变量即参数将保持不变。 - Koushik Shetty
@Koushik 他们是吗?在我的情况下它们会变成0。这就是我的问题所在。为什么会改变,为什么是0? - chosentorture
对我来说不起作用,它总是显示我输入的最后一个数字。在MSVC2012中进行了测试。 - Borgleader
@Borgleader 我正在使用Code::Blocks上的GCC 4.7.2,它确实会变成0并进入无限循环。 - chosentorture
1个回答

8
因为你使用的是C++11 之前的编译器,所以得到了零。在最新的标准中,如果提取失败,则会将输入值保留不变。旧标准要求:

如果提取失败,则将零写入value,并设置failbit。如果提取的结果太大或太小而无法适应value,则写入std::numeric_limits ::max()或std::numeric_limits ::min(),并设置failbit标志。

(来源)

对于gcc编译器,需要向编译器传递 -std=c++11 以使用新行为。


2
我正在使用GCC 4.7.2,并在Code::Blocks中使用-std=c++11标志。那个版本是C++11之前的吗? - chosentorture
直到4.8.1版本,他们才声称所有C++11功能都已经就位。他们很有可能还没有实现行为上的变更。 - Michael Kristofik
我认为你是正确的。它在VS2012上对@Borgleader没有改变,但对我有改变。谢谢! - chosentorture

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接