В большинстве языков программирования , цикл do while - это оператор потока управления, который выполняет блок кода хотя бы один раз, а затем либо повторно выполняет блок, либо прекращает его выполнение, в зависимости от заданного логического условия в конце блока. .
Конструкция do while состоит из символа процесса и условия. Сначала выполняется код внутри блока, а затем оценивается условие. Если условие истинно, код внутри блока выполняется снова. Это повторяется до тех пор, пока условие не станет ложным . Поскольку циклы do while проверяют условие после выполнения блока, структура управления часто также известна как цикл пост-тестирования . Контраст с циклом while, который проверяет условие перед выполнением кода в блоке, цикл do-while является циклом условия выхода. Это означает, что код всегда должен выполняться первым, а затем оценивается выражение или условие проверки. Если это правда, код снова выполняет тело цикла. Этот процесс повторяется до тех пор, пока выражение истинно. Если выражение ложно, цикл завершается, и управление передается оператору, следующему за циклом do-while. Другими словами, в то время как цикл while устанавливает истинность оператора в качестве прецедента условия для выполнения кода, цикл do-while обеспечивает продолжающееся выполнение действия, которое может быть отменено ложностью условия, которая является ложностью ( т. Е. Истинностью условия). отрицание условия) устанавливается как последующее условие .
Возможно, а в некоторых случаях желательно, чтобы условие всегда оценивалось как истинное, создавая бесконечный цикл . Когда такой цикл создается намеренно, обычно существует другая управляющая структура (например, оператор break ), которая позволяет завершить цикл.
Некоторые языки могут использовать другое соглашение об именах для этого типа цикла. Например, в языке Паскаль есть цикл « повторять до », который продолжается до тех пор, пока управляющее выражение не станет истинным (а затем завершится), тогда как цикл «пока» выполняется, пока управляющее выражение истинно (и завершается, когда выражение становится истинным). ложный).
Эквивалентные конструкции
делать { do_work (); } while ( условие );
эквивалентно
do_work ();while ( условие ) { do_work (); }
Таким образом, цикл do ... while сохраняет начальную "загрузку цикла" do_work();
в строке перед while
циклом.
Пока оператор continue не используется, приведенное выше технически эквивалентно следующему (хотя эти примеры не являются типичным или современным стилем, используемым в повседневных компьютерах):
в то время как ( правда ) { do_work (); если ( ! условие ) перерыв ; }
или же
LOOPSTART : do_work (); if ( условие ) goto LOOPSTART ;
Демонстрация цикла do while
Эти примеры программ вычисляют факториал 5, используя синтаксис соответствующих языков для цикла do-while.
ActionScript 3
var counter : int = 5 ; var factorial : int = 1 ;сделать { факториал * = счетчик -; / * Умножение, затем уменьшение. * / } while ( counter > 0 );след ( факториал );
Ада
с Ada.Integer_Text_IO ; Факториал процедуры - Counter : Integer : = 5 ; Факториал : Целое число : = 1 ; начало цикла Факториал : = Факториал * Счетчик ; Счетчик : = Счетчик - 1 ; выйти, когда Counter = 0 ; конец петли ; Ада . Целочисленный_текст_IO . Положите ( Факториал ); конец Факториал ;
БАЗОВЫЙ
Ранние BASIC (такие как GW-BASIC ) использовали синтаксис WHILE / WEND. Современные BASIC, такие как PowerBASIC, предоставляют структуры WHILE / WEND и DO / LOOP с синтаксисом, таким как DO WHILE / LOOP, DO UNTIL / LOOP, DO / LOOP WHILE, DO / LOOP UNTIL и DO / LOOP (без внешнего тестирования, но с условным EXIT LOOP где-нибудь внутри цикла). Типичный исходный код BASIC:
Dim factorial как целое число Dim counter as Integerфакториал = 1 счетчик = 5Do factorial = factorial * counter counter = counter - 1 Loop While counter > 0Напечатать факториал
C #
int counter = 5 ; int factorial = 1 ;сделать { факториал * = счетчик -; / * Умножение, затем уменьшение. * / } while ( counter > 0 );Система . Консоль . WriteLine ( факториал );
C
int counter = 5 ; int factorial = 1 ;сделать { факториал * = счетчик - ; / * Умножение, затем уменьшение. * / } while ( counter > 0 );printf ( "факториал 5 равен% d \ n " , факториал );
Операторы Do-while (0) также часто используются в макросах C как способ обернуть несколько операторов в обычный (в отличие от составного) оператор. Это делает точку с запятой необходимой после макроса, обеспечивая более функциональный вид для простых синтаксических анализаторов и программистов, а также избегая проблемы с областью видимости if
. Это рекомендовано правилом PRE10-C стандарта CERT C Coding Standard . [1]
C ++
int counter = 5 ; int factorial = 1 ;сделать { факториал * = счетчик - ; } while ( counter > 0 );std :: cout << "факториал 5 равен" << факториал << std :: endl ;
CFScript
факториал = 1 ; count = 10 ;делать { факториал * = счетчик - ; } while ( count > 1 );writeOutput ( факториал );
D
int counter = 5 ; int factorial = 1 ;сделать { факториал * = счетчик -; // Умножить, а затем уменьшить. } while ( counter > 0 );Writeln ( "факториал 5 есть" , факториал );
Фортран
В устаревшем FORTRAN 77 нет конструкции DO-WHILE, но того же эффекта можно добиться с помощью GOTO:
INTEGER CNT , FACT CNT = 5 FACT = 1 1 ПРОДОЛЖИТЬ FACT = FACT * CNT CNT = CNT - 1 IF ( CNT . GT . 0 ) GOTO 1 PRINT * , FACT END
В Fortran 90 и более поздних версиях также нет конструкции do-while, но есть конструкция цикла while, которая использует ключевые слова do while и, таким образом, фактически такая же, как цикл for . [2]
программа FactorialProg integer :: counter = 5 integer :: factorial = 1 факториал = факториал * счетчик счетчик = счетчик - 1 делать пока ( счетчик > 0 ) ! Значение истинности проверяется до цикла factorial = factorial * counter counter = counter - 1 end do print * , факториал конечной программы FactorialProg
Ява
int counter = 5 ; int factorial = 1 ;сделать { факториал * = счетчик - ; / * Умножение, затем уменьшение. * / } while ( counter > 0 );Система . из . println ( "Факториал 5 равен" + факториал );// ============================================ // // Следующая функция делает то же, что и выше. // // ============================================ //int counter = 5 ; int factorial = 1 ;в то время как ( счетчик > 0 ) { факториал * = счетчик - ; / * Умножение, затем уменьшение. * / }Система . из . println ( "Факториал 5 равен" + факториал );
JavaScript
пусть counter = 5 ; // Объявление двух переменных, счетчика и факториала let factorial = 1 ; сделать { факториал * = счетчик - ; // Что будет зацикливаться } while ( counter > 0 ); // Условия циклаконсоль . журнал ( факториал ); // Отображение результата
Котлин
var counter = 5 var factorial = 1 // Эта строка кода почти такая же, как и приведенные выше коды JavaScript, с той лишь разницей, что ключевое слово показывает результаты do { factorial * = counter - } while ( counter > 0 )println ( "Факториал 5 равен $ факториалу " )
Паскаль
У Паскаля нет do / while; вместо этого он имеет повторение / до. Как упоминалось во введении, можно считать, что повторение / до эквивалентно конструкции «код, а не выражение».
факториал : = 1 ; счетчик : = 5 ; повторять факториал : = факториал * счетчик ; counter : = counter - 1 ; // В Object Pascal можно использовать dec (counter); пока counter = 0 ;
PHP
$ counter = 5 ; $ факториал = 1 ;сделать { $ factorial * = $ counter - ; } while ( $ counter > 0 );echo $ factorial ;
PL / I
Оператор PL / I DO включает в себя функции цикла после тестирования ( do until ), цикла перед тестом ( do while ) и цикла for . Все функции могут быть включены в один оператор. В примере показан только синтаксис «делать до».
объявить счетчик фиксированным начальным (5);объявить факториал фиксированным начальным (1);делать до (counter <= 0); факториал = факториал * счетчик; counter = counter - 1;конец;положить (факториал);
Python
В Python отсутствует конкретная конструкция управления потоком выполнения. Однако эквивалент может быть построен из цикла while с разрывом.
счетчик = 5 факториал = 1while True : факториал * = счетчик счетчика - = 1 если counter == 0 : перерыв печать ( факториал )
Ракетка
В Racket, как и в других реализациях Scheme , популярным способом реализации циклов является «named-let»:
#lang racket ( определите счетчик 5 ) ( определите факториал 1 ) ( let loop () ( set! factorial ( * factorial counter )) ( set! counter ( sub1 counter )) ( when ( > counter 0 ) ( loop ))) ( displayln факториал )
Сравните это с первым примером примера цикла while для Racket. Имейте в виду, что именованный let также может принимать аргументы.
Racket и Scheme также обеспечивают правильный цикл выполнения.
( define ( factorial n ) ( do (( counter n ( - counter 1 )) ( result 1 ( * result counter ))) (( = counter 0 ) result ) ; Stop condition и return value .; Тело do- шлейф пуст. ))
Рубин
счетчик = 10 факториал = 2начало факториала * = счетчик счетчика - = 2 конец пока счетчик > 1ставит факториал
Болтовня
| счетчик факториал | счетчик : = 5 . факториал : = 1 .[ counter > 0 ] whileTrue: [ factorial : = factorial * counter . counter : = counter - 1 ] .Расшифровка шоу: factorial printString
Быстрый
Swift 2.x и новее: [5]
var counter = 5 var factorial = 1повторите { factorial * = counter counter - = 1 } пока counter > 0печать ( факториал )
Swift 1.x:
var counter = 5 var factorial = 1do { factorial * = counter counter - = 1 } while counter > 0println ( факториал )
Visual Basic .NET
Тусклый счетчик как целое число = 5 Тусклый факториал как целое число = 1У факторного * = счетчик счетчик - = 1 Loop Пока счетчик > 0Консоль . WriteLine ( факториал )
Смотрите также
- Поток управления
- Для цикла
- Для каждого
- Повторить цикл (значения)
- Пока цикл
Рекомендации
- ^ "Многострочный макрос C: do / while (0) vs scope block" . Переполнение стека .
- ^ «Microsoft Visual Basic» . msdn.microsoft.com . Проверено 21 января +2016 .
- ^ "делать ... пока" . Веб-документы MDN .
- ^ «Поток управления: если, когда, для, пока - язык программирования Котлин» . Котлин .
- ^ «Поток управления - язык программирования Swift (Swift 5.3)» . docs.swift.org .
Внешние ссылки
- do {...} while (0) в макросах C