Выводится, когда пользователь вводит строку для переменной int - PullRequest
1 голос
/ 11 мая 2019

Я сейчас читаю книгу Страуструпа на 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).Вот скриншот выводов, которые я получаю - вывод изображения с терминала .И вот версия используемого мной компилятора - compiler-version .

Может кто-нибудь объяснить, почему я не получаю -1 в качестве вывода возраста, каккнига претендует?

1 Ответ

2 голосов
/ 11 мая 2019

Короткий ответ: оба верны, если этой версии книги более нескольких лет.

До C ++ 11 поведение по умолчанию operator>> при извлечении целого числа было оставьте его без изменений , если извлечение завершится неудачей.

В C ++ 11 это поведение было изменено, чтобы хранить 0 в целое число при сбое извлечения.

Я неЯ знаю, почему было сделано изменение, но я предполагаю, что оно предотвращает общий класс неопределенного поведения, когда люди оставляют переменную неинициализированной, а затем не проверяют успешность извлечения перед использованием переменной.

К сожалению, механизмформатированный ввод довольно длинный, но сжатая версия такова, что вызов в конечном итоге сводится к num_get::get(), где указано это поведение. 1

1: Для вашего интереса, также можно прикрепить другой фасет для форматированного ввода, чтобы использовать вместо него, то есть вы можете указать любое поведениеты хочешь за неудачу.

...