C++中cin输入无效值时int变量为何被设为0而非初始值-1?
C++输入流行为疑问解答
使用环境
- 64位Ubuntu 22.04.1 LTS
- Eclipse IDE版本2022-06(4.24.0),构建ID:20220609-1112
- 基于Linux GCC工具链编译
测试代码
#include "std_lib_facilities.h" int main() { int age = -1; // 即使不赋值程序也能运行,赋值是为了实现某种错误提示 string first_name = "???"; // cout << "Please enter your first name and age\nie. Quagmire 69\n"; cin >> first_name; cin >> age; cout << "Hello, " << first_name << " (age " << age << ")\n"; return 0; }
测试现象与疑问
运行程序时输入420 as;ldfkj,输出为Hello, 420 (age 0)。
- 为何age的输出是0而非初始化的-1?2014年的教材似乎预期返回-1,是教材有误还是理解错了?
- 如何输入会导致
first_name出现错误?尝试过数字、特殊字符、Zalgo字符、表情符号,均能正常输出。
问题解答
关于age输出为0的原因
这是C++标准输入流行为的版本差异导致的:
- C++11之前,当输入流读取无法转换为目标类型的值时,变量会保留初始化值(也就是你设置的-1)。
- 从C++11开始,输入失败时会将目标变量设为对应类型的零值(int类型就是0),同时标记流的
failbit错误状态。 - 你用的GCC工具链默认启用C++11及以上标准,所以触发了新行为;2014年的教材可能基于旧标准编写,才会预期返回-1。
关于first_name的错误触发
std::string的>>运算符会读取所有非空白字符直到遇到空白,几乎所有可打印字符(数字、特殊符号、表情符号等)都会被存入字符串,常规输入很难触发错误。要让读取出现异常,可以:
- 输入远超系统内存分配上限的字符流,导致内存分配失败;
- 手动中断输入流(Linux下按
Ctrl+D,Windows下按Ctrl+Z),此时first_name会保留初始值???,同时流状态变为eofbit。
内容的提问来源于stack exchange,提问作者StrawberryMustard
相关产品推荐
相关产品推荐

