为什么从流中读取无效输入时,会把一个整数设为0,而不是保留它原本的值?

编程语言 2026-07-09

我在用《Programming: Principles and Practice Using C++》这本书来学习编程。

在第二章中,有这样一个简单的例子:

#include <iostream>

using namespace std;

int main() {
  cout << "Please enter your first name and age\n";
  string first_name = "???";   
  int age = -1;
  cin >> first_name >> age;
  cout << "Hello, " << first_name << "(age" << age << ")\n";
}

书里说:如果输入错误——把年龄放在名字之前——那么 age 的值在提取时应该保持为 -1,但我得到的是 0

为什么会这样?我用过GCC和 Clang,结果都是一样的。

解决方案

你得到 0,这是因为你的编译器实现了对 [LWG696] 的处理。

根据C++98标准,提取失败时,value 应该保持不变。这个被认为是一个缺陷,正确的做法是在你的情况下把它设为零。既然被认为是缺陷,现代编译器甚至在C++98模式下也会把它设为零。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章