我目前正在阅读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)
的输出。
我在文本编辑器(崇高的文本(中输入了相同的代码,但是当我使用上述输入运行代码时,我的年龄为0(不是-1(。这是我得到的输出的屏幕截图 - 终端输出图像。而且,这是我正在使用的编译器的版本 - 编译器 -
任何人都可以解释为什么我没有按年龄的输出获得-1,正如这本书所声称的吗?
简短的答案是,如果这本书的版本超过几年,则两者都是正确的。
在C 11之前,operator>>
提取整数的默认行为是如果提取失败,则将其保持不变。
在C 11中,当提取失败时,此行为更改为整数存储到整数。
我不知道为什么要进行更改,但我的猜测是,它可以防止人们从保留变量非初始化的人中,然后在使用变量之前不检查该提取成功。
不幸的是,格式化输入背后的机械非常冗长,但是凝结的版本是调用最终归结为指定此行为的num_get::get()
。 1
1:为了您的兴趣,也可以将一个不同的方面连接用于格式的输入以使用,这意味着您可以指定失败的任何行为。