2013-07-02 32 views
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?这是预定义的行为吗?

+0

如果输入失败,输入变量(即流的参数保持不变)。 –

+0

@Koushik他们是?在我的情况下,它们变为0。这就是我的问题。它为什么会改变,为什么是0? – chosentorture

+0

它不适合我,它总是显示我输入的最后一个数字。经MSVC2012测试。 – Borgleader

回答

7

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

如果提取失败,则将写入值,并设置失败位。如果 提取的结果值太大或太小而不适合 值,则写入std :: numeric_limits :: max()或std :: numeric_limits :: min() ,并设置failbit标志。

source

对于GCC,你需要传递-std=c++11到编译器使用新的行为。

+1

我正在使用GCC 4.7.2,并且在Code :: Blocks中使用-std = C++ 11标志。该版本是否为C++ 11之前版本? – chosentorture

+0

直到4.8.1,他们声称所有的C++ 11功能都已到位。他们很可能尚未实施行为改变。 –

+0

我认为你是对的。它在VS2012上并没有改变@Borgleader,但它对我来说确实如此。谢谢! – chosentorture