Если логическое выражение в цикле while будет всегда истинным, то работа такого цикла не завершится никогда. Такая ситуация называется зацикливанием.
Простейший способ создать такую ситуацию:
while true do begin writeln(‘У попа была собака, он ее любил.’); writeln(‘Она съела кусок мяса — он ее убил.’); writeln(‘Вырыл ямку, закопал и на камне написал:’); end;
Аналогично с repeat‘ом, только условие будет условием выхода из цикла и соответственно должно быть равно false.
Чаще, однако, такие ситуации возникают по ошибке. Для примера рассмотрим печать чисел от 1 до 10:
i:=1; repeat writeln(i); //i:=i+1; — Представьте, что вы забыли написать эту строку until i>10;
Если вы забудете строку с увеличением счетчика, то i никогда не станет больше 10. Это настолько распространенная ошибка, что рекомендуется первым делом писать увеличение счетчика, а только потом возвращаться назад и писать все остальные операторы в теле цикла.
Источник: www.tvd-home.ru
Зацикливание программы в действии! ЧПУ Okuma.
Бесконечный цикл
В компьютерном программировании — бесконечный цикл (или бесконечный цикл ) — это последовательность инструкций, которая, как написано, будет продолжаться бесконечно, если не произойдет внешнее вмешательство («вытащить вилку»). Это может быть намеренно.
how_many = 0, а is_there_more_data () do how_many = how_many + 1 end display «количество подсчитанных элементов /w/Computer_program»>компьютерной программе, которая повторяется бесконечно, либо из-за того, что цикл не имеет условия завершения, имеющий тот, который никогда не может быть выполнен, или тот, который заставляет цикл начинаться заново. В более старых операционных системах с совместной многозадачностью бесконечные циклы обычно приводили к тому, что вся система перестала отвечать. При распространенной в настоящее время модели вытесняющей многозадачности бесконечные циклы обычно заставляют программу использовать все доступное процессорное время, но обычно могут быть прерваны пользователем. Циклы ожидания при занятости также иногда называют «бесконечными циклами». Бесконечные циклы — одна из возможных причин «зависания » компьютера; другие включают перебивание, тупик и нарушения доступа.
Преднамеренное и непреднамеренное зацикливание
Цикл — это повторение набора инструкций до тех пор, пока не будет выполнено определенное условие. Бесконечный цикл возникает, когда условие никогда не будет выполнено из-за некоторой внутренней характеристики цикла.
Преднамеренное зацикливание
Есть несколько ситуаций, когда это желаемое поведение. Например, игры на игровых консолях на основе картриджей обычно не имеют условия выхода в их основном цикле, так как нет операционной системы, из которой программа могла бы выйти; цикл выполняется до тех пор, пока консоль не будет выключена.
Современные интерактивные компьютеры требуют, чтобы компьютер постоянно отслеживал ввод данных пользователем или активность устройства, поэтому на каком-то фундаментальном уровне существует бесконечная обработка цикл ожидания, который должен продолжаться, пока устройство не будет выключено. или сбросить. В Навигационном компьютере Apollo, например, этот внешний цикл содержался в программе Exec, и если бы у компьютера не было абсолютно никакой другой работы, он бы запустил фиктивное задание, которое просто отключило бы » активность компьютера ».
Python с нуля. Урок 4 | Циклы (for, while)
Современные компьютеры также обычно не останавливают тактовую частоту процессора или материнской платы при выходе из строя. Вместо этого они возвращаются к состоянию ошибки, отображая сообщения для оператора, и входят в бесконечный цикл, ожидая, пока пользователь либо ответит на запрос о продолжении, либо сбросит устройство.
Многопоточность
В многопоточных программах некоторые потоки могут выполняться внутри бесконечных циклов, не вызывая застревания всей программы в бесконечном цикле. Если основной поток завершает работу, все потоки процесса принудительно останавливаются, поэтому все выполнение завершается, а процесс / программа завершается. Потоки внутри бесконечных циклов могут выполнять «служебные» задачи или они могут находиться в заблокированном состоянии, ожидая ввода (из сокета / очереди) и возобновлять выполнение каждый раз, когда вводится.
Непреднамеренное зацикливание
Чаще всего этот термин используется для тех ситуаций, когда это не является предполагаемым результатом; то есть, когда это ошибка . Такие ошибки чаще всего встречаются среди начинающих программистов, но могут быть сделаны и опытными программистами, потому что их причины могут быть довольно тонкими.
Одна из распространенных причин, например, заключается в том, что программист намеревается перебрать последовательность узлов в структуре данных, например в связанном списке или дереве., выполняя код цикла один раз для каждого узла. Неправильно сформированные связи могут создать ссылочный цикл в структуре данных, где один узел связывается с другим, возникающим раньше в последовательности. Это превращает часть структуры данных в кольцо кольцо, вызывая бесконечный цикл наивного кода.
Хотя большинство бесконечных циклов можно обнаружить при внимательном изучении кода, не существует общего метода определения того, остановится ли данная программа когда-либо или будет работать вечно; это неразрешимость проблемы остановки.
Прерывание
Пока система реагирует, бесконечные циклы часто могут быть прерваны путем отправки сигнала процессу (например, как SIGINT в Unix) или прерывание процессора, вызывающее прерывание текущего процесса. Это можно сделать в диспетчере задач, в терминале с помощью команды Control-C или с помощью команды kill или системного вызова. Однако это не всегда работает, так как процесс может не отвечать на сигналы или процессор может находиться в непрерывном состоянии, например, в Cyrix coma bug (вызвано перекрытием непрерываемых инструкций в конвейер команд ). В некоторых случаях могут работать другие сигналы, такие как SIGKILL, поскольку они не требуют, чтобы процесс реагировал, в то время как в других случаях цикл не может быть прерван до завершения работы системы.
Поддержка языка
Бесконечные циклы могут быть реализованы с использованием различных конструкций потока управления. Чаще всего в неструктурированном программировании это возврат назад (goto ), в то время как в структурированном программировании это неопределенный цикл (цикл while), который никогда не заканчивается, либо путем исключения условия, либо путем явной установки для него значения true, as while (true). .
В некоторых языках есть специальные конструкции для бесконечных циклов, обычно путем исключения условия из неопределенного цикла. Примеры включают Ada (цикл. конец цикла), Fortran (DO. END DO), Go (для ), и Ruby (цикл do. end).
Примеры намеренных бесконечных циклов
Простой пример (в C ):
1 #include 2 3 int main () 4 9 return 0; 10>
Форма for (;;) для бесконечного цикла является традиционной, появляется в стандартном справочнике The C Programming Language и часто произносится как «навсегда».
Это цикл, который будет печатать «Бесконечный цикл» без остановки.
Аналогичный пример из 1980-х годов BASIC :
10 PRINT «INFINITE LOOP» 20 GOTO 10
Аналогичный пример в пакетных файлах DOS :
: A echo Infinite Loop goto: A
Здесь цикл довольно очевиден, поскольку последняя строка безоговорочно отправляет выполнение обратно первой.
while (true) System.out.println («Бесконечный цикл»);
для ((;;)); do echo «Infinite Loop» done
Примеры непреднамеренных бесконечных циклов
Математические ошибки
Вот один пример бесконечного цикла в Visual Basic :
dim x as integer do while x < 5 x = 1 x = x + 1 loop
Это создает ситуацию, когда x никогда не будет больше 5, поскольку в начале кода цикла x дается значение 1, таким образом, цикл всегда будет заканчиваться на 2, и цикл никогда не прерывается. Это можно исправить, переместив инструкцию x = 1 за пределы цикла. По сути, этот бесконечный цикл дает компьютеру команду продолжать прибавлять 1 к 1, пока не будет достигнуто 5. Поскольку 1 + 1 всегда равно 2, этого никогда не произойдет.
В некоторых языках путаница программиста с математическими символами может привести к непреднамеренному бесконечному циклу. Например, вот фрагмент в C :
#include int main (void) return 0; >
Ожидаемый результат — это числа от 0 до 9 с вставленным «a равно 5!» между 5 и 6. Однако в строке « if (a = 5) » выше, программист перепутал оператор = (присваивание) с оператором == (проверка равенства). Вместо этого он присвоит значение 5 параметру a в этой точке программы. Таким образом, никогда не сможет перейти к 10, и этот цикл не может завершиться.
Ошибки округления
Вывод C на процессоре AMD Turion : |
x = 0,10000000149011611938 |
x = 0,20000000298023223877 |
x = 0,30000001192092895508 |
x = 0,40000000596046447754 |
x = 0,50000000000000000000 |
x = 0,60000002384185791016 |
x = 0,700000047683715820430000 x = 0,60000002384185791016 |
x = 0,7000000476837158205700281>x = 1.00000011920928955078 |
x = 1.10000014305114746094 |
x = 1.20000016689300537109 |
. |
Неожиданное поведение при оценке условия завершения также может вызвать эту проблему. Вот пример mple in C :
с плавающей запятой x = 0,1; в то время как (x! = 1.1)
В некоторых системах этот цикл будет выполняться десять раз, как ожидалось, но в других системах он никогда не завершится. Проблема в том, что условие завершения цикла (x! = 1.1)проверяет точное равенство двух значений с плавающей запятой, и способ представления значений с плавающей запятой на многих компьютерах сделает это тест не пройден, потому что они не могут точно представить значение 0,1, что приводит к ошибкам округления при каждом приращении (см. рамку).
То же самое может произойти в Python :
x = 0,1, а x! = 1: print (x) x + = 0,1
Из-за вероятности проверки на равенство или неравенство В случае непредвиденного сбоя, безопаснее использовать тесты «больше или меньше» при работе со значениями с плавающей запятой.
Например, вместо проверки, равно ли x 1,1, можно проверить, (x i в конечном итоге достигнет максимальное значение, сохраняемое в unsigned int , и добавление 1 к этому числу приведет к переходу в 0, разорвав цикл. Фактический предел i зависит от деталей системы и используемого компилятора. При использовании арифметики произвольной точности этот цикл будет продолжаться до тех пор, пока компьютерная память не перестанет хранить i . Если i было целым числом со знаком, а не целым числом без знака, переполнение было бы неопределенным. В этом случае компилятор может оптимизировать код до бесконечного цикла.
Бесконечная рекурсия
Бесконечная рекурсия — это особый случай бесконечного цикла, вызванного рекурсией.
Следующий пример в VBA возвращает ошибка переполнения стека :
Sub Test1 () Call Test1 End Sub
Оператор Break
Цикл « while (true) » на первый взгляд выглядит бесконечным, но может быть способ выйти из цикла с помощью оператора break или оператора return. Пример в PHP :
while (true) bar ()) >
Цикл Алдерсона
Цикл Алдерсона — это редкий жаргонный или жаргонный термин для бесконечного цикла, в котором есть условие выхода, доступное, но недоступное в текущей реализации кода, обычно из-за ошибки программиста. Они наиболее распространены и видны при отладке кода пользовательского интерфейса.
Пример C-подобного псевдокода цикла Алдерсона, в котором программа должна суммировать числа, заданные пользователем, до тех пор, пока не будет получен ноль, но где программист использовал неправильный оператор:
sum = 0 ; while (true) if (sum>100) >
Термин якобы получил свое имя от программиста (фамилия Алдерсон), который в 1996 году создал диалоговое окно modal в Microsoft Access без кнопки «ОК» или «Отмена», что приводит к отключению всей программы при появлении этого окна.
См. Также
- Портал математики
- Обнаружение цикла
- Тупик
- Дивергенция (информатика)
- Вилочная бомба (бесконечный цикл — один из двух ключевых компонентов)
- Перейти
- Рекурсия (информатика)
Внешние ссылки
- Сделайте бесконечный цикл на нескольких языках на programming-idioms.org.
Ссылки
- ^«Определение словаря бесконечного цикла».
- ^«Что такое бесконечный цикл (бесконечный цикл)».
- ^Дениз Карузо (16 августа 1999 г.). «Перегрузка вешалок создает ухабистую дорогу для интернет-акций». The New York Times.
- ^«Кодексы и способы: характер документальной культуры». Журнал Flow. Ноябрь 2014 года. бесконечный цикл — это цикл, в котором отсутствует. условие выхода
- ^, также известное как невытесняющая многозадачность: «Бесперебойная многозадачность». PC Magazine. Проверено 15 августа 2015 г.
- ^Дэвид Хоаг (сентябрь 1976 г.). «История бортового наведения, навигации и управления Apollo» (PDF). Лаборатория Чарльза Старка Дрейпера.
- ^»Ответы на кроссворды New York Times». 13 октября 2013 г. вычисление.. дефект.. который.. замыкает
- ^«Проблема остановки в теории вычислений».
- ^«Использование переполнения буфера против программного обеспечения DameWare Remote Control». 19 декабря 2003 г. Как только командная оболочка закрывается комбинацией control-c.
- ^Программирование на Ada: Control: Endless Loop
- ^«Бесконечный цикл в C / C ++». Архивировано из оригинала 03.08.2016.
- ^Ли Дом (24 мая 2013 г.). «Петля Олдерсона».
- ^»Петля Олдерсона». Файл жаргона, версия 4.4.7. Архивировано из оригинала 15 мая 2006 г. Проверено 21 мая 2006 г.
Источник: alphapedia.ru
Зацикливание
При использовании условных операторов цикла программиста подстерегает одна опасность. Как показывает практика, достаточно легко сделать ошибку и неверно задать условие окончания цикла, которое всегда будет истинным, — при этом тело цикла станет выполняться бесконечно. Подобная ситуация называется зацикливанием.
Так как исходное значение переменной а меньше, чем значение переменной b, и это значение будет только уменьшаться, то подобный цикл никогда не закончится.
В некоторых случаях программисты специально применяют подобный трюк, чтобы организовать бесконечный цикл, в котором будут приниматься и обрабатываться внешние сообщения (события). Тогда использование условного оператора цикла может выглядеть так:
begin // тело цикла
Контроль за выходом из цикла при наступлении определенного события при этом полностью возлагается на программиста.
В Бейсике есть специальная форма оператора цикла, позволяющая явно описывать такие бесконечные циклы:
Исключения
Управление порядком выполнения программы может происходить не только с помощью условных операторов и операторов цикла, но и при возникновении исключений — ситуаций в программе или операционной системе, требующих немедленного реагирования. Например, при выполнении оператора присваивания и вычислении выражения произошло деление на ноль. Программа остановилась, так как не знает, что ей делать дальше, — ведь получено ошибочное значение. Чаще всего выполнение программы просто прекращается по ошибке, но современные системы разработки позволяют программисту явно контролировать возникновение самых разных исключений (они еще называются исключительными ситуациями, требующими немедленного вмешательства) и указывать, какие операторы следует выполнять при их возникновении.
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru