3

我正在处理以下代码。

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

4

1 回答 1

7

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

如果提取失败,则将零写入 value并设置 failbit。如果提取导致值太大或太小而无法容纳在值中,则写入 std::numeric_limits::max() 或 std::numeric_limits::min() 并设置故障位标志。

来源

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

于 2013-07-02T16:20:30.527 回答