Нескінченний цикл

Нескінченний цикл — в програмуванні різновид циклу, записаний таким чином, що умова виходу з нього ніколи не виконується.

Про програму, що увійшла в нескінченний цикл, деколи говорять, що вона зациклилась. Використання цього дієслова вийшло далеко за межі програмування, і воно часто застосовується в зовсім іншому значенні.

Нескінченний цикл як абстрактна конструкція[ред. | ред. код]

Будь-який цикл, відповідно до Тюринг-повноти, можна виразити як нескінченний цикл, у тілі якого є перевірка умови виходу та команда виходу з циклу.

Будь-яка програма може бути написаною за допомогою:

  • нескінченних циклів;
  • команд виходу з циклу;
  • операторів розгалуження (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 

Ruby[ред. | ред. код]

Мова містить спеціальну конструкцію нескінченного циклу:

 loop {     # тіло циклу  } 

Ада[ред. | ред. код]

Ада також містить спеціальну конструкцію, що описує нескінченний цикл[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, в деяких іграх для програмістів.

Приклади[ред. | ред. код]

Див. також[ред. | ред. код]

Примітки[ред. | ред. код]