В этом бесконечном l oop, который завершается, когда вводится 0, когда вводится что-либо вне диапазона int, программа ведет себя неправильно. - PullRequest
0 голосов
/ 19 июня 2020

В этом бесконечном l oop, который завершается, когда вводится 0, когда я ввожу что-либо за пределами диапазона int, скажем 2147483648 (диапазон int + 1), эта программа продолжает работать бесконечно.

 #include<iostream>
    using namespace std;
    int main(){
     int n;
     while(1){

           cout<<"enter n: ";
           cin>>n;
           if(n==0)   break;

    }

    return 0;
    }

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Из документации по std :: basic_istream :: operator >> :

Если извлечение не удалось (например, если была введена буква, где ожидается di git ), значение остается неизменным и устанавливается бит отказа. [до C ++ 11]

Таким образом, поведение, которое вы видите, вызвано ошибкой, из-за которой последующие вызовы оператора >> немедленно прекращаются.

Интересно, поведение было изменено для C ++ 11 и более поздних версий:

Если извлечение завершается неудачно, в значение записывается ноль и устанавливается бит отказа. Если извлечение приводит к тому, что значение слишком велико или слишком мало для размещения в значении, записывается std :: numeric_limits :: max () или std :: numeric_limits :: min () и устанавливается флаг failbit. [Начиная с C ++ 11]

2 голосов
/ 19 июня 2020

Так как вы не проверяете ошибки, неудивительно, что ваш код работает некорректно.

Попробуйте это

while(1){

       cout<<"enter n: ";
       cin>>n;
       if (!cin || n==0)   break;

}

!cin - это проверка, если cin находится в состояние ошибки . Это может произойти (например), если последний ввод не удался, потому что введенное не может быть преобразовано в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...