C++在输入失败时应该保持变量不变吗?

Rém*_*émi 3 c++ iostream

C++不能保证在输入失败时保持变量不变吗?对于旧版本的gcc,像这样的程序会将i的-1值保持为失败(例如,如果输入的是字母而不是输入的数字).使用Ubuntu 10.10(gcc 4.4.5)时,如果输入失败,i将重置为零.

#include <iostream>

int main()
{
 int i = -1;
 std::cin >> i;
 std::cout << "i = " << i << '\n';
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

这种行为打破了我的很多代码.我想gcc的人都知道他们在做什么,这很可能是我的错.如果有人知道这个标准,我想知道它对这种情况的看法.

谢谢.

Kea*_*eks 5

不要依赖变量.依靠流的状态:

if (std::cin >> i) // "if (!std::cin.fail())" would also work
{
    // ok
}
else
{
    // error
}
Run Code Online (Sandbox Code Playgroud)


至于为什么行为发生了变化,那是因为C++标准已经发展:

来自C++ 03:

如果发生错误,val不变; 否则将其设置为结果值.

从C++ 0x(嗯..从我有权访问的最后一个草稿):

要存储的数值可以是以下之一:

  • 零,如果转换函数无法转换整个字段.
  • 如果要转换为有符号整数类型的字段表示要在val中表示的过大的正(或负)值,则为最正(或负)可表示的值.
  • 如果要转换为无符号整数类型的字段表示无法用val表示的值,则为最正可表示的值.
  • 转换后的值,否则.