Во время чтения страниц с 360 по 362 я сильно запутался. Проще говоря, я понятия не имею, почему написанная им программа вообще работает так, как задумано. Он проверяет наличие метода Fail(), а затем — Bad(). Когда он НЕЯВНО проверяет наличие bad(), он использует оператор else и указывает это в комментарии рядом с else. Проблема в том, что это даже не должно работать (по крайней мере, я так считаю, а убеждения могут быть на 100% ошибочными, поэтому я и спрашиваю об этом). Используя else, он неявно проверяет наличие eof(), а не bad(). Это связано с тем, что ранее он заявлял, что когда установлен badbit, также устанавливается и FailBit, а это означает, что, проверяя на error(), он также проверяет и на bad(). Таким образом, else должен проверять только eof().
Другая проблема, с которой я столкнулся, заключалась в следующем. На тех же страницах, КАЖЕТСЯ, всплывает еще одна ошибка. Он пишет две функции: Skip_to_int() и get_int(). Цикл в get_int() довольно прост: он работает вечно и пытается «упорно» получить целое число. Если оператор терпит неудачу, мы выводим сообщение и вызываем jump_to_int(). Эта функция проверяет наличие методаfail() и, если да, удаляет все нецифровые символы, которые она может найти, в надежде найти целое число, которое get_int() сможет восстановить на следующей итерации цикла. Проблема в том, что при попытке заставить программу работать она работает не так, как задумано. Я отлаживаю его, ввожу управляющий символ EOF (Ctrl+Z), и он просто печатает сообщение «Извините...». Разве я не должен вместо этого получить исключение? В конце концов, я ввожу сигнал EOF, который должен немедленно привести к тому, что оператор не сможет покинуть istream с состоянием eof(). Но у меня нет такого исключения. Я могу просто ввести другое целое число. Кроме того, если сначала тестируется метод Fail(), то, если поток плохой(), код Skip_to_int() не должен достигать функции error(). Но он настаивает на том, что это так.
Вот код из книги для этих двух задач:
Первая задача:
Код: Выделить всё
int n = 0;
while (true)
{
cin >> n;
if (cin) {
if (1 ch; )
{
if (isdigit(ch) || ch == '-')
{
cin.unget();
return;
}
}
}
error("no input"); //eof or bad: give up
}
int get_int()
{
int n = 0;
while (true)
{
if (cin >> n) return n;
cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79356328/programming-principles-and-practice-using-c-second-edition-confusion-about-s[/url]