输入流失败后对输入变量的影响

时间:2013-07-02 16:10:39

标签: c++ gcc iostream cin

我正在处理以下代码。

#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?这是预定义的行为吗?

1 个答案:

答案 0 :(得分:7)

因为你有一个pre-C ++ 11编译器,所以你得零。在失败时保持输入值不变是最新标准中的新功能。旧标准要求如下:

  

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

source

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