Задержка признания недействительным потока в цикле - PullRequest
2 голосов
/ 22 мая 2019

Программа читает значения int через cin и отображает их количество. cin используется в качестве теста while loop.

Как ни странно, даже при нецелом входном значении цикл увеличивает счетчик, т. Е. Цикл выполняется по крайней мере один раз, даже после отмены потока перед выходом.

Другими словами, для ввода

2.53

вывод

1

Согласно C ++ Primer, 5e, автор Lippman, Lajoie, Moo

Когда мы используем istream в качестве условия, необходимо проверить состояние поток. Если поток действителен, то есть если поток не обнаружил ошибку, тогда тест пройден успешно Istream становится недействительным, когда мы достигаем конца файла или встречаемся неверный ввод , такой как чтение значения, которое не является целым числом. Это поток, который находится в неверное состояние приведет к тому, что условие приведет к ложному.

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

Код

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{

    int a;
    int count = 0;
    while (cin >> a)
        cout << ++count << endl;

    return 0;
}

Начинающий, поэтому любая помощь будет оценена по достоинству.

1 Ответ

7 голосов
/ 22 мая 2019

Это потому, что он успешно читает 2 часть 2.53 в a.Затем он снова возвращается к циклу, пытается что-то сделать с ., а затем выпадает из цикла.

Вы можете увидеть это в действии, если также зарегистрируете прочитанное, то есть:

while (cin >> a)
{
    cout << a << " " << ++count << endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...