Во многих языках программирования цикл do while представляет собой оператор управления потоком , который выполняет блок кода, а затем либо повторяет блок, либо выходит из цикла в зависимости от заданного логического условия.
Конструкция do while состоит из символа процесса и условия. Сначала выполняется код внутри блока. Затем оценивается условие. Если условие истинно, код внутри блока выполняется снова. Это повторяется до тех пор, пока условие не станет ложным .
Циклы do while проверяют условие после выполнения блока кода. Эта структура управления может быть известна как цикл post-test . Это означает, что цикл do-while является циклом условия выхода. Однако цикл while будет проверять условие до выполнения кода внутри блока.
Это означает, что код всегда выполняется первым, а затем оценивается выражение или тестовое условие. Этот процесс повторяется до тех пор, пока выражение оценивается как истинное. Если выражение ложно, цикл завершается. Цикл while устанавливает истинность оператора как необходимое условие для выполнения кода. Цикл do-while обеспечивает непрерывное выполнение действия до тех пор, пока условие не перестанет быть истинным.
Возможно, а иногда и желательно, чтобы условие всегда оценивалось как истинное. Это создает бесконечный цикл . Когда бесконечный цикл создается намеренно, обычно есть другая структура управления, которая позволяет завершить цикл. Например, оператор break позволит завершить бесконечный цикл.
Некоторые языки могут использовать другое соглашение об именовании для этого типа цикла. Например, в языках Pascal и Lua есть цикл " repeat until ", который продолжает выполняться до тех пор, пока управляющее выражение не станет истинным, а затем завершается. Напротив, цикл " while " выполняется, пока управляющее выражение остается истинным, и завершается, как только выражение становится ложным.
делать { делать_работу (); } пока ( условие );
эквивалентно
do_work ();пока ( условие ) { do_work (); }
Таким образом, цикл do ... while сохраняет начальную «подготовку цикла» do_work();
на строке перед while
циклом.
Если оператор continue не используется, то приведенный выше пример технически эквивалентен следующему (хотя эти примеры не являются типичными или современными, используемыми в повседневных компьютерах):
while ( true ) { do_work (); if ( ! condition ) break ; }
или
LOOPSTART : do_work (); если ( условие ) перейти к LOOPSTART ;
Эти примеры программ вычисляют факториал числа 5, используя синтаксис соответствующих языков для цикла do-while.
с Ada.Integer_Text_IO ;процедура Factorial is Counter : Integer := 5 ; Factorial : Integer := 1 ; начало цикла Factorial := Factorial * Counter ; Counter := Counter - 1 ; выход, когда Counter = 0 ; конец цикла ; Ada.Integer_Text_IO.Put ( Факториал ) ; end Факториал ;
Ранние 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 факториал как целое число Dim счетчик как целое число факториал = 1 счетчик = 5 Факториал = факториал * счетчик счетчик = счетчик - 1 Цикл Пока счетчик > 0 Печать факториала
int счетчик = 5 ; int факториал = 1 ; do { factorial *= counter -- ; /* Умножаем, затем уменьшаем. */ } while ( counter > 0 ); printf ( "факториал числа 5 равен %d \n " , факториал );
Операторы do-while(0) также часто используются в макросах C как способ обернуть несколько операторов в обычный (в отличие от составного) оператор. Это делает точку с запятой необходимой после макроса, обеспечивая более функциональный вид для простых парсеров и программистов, а также избегая проблемы области действия с if
. Это рекомендуется в правиле CERT C Coding Standard PRE10-C. [1]
В устаревшем Fortran 77 конструкция DO-WHILE отсутствует, но того же эффекта можно добиться с помощью GOTO:
ЦЕЛОЕ ЧИСЛО CNT , ФАКТ CNT = 5 ФАКТ = 1 1 ПРОДОЛЖИТЬ ФАКТ = ФАКТ * CNT CNT = CNT - 1 ЕСЛИ ( CNT . GT . 0 ) ПЕРЕЙТИ К 1 ПЕЧАТЬ * , ФАКТ КОНЕЦ
В Fortran 90 и более поздних версиях также нет конструкции do-while, но есть конструкция цикла while , которая использует ключевые слова «do while» и, таким образом, фактически совпадает с циклом for . [2]
программа FactorialProg целое число :: счетчик = 5 целое число :: факториал = 1 факториал = факториал * счетчик счетчик = счетчик - 1 do while ( counter > 0 ) ! Истинность проверяется до начала цикла factorial = factorial * counter counter = counter - 1 end do распечатать * , факториал конец программы FactorialProg
int счетчик = 5 ; int факториал = 1 ; do { factorial *= counter -- ; /* Умножаем, затем уменьшаем. */ } while ( counter > 0 ); System.out.println ( " Факториал числа 5 равен " + factorial ) ;
В Паскале вместо синтаксиса do while используется синтаксис repeat/until.
factorial := 1 ; counter := 5 ; repeat factorial := factorial * counter ; counter := counter - 1 ; // В Object Pascal можно использовать dec (counter); until counter = 0 ;
Оператор PL/I DO включает в себя функции цикла после теста ( do until ), цикла до теста ( do while ) и цикла for . Все функции могут быть включены в один оператор. В примере показан только синтаксис "do until".
объявить счетчик фиксированным начальным ( 5 ) ;
объявить факториал фиксированным начальным ( 1 ) ;делать до тех пор, пока ( счетчик <= 0 ) ; факториал = факториал * счетчик ; счетчик = счетчик - 1 ; конец ; положить ( факториал ) ;
В Python нет цикла DO-WHILE, но его эффект может быть достигнут с помощью бесконечного цикла с условием прерывания в конце.
факториал = 1 счетчик = 5в то время как True : факториал *= счетчик счетчик - = 1 если счетчик < 1 : перерывпечать ( факториал )
В Racket, как и в других реализациях Scheme , «named-let» является популярным способом реализации циклов:
#lang racket ( define counter 5 ) ( define factorial 1 ) ( let loop () ( set! factorial ( * factorial counter )) ( set! counter ( sub1 counter )) ( when ( > counter 0 ) ( loop ))) ( displayln factorial )
Сравните это с первым примером цикла while для Racket. Имейте в виду, что именованный let также может принимать аргументы.
Racket и Scheme также обеспечивают полноценный цикл действий.
( define ( factorial n ) ( do (( counter n ( - counter 1 )) ( result 1 ( * result counter ))) (( = counter 0 ) result ) ; Условие остановки и возврат значения. ; Тело цикла do пусто. ))
| счетчик факториал | счетчик := 5 . факториал := 1 .[ счетчик > 0 ] whileTrue: [ факториал := факториал * счетчик . счетчик := счетчик - 1 ] .Транскрипт шоу: факториал printString