Что делает cin при возникновении ошибки

#include<iostream>;

int main()
{
int a = 1;
int b = 2;
std::cin >> a >> b;
std::cout << a << "+" << b << "=" << a+b << std::endl;
return 0;
}

когда я вхожу 3 4 в качестве входа, выход будет 3+4=7ну странно;
Но когда я вхожу a b, выход 0+0=0(Почему это 0 и 0?);
Самый запутанный,a 4,это будет 0+0=0(Почему не ‘0 + 4 = 4’ ?????);
Затем я пишу другую прогу.

#include<iostream>;

int main()
{
int a = 1;
int b = 2;
std::cin >> a;
std::cin.clear();
std::cin >> b;
std::cout << a << "+" << b << "=" << a+b << std::endl;
return 0;
}

Когда я вхожу a 4почему это до сих пор 0+0=0? Разве это не должно быть 0+4=4?

Спасибо всем сердечным !!

Я пишу Prog3, чтобы проверить, что произойдет, когда я не пишу int a=1;int b=2;

2

#include <iostream>
using namespace std;
int main()
{
int a,b;
cin >> a  ;
cin >> b;
cout<< a << "+"<< b <<"="<< a+b << endl;
return 0;
}

когда a bопять же выводит 0+-1218170892=-1218170892(Почему нет 0+0=0??)

8

Решение

Как все istreams, std::cin имеет биты ошибок. Эти биты устанавливаются при возникновении ошибок. Например, вы можете найти значения битов ошибок с помощью таких функций, как good(), bad(), eof()и т. д. Если вы прочитали неверный ввод (fail() возвращается true), используйте clear() очистить флаги. Вам также, вероятно, понадобится ignore(1); удалить оскорбительного персонажа.

Увидеть State functions раздел для получения дополнительной информации. http://en.cppreference.com/w/cpp/io/basic_ios

1

Другие решения

std :: cin является экземпляром istream, и поэтому он сохраняет свое состояние ошибки, когда читает что-то недопустимое.

Чтобы «вылечить» его, вы должны оба очистить его флаг

std::cin.clear();

и очистить его буфер.

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Что еще более удивительно, так это то, что он не возвращает 1 + 2 = 3 при вводе недопустимых символов, так как я ожидаю, что сбойный поток cin не будет иметь побочных эффектов от того, что он пытается обновить.

0

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

В примере «a 4» оба значения равны 0, поскольку буфер не был очищен / очищен, поэтому при втором чтении из cin все еще читается ошибка, а также принимается значение 0.

0