Что значит бесконечный цикл

Бесконечный цикл в программировании – цикл, написанный таким образом, что условие выхода из него никогда не выполняется. О программе, вошедшей в бесконечный цикл, иногда говорят, что она зациклилась[1].
Представление о бесконечном цикле играет важную роль в понятии о тьюринг-полноте языков программирования: с одной стороны, любой цикл можно представить как бесконечный цикл, в теле которого есть проверка условия выхода и команда выхода из цикла, с другой – любая программа может быть написана при помощи:
- бесконечных циклов,
- команд выхода из цикла,
- операторов ветвления (if-then),
- последовательности команд, исполняемых одна после другой.
Примеры[править | править код]
Бесконечный цикл на языке Паскаль:
//Вариант 1 while true do begin {что-нибудь делаем} if {условие выхода из бесконечного цикла} then break end; //Вариант 2 repeat {что-нибудь делаем} until false;
Для си-подобных языков:
//вариант 1 for (;;) { /* что-нибудь делаем */ } // вариант 2 while(true) { /* что-нибудь делаем */ }
Язык Ада (а также ряд его потомков) имеют специальную конструкцию, описывающую бесконечный цикл:
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;
Практика[править | править код]
Программы, из которых нет выхода (например, операционные системы, прошивки микроконтроллеров), обычно представляют собой бесконечный цикл.
В написании программ, решающих реальные задачи пользователей, бесконечные циклы, как правило, являются одним из источников неустойчивой работы программы. Между тем, при написании алгоритмических программ, то есть программ, решающих определённые задачи прикладной информатики и не имеющих прямого отношения к практическим (или скорее теоретическим) задачам, использование бесконечных циклов – это очень хороший профессиональный приём.
Так, например, при решении задач на олимпиадах по информатике (программированию) различных уровней основная задача участника – за отведённое время написать программы, решающие предложенные алгоритмические задачи. Как правило, такие задачи решаются с использованием циклов. Очевидно, что времени на обдумывание условия выхода из цикла (которое должно указываться в так называемом while-цикле) у участника недостаточно. Поэтому очень полезным приёмом является использование модифицированных бесконечных циклов.
Приём этот основан на том факте, что каждый современный язык программирования предлагает ряд операторов, позволяющих прервать выполнение тела цикла не после очередной итерации, а во время очередного выполнения (например, Break в Delphi, EXIT FOR в Бейсике и т. д.). Для экономии времени участник олимпиады пишет бесконечный цикл while с условием выполнения True (while True do …), а затем по мере необходимости в теле цикла записывает операторы проверки условий, которые в случае необходимости прерывают выполнение цикла Break-подобными операторами.
Иногда (например, в скриптах управления персонажами компьютерных игр) выход из программы – это остановка интерпретатора. Так что разработчик не должен явно записывать условие выхода – а значит, программа превращается в бесконечный цикл. Такой принцип принят, например, в Game Maker, в некоторых играх для программистов.
Примечания[править | править код]
- ↑ Использование этого глагола вышло далеко за пределы программирования, и он зачастую применяется по отношению к субъектам в смысле характеристики некорректного поведения.
Источник
В программировании бесконечным циклом называется цикл, написанный таким образом, что условие выхода из него никогда не выполняется.
О программе, вошедшей в бесконечный цикл, иногда говорят, что она зациклилась. Использование этого глагола вышло далеко за пределы программирования, и он зачастую применяется с совершенно другим смыслом.
Среди пользователей различных поколений сверхскоростных компьютеров ходит стандартная шутка: «Крей-3 настолько быстр, что выполняет бесконечный цикл менее, чем за 2 секунды».
Роль бесконечных циклов в Тьюринг-полноте языков
Любой цикл можно представить как бесконечный цикл, в теле которого есть проверка условия выхода и команда выхода из цикла.
Любая программа может быть написана при помощи:
- бесконечных циклов;
- команд выхода из цикла;
- операторов ветвления (if-then);
- последовательностью команд, исполняемых одна после другой;
Примечание: обратите внимание, что универсальный оператор GOTO (безусловный переход) не нужен, а достаточно специального оператора выхода из цикла, при этом, в случае n вложенных циклов потребуется n специальных операторов выхода из цикла (кроме небольшого количества языков с расширенным синтаксисом операторов выхода) или один оператор GOTO и одна метка.
Примеры
Pascal
//Вариант 1 while true do begin {что-нибудь делаем} end; //Вариант 2 repeat {что-нибудь делаем} until false;
Для Си-подобных языков
//вариант 1 for (;;) { /* что-нибудь делаем */ } // вариант 2.1 while(true) { /* что-нибудь делаем */ } // вариант 2.2 while(1) { /* что-нибудь делаем */ } // вариант 3.1 do { /* что-нибудь делаем */ } while(true) // вариант 3.2 do { /* что-нибудь делаем */ } while(1)
Python
while True: # что-нибудь делаем
Пакетный файл MS-DOS
:loop rem что-нибудь делаем goto loop
Bash
while true do # что-нибудь делаем done
Ruby
Язык содержит специальную конструкцию бесконечного цикла:
loop { # что-нибудь делаем }
Ада
Ада также имеет специальную конструкцию, описывающую бесконечный цикл:
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
Практика
В написании программ, решающих реальные задачи пользователей, бесконечные циклы, как правило, являются одним из источников неустойчивой работы программы. Между тем, при написании алгоритмических программ, то есть программ, решающих определённые задачи прикладной информатики и не имеющих прямого отношения к практическим (или скорее теоретическим) задачам, использование бесконечных циклов – это очень хороший профессиональный приём.
Так, например, при решении задач на олимпиадах по информатике (программированию) различных уровней основная задача участника – за отведённое время написать программы, решающие предложенные алгоритмические задачи. Как правило, такие задачи решаются с использованием циклов. Очевидно, что времени на обдумывание условия выхода из цикла (которое должно указываться в так называемом while-цикле) у участника недостаточно. Поэтому очень полезным приёмом является использование модифицированных бесконечных циклов.
Приём этот основан на том факте, что каждый современный язык программирования предлагает ряд операторов, позволяющих прервать выполнение тела цикла не после очередной итерации, а во время очередного выполнения (например, Break в Delphi, EXIT FOR в Бейсике и т. д.). Для экономии времени участник олимпиады пишет бесконечный цикл while с условием выполнения True (while True do …), а затем по мере необходимости в теле цикла записывает операторы проверки условий, которые в случае необходимости прерывают выполнение цикла Break-подобными операторами.
В C++ цикл прохода по некоему набору элементов с использованием абстрактного класса (итератора) выглядит так:
Element* el; SomeIterator it(); for (el=it.get(); el!=NULL; el=it.get()) { … }
В некоторых диалектах Паскаля этот же цикл (с сохранением возможности использовать оператор continue, то есть, без el:=it.Get; в конце цикла) выглядит так:
it := SomeIterator.Create; repeat el := it.Get; if el=nil then break; … until false;
Программы, из которых нет выхода (например, операционные системы, прошивки микроконтроллеров), также обычно представляют собой бесконечный цикл.
Иногда (например, в скриптах управления персонажами компьютерных игр) выход из программы – это остановка интерпретатора. Так что разработчик не должен явно записывать условие выхода – а значит, программа превращается в бесконечный цикл. Такой принцип принят, например, в Game Maker, в некоторых играх для программистов.
Источник
Как можно понять из названия, бесконечный цикл – это цикл, написанный таким образом, что он никогда не прекратит своё выполнение, так как никогда не выполнится условие выхода из этого цикла.
В целом, бесконечные циклы считаются плохим тоном и почти всегда являются следствием неправильно написанной программы. Однако случаются моменты, когда такие циклы бывают довольно полезны. Например, если, необходимо, чтобы программа не закрывалась или чтобы из неё не было выхода. Операционные системы и некоторые программы микроконтроллеров зачастую также представляют собой бесконечные циклы.
В большинстве языках программирования создать бесконечные циклы можно тремя способами – при помощи циклов for, while и do…while. Мы разберём бесконечные циклы для языка C#, однако посмотрев на реализацию, очень просто спроецировать код на любой другой язык программирования. Также внизу статьи будут листинги бесконечных циклов на языках C, Java и С++.
Как можно заметить, для рядового программиста бесконечные циклы могут пригодиться довольно редко, но это не повод обходить данную тему стороной и не знать, как реализовать такой приём. Так что давайте для примера сделаем программу, которая выводила бы цифры от 1 до бесконечности.
Бесконечный цикл for на С#
Создать бесконечный цикл крайне просто. Например для того, чтобы сделать бесконечным цикл for, необходимо просто оставить пустые поля в скобках при нём: for ( ; ; ).
Давайте посмотрим, как это выглядит в программе. Для начала мы объявим и инициализируем переменную i нулем. С неё будет вестись отсчёт чисел. Затем идёт цикл for без условий в скобках. Внутри цикла мы сделаем инкремент переменной i, иными словами – прибавим к переменной единицу. Ну и, наконец, так же в цикле будем выводить значение переменной i в консоль.
namespace infinite_loop { class Program { ic void Main(string[] args) { int i = 0; for (; ; ) { i++; Console.WriteLine(i); } } } } |
Итого у нас получается следующий процесс выполнения программы: инициализация i=0, вход в цикл for, проверка условий for, отсутствие в цикле условий, переход к операциям внутри цикла – прибавка к i единицы (i становится равно 1), вывод i в консоль, возвращение к проверке условий for, отсутствие в цикле условий, снова прибавка к i единицы (i становится равно 2), вывод i в консоль, возвращение к проверке условий for, отсутствие в цикле условий и так далее до бесконечности.
Результат работы программы представлен на скриншоте ниже:
За несколько секунд цикл досчитал уже до 180 000, и будет продолжать работать дальше.Из-за отсутствия условий программа не сможет определить, когда необходимо прекратить свою работу. Остановить цикл мы сможем лишь принудительно закрыв программу.
Бесконечный цикл while на С#
Сделать бесконечный цикл while также легко, как и for. У данного цикла будет иметься условие, в отличие от цикла for, однако это условие никогда не измениться и из-за этого цикл никогда не прекратит свою работу.
namespace infinite_loop { class Program { ic void Main(string[] args) { int i = 0; while (true) { i++; Console.WriteLine(i); } } } } |
Как мы видим, отличие этой программы от предыдущей имеется лишь в строке 8, где объявляется цикл while и ему присваивается значение true (также можно вместо «true» написать «1», так как для компьютера эти понятия эквивалентны). Цикл будет работать до тех пор, пока это значение не изменится на false (или «0»). Но так как в коде мы нигде больше не меняем это значение, программа продолжает работать бесконечно.
Результат работы программы такой же, как и у предыдущей.
Бесконечный цикл do…while на С#
Цикл do-while обязательно один раз будет выполнен (потому что он с постусловием). После первой итерации выполняется проверка условия выхода из цикла, затем цикл повторно выполняет блок операторов, пока условное выражение в while не примет значение false (но в нашем случае этого не будет). Исполнение программы с данным циклом идентично исполнению программы, описанной выше:
namespace infinite_loop { class Program { ic void Main(string[] args) { int i = 0; do { i++; Console.WriteLine(i); } while (true); } } } |
Так как мы нигде не меняем условие при while на значение «false», программа будет продолжать работу бесконечно, пока мы не закроем её принудительно, либо пока переменная не достигнет числа 2 147 483 647, так как целочисленный тип данных int вмещает в себя не больше указанного числа (в данном случае в программе возникнет ошибка).
Бесконечный цикл и оператор break на С#
Несмотря на то, что в бесконечном цикле никогда не выполняется условие выхода из него, можно произвести его остановку, например, при помощи оператора break. Используя данный оператор, можно вызвать немедленное прерывание цикла, даже если условие цикла ещё не было выполнено.
Простой пример, демонстрирующий это:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | namespace infinite_loop { class Program { ic void Main(string[] args) { int i = 0; for (; ; ) { i++; Console.WriteLine(i); if (i==12345) break; } Console.ReadLine(); } } } |
Как вы видите, мы взяли бесконечный цикл for и добавили в него условный оператор if и оператор break (строка 12). Таким образом мы дали команду, что, если переменная i будет равняться 12 345, необходимо будет выполнить выход из цикла, несмотря на то, что цикл может продолжать работу, так как условия выхода в нём не были выполнены.
Если запустить программу. то результат будет следующим:
Больше в консоль ничего не записывалось. После того, как переменная i достигнет своего значения в 12 345, вызывается оператор break, обеспечивающий принудительный выход из цикла.
Таким образом можно контролировать бесконечный цикл и прерывать его в необходимых местах или при достижении необходимых целей.
Спасибо за внимание! Скачать все описанные выше рабочие листинги вы можете по следующей ссылке:
Скачать исходник
Ниже будут представлены листинги бесконечных циклов на языках C, Java и С++
Язык C
Бесконечный цикл for на С
int _tmain(int argc, _TCHAR* argv[]) { int i = 0; for (;;){ i++; f(“%i”,i); } return 0; } |
Бесконечный цикл while на С
int _tmain(int argc, _TCHAR* argv[]) { int i = 0; while (true){ i++; f(“%i”,i); } return 0; } |
Бесконечный цикл do…while на С
int _tmain(int argc, _TCHAR* argv[]) { int i = 0; do { i++; f(“%i”,i); } while (true); return 0; } |
Язык Java
Бесконечный цикл for на Java
public ic void main (String[] args) throws java.lang.Exception { int i=0; for(;;) { i++; System.out.ln(i); } } |
Бесконечный цикл while на Java
public ic void main (String[] args) throws java.lang.Exception { int i=0; while (true) { i++; System.out.ln(i); } } |
Бесконечный цикл do…while на Java
public ic void main (String[] args) throws java.lang.Exception { int i=0; do { i++; System.out.ln(i); } while (true); } |
Язык C++
Бесконечный цикл for на С++
int main() { int i = 0; for (;;){ i++; cout << i; } return 0; } |
Бесконечный цикл while на С++
int main() { int i = 0; while (true){ i++; cout << i; } return 0; } |
Бесконечный цикл do…while на C++
int main() { int i = 0; do { i++; cout << i; } while (true); return 0; } |
Источник
В программировании бесконечным циклом называется цикл, написанный таким образом, что условие выхода из него никогда не выполняется.
О программе, вошедшей в бесконечный цикл, иногда говорят, что она зациклилась. Использование этого глагола вышло далеко за пределы программирования, и он зачастую применяется с совершенно другим смыслом.
Среди пользователей различных поколений сверхскоростных компьютеров ходит стандартная шутка: «Крей-3 настолько быстр, что выполняет бесконечный цикл менее, чем за 2 секунды».
Роль бесконечных циклов в Тьюринг-полноте языков
Любой цикл можно представить как бесконечный цикл, в теле которого есть проверка условия выхода и команда выхода из цикла.
Любая программа может быть написана при помощи:
- бесконечных циклов;
- команд выхода из цикла;
- операторов ветвления (if-then);
- последовательностью команд, исполняемых одна после другой;
Примечание: обратите внимание, что оператор GOTO (безусловный переход) не нужен, а достаточно просто выхода из цикла.
Примеры
Для Си-подобных языков
Оператор цикла for
for (;;) { /* что-нибудь делаем */ }
Оператор цикла while
// вариант 1 while(true) { /* что-нибудь делаем */ } // вариант 2 while(1) { /* что-нибудь делаем */ }
Оператор цикла do-while
// вариант 1 do { /* что-нибудь делаем */ } while(true) // вариант 2 do { /* что-нибудь делаем */ } while(1)
Python
Ruby
Язык содержит специальную конструкцию бесконечного цикла:
loop { # что-нибудь делаем }
Пакетный файл MS-DOS
:loop rem что-нибудь делаем goto loop
Bash
while true do # что-нибудь делаем done
Практика
В написании программ, решающих реальные задачи пользователей, бесконечные циклы, как правило, являются одним из источников неустойчивой работы программы. Между тем, при написании алгоритмических программ, то есть программ, решающих определённые задачи прикладной информатики и не имеющих прямого отношения к практическим (или скорее теоретическим) задачам, использование бесконечных циклов – это очень хороший профессиональный приём.
Так, например, при решении задач на олимпиадах по информатике (программированию) различных уровней основная задача участника – за отведённое время написать программы, решающие предложенные алгоритмические задачи. Как правило, такие задачи решаются с использованием циклов. Очевидно, что времени на обдумывание условия выхода из цикла (которое должно указываться в так называемом while-цикле) у участника недостаточно. Поэтому очень полезным приёмом является использование модифицированных бесконечных циклов.
Приём этот основан на том факте, что каждый современный язык программирования предлагает ряд операторов, позволяющих прервать выполнение тела цикла не после очередной итерации, а во время очередного выполнения (например, Break в Delphi, EXIT FOR в Бейсике и т. д.). Для экономии времени участник олимпиады пишет бесконечный цикл while с условием выполнения True (while True do …), а затем по мере необходимости в теле цикла записывает операторы проверки условий, которые в случае необходимости прерывают выполнение цикла Break-подобными операторами.
Также такого рода циклы позволяют решать врождённый недостаток языка Паскаль – недостаточную мощность оператора for. Например, в Си цикл прохода по некоему набору элементов с использованием абстрактного класса (итератора) выглядит как
Element* el; SomeIterator it(); for (el=it.get(); el!=NULL; el=it.get()) { … }
Пожалуй, единственный способ реализовать такое же в Паскале (с сохранением возможности использовать оператор continue, то есть, без el:=it.Get; в конце цикла) таков.
it := SomeIterator.Create; repeat el := it.Get; if el=nil then break; … until false;
Программы, из которых нет выхода (например, операционные системы, прошивки микроконтроллеров), также обычно представляют собой бесконечный цикл. Например:
//Инициализация МК, первоначальная настройка регистров while(1){ //Основной цикл программы };
Иногда (например, в скриптах управления персонажами компьютерных игр) выход из программы – это остановка интерпретатора. Так что разработчик не должен явно записывать условие выхода – а значит, программа превращается в бесконечный цикл. Такой принцип принят, например, в Game Maker, в некоторых играх для программистов.
Источник