为什么cin,期望一个int,在输入无效的情况下将相应的int变量更改为零?

Tho*_*son 26 c++

我是C++的新手,我正在尝试编写一个非常基本的程序,但我遇到了初始化整数的问题.我把它剥离到一个仍然存在问题的非常小的程序:

#include <iostream>
using namespace std;

int main()
{
    cout << "Please enter your age\n";
    int age = -1;
    cin >> age;
    cout <<"\n\n Your age is " << age << "\n\n";
}
Run Code Online (Sandbox Code Playgroud)

我看了,如果我尝试输入一个字符串,例如abcage变量,然后输入要失败和值应单独留在家中,因此它应该打印Your age is -1.

但是,当我运行此程序并键入时abc,它会打印出来Your age is 0.为什么?

Bau*_*gen 33

您希望观察的行为在2011年发生了变化.在此之前:

如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit.

但是从C++ 11开始:

如果提取失败,则将零写入值并设置failbit.[...]

(来自cppr.)

  • 这是什么理由? (10认同)
  • 我想如果读取失败,要求保留旧值可能效率低下.现在,我们可以立即开始覆盖旧值,然后在出现错误时清除它. (9认同)
  • 如果效率只是原因,那么在失败的情况下保留未指定的值会更有意义.它们似乎很奇怪它们会破坏现有代码以消除操作中的简单内存移动,该操作通常由磁盘访问时间(或键入速度,如果终端中的stdin)控制. (7认同)

nob*_*bar 5

使用我针对(gcc 4.8.4)测试的编译器,无论我针对哪个版本的标准编译,该值都设置为零(对于“abc”输入)。另请注意,如果您提供的有效整数超出了您所分配给的变量的支持范围,则它会设置为最小值/最大值。

不过,更重要的一点是,忽略错误标志会导致灾难。一旦输入出现错误,任何后续输入都是可疑的(没有像ignore()这样的黑客攻击)。像这样的情况很适合使用异常处理。

以下是我如何实现您正在尝试执行的操作(但是,再次考虑到多个输入的情况,从错误中恢复是一件麻烦事):

cin.exceptions( ~std::ios::goodbit );
try { cin >> age; }
catch ( std::ios::failure const & )
   {
   age=-1;
   cin.clear();
   cin.ignore(999,'\n');
   }
Run Code Online (Sandbox Code Playgroud)

或没有例外:

cin >> age;
if ( cin.fail() ) age=-1, cin.clear(), cin.ignore(999,'\n');
Run Code Online (Sandbox Code Playgroud)

类似问题请看这里:

以下是相关操作员的最新文档: