Бесконечные циклы
Если условие цикла while никогда не становится ложным, цикл никогда не заканчивается. Это называется бесконечным циклом, и это одна из самых частых ошибок при работе с циклами. Здесь не хватает строки number++:
int number = 1;
while (number <= 5) {
printf("%d\n", number);
}Переменная number остаётся равной 1, условие number <= 5 всегда истинно, и программа выводит 1 снова и снова:
1
1
1
1
...На вашем компьютере такая программа работала бы, пока вы её не остановите. В этих упражнениях её останавливают через 5 секунд, и вы видите сообщение Программа работала слишком долго, поэтому её остановили. Нет ли в ней бесконечного цикла? Увидев его, проверьте каждый цикл: меняет ли что-нибудь в его блоке переменную из условия, чтобы в какой-то момент условие стало ложным?
Типичные причины:
- Ничто не меняет переменную, как в примере выше.
- Переменная меняется не в ту сторону. Обратный отсчёт
while (number >= 1)сnumber++вместоnumber--делаетnumberвсё больше и больше, так что условие остаётся истинным. - Изменение стоит вне блока. Повторяется только код между фигурными скобками. Если
number++оказался под закрывающей скобкой}, он выполнится только после цикла, а до этого дело никогда не дойдёт. - Точка с запятой после условия.
while (number <= 5);заканчивается точкой с запятой, и это всё, что повторяет цикл: пустую инструкцию, бесконечно. Блок в фигурных скобках под ним к циклу вообще не относится. Программа ничего не выводит и через 5 секунд её останавливают. Никогда не ставьте точку с запятой между)и{. - Условие не достигает цели. Условие с
!=(не равно) истинно для любого числа, кроме одного. Если переменная перескочит через это число, цикл будет работать бесконечно. Поэтому в циклах со счётчиком обычно используют<,<=,>или>=: они останавливаются, даже если переменная проскочила предел.
Иногда вместо сообщения о слишком долгой работе вы видите RuntimeError: unreachable. Вы знаете его по уроку о переменных: число стало слишком большим для int (больше 2147483647, примерно двух миллиардов). В бесконечном цикле так бывает в основном тогда, когда цикл только вычисляет и ничего не выводит. Тогда он работает очень быстро, и переменная растёт, пока не перестанет помещаться. Исправление то же самое: найдите цикл, который никогда не заканчивается.
Задание
- 1
Программа в редакторе должна вывести нечётные числа от 1 до 9, а затем
Готово. Запустите её: она не останавливается сама, и через 5 секунд её останавливают. Выясните, почему условие никогда не становится ложным, и исправьте его, чтобы программа вывела1,3,5,7,9иГотово, каждое на отдельной строке.