Подтвердить что ты не робот

Булева оценка С++

Так что мне любопытно, почему это происходит.

int main()
{
   bool answer = true;
   while(answer)
   {
      cout << "\nInput?\n";
      cin >> answer;
   }
return 0;
}

Ожидаемое поведение: 0 - Выход из программы, 1 - Подсказки снова, Любое ненулевое целое число, отличное от 1 - Запросы снова

Фактическое поведение: 0 - Как и ожидалось, 1 - Как и ожидалось, Любое ненулевое целое число, отличное от 1 - Бесконечная петля

От http://www.learncpp.com/cpp-tutorial/26-boolean-values/

One additional note: when converting integers to booleans, 
the integer zero resolves to boolean false, 
whereas non-zero integers all resolve to true.

Почему программа переходит в бесконечный цикл?

4b9b3361

Ответ 1

Фактически, перегрузка operator>>, используемая для чтения a bool, допускает только значение 0 или 1 в качестве допустимого ввода. Перегрузка оператора переходит к шаблону класса num_get, который считывает следующий номер из входного потока и затем ведет себя следующим образом (С++ 11 §22.4.2.1/6):

  • Если значение, которое нужно сохранить, 0, то сохраняется false.

  • Если значение 1, то сохраняется true.

  • В противном случае true сохраняется и ios_base::failbit присваивается err.

(err Здесь приведено состояние ошибки потока, из которого вы читаете; cin в этом случае. Обратите внимание, что существует дополнительный язык, определяющий поведение при использовании манипулятора boolalpha, который позволяет логическим быть вставлены и извлечены с использованием их имен, true и false; я пропустил эти другие детали для краткости.)

Когда вы вводите значение, отличное от нуля или единицы, состояние сбоя устанавливается в потоке, что приводит к сбоям в дальнейших отрывах. answer установлен на true и остается true навсегда, вызывая бесконечный цикл.

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

bool answer = true;
while (std::cin && answer)
{
    std::cout << "\nInput?\n";
    std::cin >> answer;
}

Ответ 2

Потому что operator>> терпит неудачу, если вход не равен 0 или 1, а когда он терпит неудачу, он не потребляет вход. Таким образом, цикл состоит в чтении цифры и повторном ее повторном просмотре.

Попробуйте изменить код следующим образом:

if (cin >> answer) {
  cout << answer << endl;
} else {
  cerr << "oops" << endl;
  break;
}