我目前正在阅读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作为年龄输出吗?
答案 0 :(得分:2)
简短的答案是,如果该书的版本超过几年,两者都是正确的。
在C ++ 11之前,如果提取失败,则operator>>
提取整数的默认行为是leave it unchanged。
在C ++ 11中,此行为已更改为在提取失败时将0存储到整数中。
我不知道为什么要进行更改,但是我的猜测是,它可以防止由于人们未定义变量而又未检查提取是否在使用变量之前成功的情况下,导致了常见的未定义行为。
不幸的是,格式化输入背后的机制非常冗长,但简而言之,是该调用最终归结为num_get::get()
,在此指定了此行为。 1
1:为了您的利益,也可以attach a different facet来代替格式化输入,这意味着您可以指定想要失败的任何行为。