Кажется излишним использование cin в качестве условия с if, while

У меня есть код, который мне кажется лишним:

    char c;
    cin>>c;
    if(cin&&c=='n')
    //do something

Я не понимаю ценности использования cin в if. Разве он не всегда будет иметь значение TRUE, поскольку я никогда не встречал ни одного случая (в моем ограниченном опыте ), где этот объект istream не создается.

Точно так же я видел это:

     if(cin)

Пожалуйста, поправьте меня, в чем я ошибаюсь. Теперь люди не публикуют часть ошибки в потоке, как я уже знаю, основная часть - это когда происходит сбой потока, кроме сбоя ios_base :: Init


person Gaurav    schedule 19.07.2017    source источник
comment
en.cppreference.com/w/cpp/io/basic_ios/operator_bool   -  person Mooing Duck    schedule 19.07.2017
comment
@MooingDuck Итак, когда поток может столкнуться с ошибкой: вы можете дать мне несколько примеров, ссылок?   -  person Gaurav    schedule 19.07.2017
comment
Гурав int x, cin >> x; с пользовательским вводом FUBAR !, который не может быть преобразован в int. С char немного сложнее.   -  person user4581301    schedule 19.07.2017
comment
@ user4581301 А что, если нечего вводить, просто cin - ›Я отредактировал вопрос, пожалуйста, посмотрите.   -  person Gaurav    schedule 19.07.2017
comment
@Gaurav cin не находится в состоянии ошибки, когда он не построен. Он находится в плохом состоянии, когда обнаруживает ошибки при извлечении данных. Примером того, как он может потерпеть неудачу в вашем фрагменте, является то, что он встречает конец файла, например, если входные данные вашей программы передаются из файла или из другой программы, которая завершилась.   -  person François Andrieux    schedule 19.07.2017


Ответы (1)


std::cin является экземпляром _ 2_. Поскольку он используется в контексте условия, нас интересует bool оператор преобразования. Из http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool:

std :: basic_ios :: оператор bool

Возвращает истину, если поток не содержит ошибок и готов к операциям ввода-вывода. В частности, возвращает! Fail ()

Из документации ясно, что if(cin) предназначен для проверки наличия у cin ошибок. Точнее, он говорит, если cin не обнаружил ошибку во время последней операции.

Условие в if(cin&&c=='n') следует тому же принципу, но также проверяет, что входной поток предоставил n. Другими словами, если cin не обнаружил ошибку и вернул символ n.

person François Andrieux    schedule 19.07.2017