【问题标题】:Effects on Input Variable after Failed Input Stream输入流失败后对输入变量的影响
【发布时间】:2013-06-30 02:38:52
【问题描述】:

我正在编写以下代码。

#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 &gt;&gt; i) 会更好,但我不了解具体情况。 如果我提供了无效输入,则循环将变为无限,因为输入流进入故障位状态。我的问题是输入变量i 会发生什么?在我的情况下,无论输入的先前值如何,它都会变为 0。为什么输入无效后变为0?这是预定义的行为吗?

【问题讨论】:

  • 如果输入失败,输入变量,即流的参数保持不变..
  • @Koushik 是吗?在我的情况下,它们变为 0。这就是我的问题。为什么它会改变,为什么是 0?
  • 它不适合我,它总是显示我输入的最后一个数字。在 MSVC2012 中测试。
  • @Borgleader 我在 Code::Blocks 上使用 GCC 4.7.2,它确实变为 0 并进入无限循环。

标签: c++ gcc iostream cin


【解决方案1】:

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

如果提取失败,将零写入值并设置失败位。如果 提取导致值太大或太小而无法适应 值,std::numeric_limits::max() 或 std::numeric_limits::min() 已写入并设置了故障位标志。

(source)

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

【讨论】:

  • 我使用的是 GCC 4.7.2,并且我在 Code::Blocks 中使用了 -std=c++11 标志。那个版本是 C++11 之前的版本吗?
  • 直到 4.8.1,他们才声称所有 C++11 特性都已到位。他们很可能还没有实施行为改变。
  • 我认为你是对的。 @Borgleader 在 VS2012 上并没有改变,但对我来说确实如此。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多