2014-01-21 6 views

ответ

2

std::get() читает ввод как неформатированный интегральное значение, поэтому он преуспевает, так как ему не нужно форматировать то, что он считывает в любой конкретный тип , Но operator>> считывает ввод как в формате данных, поэтому он должен отформатировать то, что он читает в заданном типе. Поскольку в вашем случае вход 'q' не подходит для double, форматирование не работает.

4

Как вы говорите, std::istream::get получает знак от входного потока. Например, если вы вводите цифру 1 в качестве ввода, она возвращает код ASCII для символа '1', который является 49 десятичным (в системах, использующих ASCII, что почти все).

При использовании оператора ввода >> эта функция считывает и анализирует ввод в правильный формат. Поэтому, если вы используете >> с переменной double и введите 1, вы получите значение 1.0 в переменной.

Проблема у вас есть то, что, когда входной оператор >> не может правильно разобрать вход, как при вводе буквы вместо цифр, то оператор ввода будет прервана и не установить переменную, то есть вы напечатать неинициализированную переменную, которая равна неопределенное поведение. Обратите внимание, что это поведение изменилось в C++ 11 (см., Например, this old answer of mine).

Вы должны помнить, что объект потока можно использовать как условие и что функция оператора ввода возвращает данный поток. Таким образом, вы можете сделать, например.

if (std::cin >> x) 
    std::cout << x << '\n'; 
else 
    std::cout << "Error in input\n"; 
+0

+1, с незначительным nitpick: '1.0' представляется точно в' double' (или 'float', если на то пошло). – Angew

Смежные вопросы