Нескінченний цикл
Нескінченний цикл — в програмуванні різновид циклу, записаний таким чином, що умова виходу з нього ніколи не виконується.
Про програму, що увійшла в нескінченний цикл, деколи говорять, що вона зациклилась. Використання цього дієслова вийшло далеко за межі програмування, і воно часто застосовується в зовсім іншому значенні.
Нескінченний цикл як абстрактна конструкція
Будь-який цикл, відповідно до Тюринг-повноти, можна виразити як нескінченний цикл, у тілі якого є перевірка умови виходу та команда виходу з циклу.
Будь-яка програма може бути написаною за допомогою:
- нескінченних циклів;
- команд виходу з циклу;
- операторів розгалуження (
if-then
); - послідовністю команд, виконуваних одна за іншою;
Примітка: зверніть увагу, що універсальний оператор GOTO (безумовний перехід) не потрібен, а достатньо спеціального оператора виходу з циклу, при цьому, у випадку n вкладених циклів буде потрібно n спеціальних операторів виходу з циклу (окрім невеликої кількості мов з розширеним синтаксисом операторів виходу) або один оператор GOTO і одна мітка.
Приклади
Pascal
while true do
begin
{ тіло циклу }
end;
//або
repeat
{ тіло циклу }
until false;
Для С-подібних мов[1]
for (;;) {
/* тіло циклу */
}
// або
while(true) {
/* тіло циклу */
}
// або
while(1) {
/* тіло циклу */
}
// або
do {
/* тіло циклу */
} while(true)
// або
do {
/* тіло циклу */
} while(1)
Python
while True:
# тіло циклу
Пакетний файл MS-DOS
:loop
rem тіло циклу
goto loop
Bash
while true
do
# тіло циклу
done
Ада
Ада також містить спеціальну конструкцію, що описує нескінченний цикл[2]:
loop
-- тіло циклу
end loop;
Окрім того, варто відмітити, що Ада дозволяє здійснити вихід одразу з декількох вкладених циклів, а також має умовну форму оператора виходу, що дозволяє уникнути використання оператора розгалуження.
Out_Cycle:
loop
...
loop
...
exit Out_Cycle when Logic_Exp;
-- рівносильно
if Logic_Exp then
exit Out_Cycle;
end if;
...
end loop;
...
end loop Out_Cycle;
--звідси продовжиться виконання програми
--після виконання інструкції exit Out_Cycle;
Lua
while true do
-- тіло циклу
end
Практика
В програмуванні нескінченні цикли є одним з джерел нестійкої роботи програми. Тим не менш їх широко використовують в практиці.
Їхнє використання відбувається завдяки тому, що майже кожна мова програмування надає конструкції, які дозволяють примусово перервати виконання циклу. Наприклад, Break
в Delphi, EXIT FOR
в BASIC тощо.
В житті часто роблять нескінченний цикл while
з умовою виконання True
(while True do ...
), й в подальшому за необхідність в тіло циклу додають умови, за яких зупиняють його виконання Break-подібними операторами.
В C++ цикл проходу по деякому набору елементів з використанням абстрактного класу (ітератора) виглядає так:
Element* el;
SomeIterator it();
for (el=it.get(); el!=NULL; el=it.get())
{
...
}
В деяких діалектах Pascal цей же цикл (із зберіганням можливості використовувати оператор continue
, тобто, без el:=it.Get;
в кінці циклу) виглядає так:
it := SomeIterator.Create;
repeat
el := it.Get;
if el=nil then break;
...
until false;
Програми, з яких немає виходу (наприклад операційні системи, прошивки мікроконтролерів), також зазвичай є нескінченними циклами. Для попередження неконтрольованого нескінченого циклу використовують сторожовий таймер.
В деяких випадках, наприклад, в скриптах керування персонажами комп'ютерних ігор, вихід з програми фактично означає її зупинку. Тому розробник не вказувати умову виходу, інтерпретатор ігрової програми працює в нескінченному циклі. Такий принцип прийнятий, наприклад, в Game Maker, в деяких іграх для програмістів.