我目前正在阅读 Stroustrup 关于 C++ 的书。在用户输入部分,它有以下示例 -
#include <iostream>
#include <string>
using namespace std;
int main(){
cout << "Please enter your first name and age:\n";
string firstName = "???"; // "??? means don't know the name"
int age = -1; // -1 means don't know the age
cin >> firstName >> age;
cout << "Hello " << firstName << " (age " << age << ")\n";
}
按照书上的说明,我们初始化了 age
变量,以便在输入失败时获得可预测的值。
该示例表明输入 22 Carlos
将产生 Hello 22 (age -1)
的输出。
我在文本编辑器 (Sublime Text) 中输入了相同的代码,但是当我使用上述输入运行代码时,我的年龄为 0(不是 -1)。 这是我得到的输出的屏幕截图 - output image from terminal . 而且,这是我正在使用的编译器版本 - compiler-version .
谁能解释为什么我没有像书中所说的那样得到 -1 作为年龄输出?
最佳答案
简短的回答是,如果该书的版本已超过几年,则两者都是正确的。
在 C++11 之前,operator>>
提取整数的默认行为是 leave it unchanged如果提取失败。
在 C++11 中,此行为已更改为在提取失败时将 0 存储到整数中。
我不知道为什么要进行更改,但我的猜测是它可以防止一类常见的未定义行为,即人们让变量未初始化,然后在使用变量之前不检查提取是否成功。
不幸的是,格式化输入背后的机制相当冗长,但精简版本是调用最终归结为 num_get::get()
,其中指定了此行为。1
1:为了您的利益,也可以attach a different facet用于改为使用格式化输入,这意味着您可以指定任何您想要的失败行为。
关于c++ - 当用户为 int 变量输入字符串时输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56087461/