Для цикла - For loop

Для схемы цикла

В информатике , для цикла (или просто цикл ) является управление потоком оператор для определения итерации , что позволяет код , который будет выполняться повторно. Для определения этого утверждения используются различные ключевые слова: потомки ALGOL используют «for», а потомки Fortran используют «do». Существуют и другие возможности, например COBOL, который использует "PERFORM VARYING".

Цикл for состоит из двух частей: заголовка, определяющего итерацию, и тела, которое выполняется один раз за итерацию. Заголовок часто объявляет явный счетчик цикла или переменную цикла, которая позволяет телу знать, какая итерация выполняется. Циклы For обычно используются, когда количество итераций известно до входа в цикл. Циклы For можно рассматривать как сокращение для циклов while, которые увеличивают и проверяют переменную цикла.

Название цикла for происходит от слова for , которое во многих языках программирования используется в качестве ключевого слова для введения цикла for. Этот термин в английском языке восходит к АЛГОЛу 58 и был популяризирован в более позднем влиятельном АЛГОЛе 60 ; это прямой перевод более раннего немецкого für , использованного в Superplan (1949–1951) Хайнцем Рутисхаузером , который также участвовал в определении АЛГОЛА 58 и АЛГОЛА 60. Тело цикла выполняется «для» заданных значений переменной цикла. , хотя это более явно указано в версии оператора ALGOL , в которой может быть указан список возможных значений и / или приращений.

В FORTRAN и PL / I ключевое слово DO используется для одного и того же и называется циклом выполнения ; это отличается от цикла do-while .

ДЛЯ

Для иллюстрации цикла от i = 0 до i = 2, в результате получаем data1 = 200

Оператор for-loop доступен в большинстве императивных языков программирования . Даже игнорируя незначительные различия в синтаксисе, существует много различий в том, как работают эти операторы, и в уровне выразительности, который они поддерживают. Как правило, циклы for попадают в одну из следующих категорий:

Традиционные циклы for

Цикл for таких языков, как ALGOL , Simula , BASIC , Pascal , Modula , Oberon , Ada , Matlab , Ocaml , F # и т. Д., Требует управляющей переменной с начальным и конечным значениями и выглядит примерно так:

for i = first to last do statement
(* or just *)
for i = first..last do statement

В зависимости от языка вместо знака равенства может использоваться явный знак присваивания (а в некоторых языках это слово требуется даже в числовом регистре). Необязательное значение шага (приращение или декремент 1) также может быть включено, хотя точный синтаксис, используемый для этого, немного различается между языками. Некоторые языки требуют отдельного объявления управляющей переменной, некоторые - нет. int

Другая форма популяризировал языка программирования Си . Для этого требуется 3 части: инициализация ( вариант цикла ), условие и переход к следующей итерации. Все эти три части необязательны. Этот тип «циклов с точкой с запятой» пришел из языка программирования B и первоначально был изобретен Стивеном Джонсоном .

В части инициализации объявляются все необходимые переменные (и обычно им присваиваются значения). Если объявлено несколько переменных, все они должны быть одного типа. Часть условия проверяет определенное условие и выходит из цикла, если оно ложно. Переход к следующей итерации выполняется ровно один раз при каждом завершении цикла. Затем цикл повторяется, если условие истинно.

Вот пример C-стиль традиционного для цикла в Java .

// Prints the numbers from 0 to 99 (and not 100), each followed by a space. 

for (int i=0; i<100; i++)  
{
    System.out.print(i);
    System.out.print(' ');
}
System.out.println();

Эти циклы также иногда называют числовыми циклами for в отличие от циклов foreach (см. Ниже).

Циклы for на основе итераторов

Этот тип цикла for является обобщением типа числового диапазона цикла for, поскольку он позволяет перечислять наборы элементов, отличные от числовых последовательностей. Обычно он характеризуется использованием неявного или явного итератора , в котором переменная цикла принимает каждое из значений в последовательности или другом сборе данных. Типичный пример на Python :

for item in some_iterable_object:
    do_something()
    do_something_else()

Где some_iterable_objectлибо набор данных, который поддерживает неявную итерацию (например, список имен сотрудников), либо фактически может быть самим итератором. В некоторых языках это есть в дополнение к другому синтаксису цикла for; в частности, в PHP есть этот тип цикла под именем for each, а также трехвыражение цикла for (см. ниже) под именем for.

Векторизованные циклы for

Некоторые языки предлагают цикл for, который действует так, как будто обрабатывает все итерации параллельно , например for allключевое слово в FORTRAN 95, которое имеет интерпретацию, что все выражения с правой стороны оцениваются до выполнения каких-либо назначений, в отличие от явной итерации. форма. Например, в forоператоре в следующем фрагменте псевдокода при вычислении нового значения для A(i), за исключением первого (со i = 2ссылкой), A(i - 1)будет получено новое значение, которое было помещено туда на предыдущем шаге. Однако в for allверсии каждый расчет относится только к оригиналу, без изменений A.

for     i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; next i;
for all i := 2 : N - 1 do A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3;

Разница может быть значительной.

Некоторые языки (например, FORTRAN 95, PL / I) также предлагают операторы присваивания массивов, которые позволяют пропускать многие циклы for. Таким образом, псевдокод, например A := 0;, установил бы все элементы массива A в ноль, независимо от его размера или размерности. Цикл примера можно представить как

 A(2 : N - 1) := [A(1 : N - 2) + A(2 : N - 1) + A(3 : N)] / 3;

Но будет ли это отображаться в стиле цикла for, цикла for all или чего-то еще, может не быть четко описано в руководстве компилятора.

Соединение для петель

Введенный в АЛГОЛ 68 и сопровождаемый PL / I , он позволяет объединить итерацию цикла с тестом, как в

for i := 1 : N while A(i) > 0 do etc.

То есть, значение присваивается переменной цикла я и только тогда , когда в то время как выражение является истинным будет тело цикла будет выполнен. Если результат был ложным, выполнение цикла for прекращается. Допустим , что значение переменной цикла в будет определена после завершения цикла, то приведенное выше утверждение будет найти первый неположительную элемент массива А (и если нет такого, его значение будет N + 1 ), или, с соответствующими изменениями , первый непустой символ в строке и т. д.

Счетчики петель

В области компьютерного программирования на счетчик цикла является переменной , которая управляет итерации цикла (компьютерный язык программирования конструкт). Он назван так потому, что в большинстве случаев использование этой конструкции приводит к тому, что переменная принимает диапазон целочисленных значений в некоторых упорядоченных последовательностях (например, начиная с 0 и заканчивая 10 с шагом 1)

Счетчики цикла изменяются с каждой итерацией цикла, обеспечивая уникальное значение для каждой отдельной итерации. Счетчик цикла используется, чтобы решить, когда цикл должен завершиться и чтобы поток программы продолжил выполнение следующей инструкции после цикла.

Общее соглашение об именах идентификаторов заключается в том, что счетчик цикла использует имена переменных i , j и k (и т. Д., Если необходимо), где i будет самым внешним циклом, j - следующим внутренним циклом и т. Д. Обратный порядок следующий: также используется некоторыми программистами. Обычно считается, что этот стиль возник из раннего программирования FORTRAN , где имена переменных, начинающиеся с этих букв, были неявно объявлены как имеющие целочисленный тип, и поэтому они были очевидным выбором для счетчиков циклов, которые требовались только временно. Эта практика восходит к математической нотации, где индексы для сумм и умножений часто бывают i , j и т. Д. Вариант соглашения заключается в использовании дублированных букв для индекса ii , jj и kk , поскольку это упрощает поиск и поиск. замена, чем использование одной буквы.

Пример

Пример кода C, включающего вложенные циклы for, где переменными счетчика циклов являются i и j :

for (i = 0; i < 100; i++) {
    for (j = i; j < 10; j++) {
        some_function(i, j);
    }
}

Было показано, что вложенный цикл for, как в примере выше, выполняет больше вычислений в единицу времени, чем цикл без него. Эта машинно-независимая оптимизация означает, что вложенный цикл for завершится быстрее при том же количестве вычислений, которые необходимо выполнить. Это преимущество вложенного цикла for перед вложенным циклом while, который ведет себя иначе.

Циклы For в C также можно использовать для печати обратной стороны слова. В качестве:

for (i = 0; i < 6; i++) {
    scanf("%c", &a[i]);
}
for (i = 4; i >= 0; i--) {
    printf("%c", a[i]);
}

Здесь, если на входе есть apple, то на выходе будет elppa.

Дополнительная семантика и конструкции

Использовать как бесконечные циклы

Этот цикл for в стиле C обычно является источником бесконечного цикла, поскольку основные этапы итерации полностью находятся под контролем программиста. Фактически, когда предназначены бесконечные циклы, этот тип цикла for может использоваться (с пустыми выражениями), например:

for (;;)
    //loop body

Этот стиль используется вместо бесконечных while (1)циклов, чтобы избежать предупреждения о преобразовании типа в некоторых компиляторах C / C ++. Некоторые программисты предпочитают более сжатую for (;;)форму семантически эквивалентной, но более подробной while (true).

Ранний выход и продолжение

Некоторые языки могут также предоставлять другие вспомогательные операторы, которые, если они присутствуют, могут изменить способ выполнения итерации цикла for. Распространенными среди них являются операторы break и continue, встречающиеся в C и его производных. Оператор break вызывает немедленное завершение внутреннего цикла при выполнении. Оператор continue сразу перейдет к следующей итерации без дальнейшего продвижения по телу цикла для текущей итерации. Оператор for также завершается, когда выполняется оператор break, goto или return в теле оператора. [Wells] Другие языки могут иметь аналогичные операторы или иным образом предоставлять средства для изменения хода выполнения цикла; например в FORTRAN 95:

DO I = 1, N
  statements               !Executed for all values of "I", up to a disaster if any.
  IF (no good) CYCLE       !Skip this value of "I", continue with the next.
  statements               !Executed only where goodness prevails.
  IF (disaster) EXIT       !Abandon the loop.
  statements               !While good and, no disaster.
END DO                     !Should align with the "DO".

Некоторые языки предлагают дополнительные возможности, такие как присвоение имен различным операторам цикла, чтобы при использовании нескольких вложенных циклов не было сомнений в том, какой цикл задействован. Фортран 95, например:

X1:DO I = 1,N
     statements
  X2:DO J = 1,M
       statements
       IF (trouble) CYCLE X1
       statements
     END DO X2
     statements
   END DO X1

Таким образом, когда "проблема" обнаружена во внутреннем цикле, CYCLE X1 (не X2) означает, что переход будет к следующей итерации для I, а не J. Компилятор также будет проверять, что каждый END DO имеет соответствующую метку. за свою позицию: это не просто помощь в документации. Программист по-прежнему должен правильно кодировать проблему, но некоторые возможные грубые ошибки будут заблокированы.

Область видимости и семантика переменной цикла

В разных языках указываются разные правила для того, какое значение переменная цикла будет удерживать при завершении цикла, и действительно, некоторые считают, что она «становится неопределенной». Это позволяет компилятору сгенерировать код, который оставляет любое значение в переменной цикла или, возможно, даже оставляет его неизменным, потому что значение цикла хранится в регистре и никогда не сохраняется в памяти. Фактическое поведение может даже отличаться в зависимости от настроек оптимизации компилятора, как в случае с компилятором Honywell Fortran66.

В некоторых языках (кроме C или C ++ ) переменная цикла неизменна в рамках тела цикла, и любая попытка изменить ее значение рассматривается как семантическая ошибка. Такие модификации иногда являются следствием ошибки программиста, которую бывает очень трудно идентифицировать после внесения. Однако компилятор, скорее всего, обнаружит только явные изменения. Ситуации, когда адрес переменной цикла передается в качестве аргумента подпрограмме, очень затрудняют проверку, потому что поведение подпрограммы, как правило, неизвестно компилятору. Несколько примеров в стиле Фортран:

DO I = 1, N
  I = 7                           !Overt adjustment of the loop variable. Compiler complaint likely.
  Z = ADJUST(I)                   !Function "ADJUST" might alter "I", to uncertain effect.
  normal statements               !Memory might fade that "I" is the loop variable.
  PRINT (A(I), B(I), I = 1, N, 2) !Implicit for-loop to print odd elements of arrays A and B, reusing "I"...
  PRINT I                         !What value will be presented?
END DO                            !How many times will the loop be executed?

Общий подход состоит в том, чтобы вычислить счетчик итераций в начале цикла (с особым вниманием к переполнению, как в for i := 0 : 65535 do ... ;шестнадцатиразрядной целочисленной арифметике) и с каждой итерацией уменьшить этот счетчик, одновременно регулируя значение I : результаты двойного счета. Однако корректировка значения I внутри цикла не изменит количество выполненных итераций.

Еще одна возможность состоит в том, что сгенерированный код может использовать вспомогательную переменную в качестве переменной цикла, возможно, хранящейся в машинном регистре, значение которой может или не может быть скопировано в I на каждой итерации. Опять же, модификации I не повлияют на управление циклом, но теперь возможна дизъюнкция: внутри цикла ссылки на значение I могут указывать на (возможно, измененное) текущее значение I или на вспомогательную переменную (удерживаемую защищен от неправильной модификации), и результаты будут сбивающими с толку. Например, внутри цикла ссылка на элемент I массива, вероятно, будет использовать вспомогательную переменную (особенно если она хранится в машинном регистре), но если I является параметром некоторой подпрограммы (например, print -statement to раскрыть его значение), то, вероятно , будет ссылка на соответствующую переменную I вместо этого. Лучше избегать таких возможностей.

Регулировка границ

Так же, как индексная переменная может быть изменена внутри цикла for, также могут быть изменены ее границы и направление. Но с неопределенным эффектом. Компилятор может предотвратить такие попытки, они могут не иметь никакого эффекта или даже работать должным образом, хотя многие заявят, что это будет неправильно. Рассмотрим такое утверждение, как

for i := first : last : step do
  A(i) := A(i) / A(last);

Если подход к компиляции такого цикла заключался в оценке first , last и step и вычислении количества итераций с помощью чего-то вроде (last - first)/stepодного раза только в начале, то если бы эти элементы были простыми переменными и их значения каким-то образом корректировались во время итераций, это не повлияет на счетчик итераций, даже если элемент, выбранный для деления на, A(last)изменился.

Список диапазонов значений

PL / I и Algol 68 допускают циклы, в которых переменная цикла повторяется по списку диапазонов значений вместо одного диапазона. В следующем примере PL / I цикл будет выполняться с шестью значениями i: 1, 7, 12, 13, 14, 15:

do i = 1, 7, 12 to 15;
  /*statements*/
end;

Эквивалентность циклам while

Цикл for обычно эквивалентен циклу while:

factorial := 1
 for counter from 2 to 5
     factorial := factorial * counter
counter := counter - 1
print counter + "! equals " + factorial

эквивалентно:

factorial := 1
counter := 1
 while counter < 5
    counter := counter + 1
    factorial := factorial * counter
print counter + "! equals " + factorial    

как показано на выходе переменных.

Хронология синтаксиса цикла for в различных языках программирования

Например, если действие необходимо повторить пять раз, циклы for в разных языках будут записываться по-разному. Синтаксис цикла for с тремя выражениями практически идентичен на всех языках, в которых он есть, после учета различных стилей завершения блока и т. Д.

1957: Фортран

Эквивалентом цикла for в Фортране является цикл DO с использованием ключевого слова do вместо for. Синтаксис цикла DO в Фортране :

        DO label counter = first, last, step
          statements
label     statement

Следующие два примера ведут себя эквивалентно трем аргументам цикла for на других языках, инициализируя переменную счетчика значением 1, увеличивая на 1 каждую итерацию цикла и останавливаясь на пяти (включительно).

        DO 9, COUNTER = 1, 5, 1
          WRITE (6,8) COUNTER
    8     FORMAT( I2 )
    9   CONTINUE

В Fortran 77 (или более поздней версии) это также можно записать как:

do counter = 1, 5
  write(*, '(i2)') counter
end do

Шаг шага может быть опущен, если шаг один. Пример:

* DO loop example.
       PROGRAM MAIN
         SUM SQ = 0
         DO 199 I = 1, 9999999
           IF (SUM SQ.GT.1000) GO TO 200
199        SUM SQ = SUM SQ + I**2
200      PRINT 206, SUMSQ
206      FORMAT( I2 )
       END

Пробелы не имеют значения в выражениях Fortran фиксированной формы, поэтому SUM SQ совпадает с SUMSQ . В современном стиле Фортрана свободной формы пробелы имеют значение.

В Fortran 90 можно избежать GO TO , используя оператор EXIT .

* DO loop example.
       program main
         implicit none

         integer :: sumsq
         integer :: i

         sumsq = 0
         do i = 1, 9999999
           if (sumsq > 1000.0) exit
           sumsq = sumsq + i**2
          end do
         print *, sumsq

       end program

1958: АЛГОЛ

Алгол 58 представил forоператор, используя форму как Суперплан:

 FOR Identifier = Base (Difference) Limit

Например, чтобы вывести от 0 до 10 с шагом 1:

FOR x = 0 (1) 10 BEGIN
PRINT (FL) = x END

1960: КОБОЛ

COBOL был формализован в конце 1959 года и претерпел множество доработок. Он использует глагол PERFORM, который имеет много вариантов. Первоначально все циклы должны были выходить за рамки, а повторяющийся код занимал отдельный абзац. Игнорируя необходимость объявления и инициализации переменных, COBOL-эквивалент цикла for будет.

      PERFORM SQ-ROUTINE VARYING I FROM 1 BY 1 UNTIL I > 1000

      SQ-ROUTINE
             ADD I**2 TO SUM-SQ.

В 1980-х добавление встроенных циклов и «структурированных» операторов, таких как END-PERFORM, привело к созданию цикла for с более знакомой структурой.

      PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
             ADD I**2 TO SUM-SQ.
      END-PERFORM

Если команда PERFORM имеет необязательное предложение TEST AFTER, результирующий цикл немного отличается: тело цикла выполняется по крайней мере один раз перед любым тестом.

1964: ОСНОВНОЙ

Циклы в BASIC иногда называются циклами для следующих.

10 REM THIS FOR LOOP PRINTS ODD NUMBERS FROM 1 TO 15
20 FOR I = 1 TO 15 STEP 2
30 PRINT I
40 NEXT I

Обратите внимание, что маркер конца цикла указывает имя индексной переменной, которое должно соответствовать имени индексной переменной в начале цикла for. Некоторые языки (PL / I, FORTRAN 95 и более поздние версии) допускают метку оператора в начале цикла for, которая может быть сопоставлена ​​компилятором с тем же текстом в соответствующем операторе конца цикла. Fortran также позволяет EXITи CYCLEзаявления назвать этот текст; в группе петель это дает понять, какая петля предназначена. Однако в этих языках метки должны быть уникальными, поэтому последовательные циклы с одной и той же индексной переменной не могут использовать один и тот же текст, а метка не может совпадать с именем переменной, например индексной переменной для цикла.

1964: PL / I

do counter = 1 to 5 by 1; /* "by 1" is the default if not specified */
  /*statements*/;
  end;

Оператор LEAVE может использоваться для выхода из цикла. Циклы могут быть помечены, а команда leave может оставить определенный помеченный цикл в группе вложенных циклов. Некоторые диалекты PL / I включают оператор ITERATE для завершения текущей итерации цикла и начала следующей.

1968: Алгол 68

Алгол 68 имеет то , что считается универсальным циклом, полный синтаксис:

FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD

Кроме того, диапазон одной итерации может быть заменен списком таких диапазонов. Есть несколько необычных аспектов конструкции.

  • только do ~ odчасть была обязательной, и в этом случае цикл будет повторяться бесконечно.
  • таким образом, предложение to 100 do ~ odбудет повторяться ровно 100 раз.
  • while синтаксический элемент позволил программисту нарушить из forцикла рано, как в:
INT sum sq := 0;
FOR i
 WHILE
  print(("So far:", i, new line)); # Interposed for tracing purposes. #
  sum sq ≠ 70↑2                    # This is the test for the WHILE   #
DO
  sum sq +:= i↑2
OD

Последующие расширения стандартного Algol68 позволили заменить toсинтаксический элемент на uptoи downtoдобиться небольшой оптимизации. В те же компиляторы также включены:

until
для позднего завершения цикла.
foreach
для параллельной работы с массивами .

1970: Паскаль

for Counter := 1 to 5 do
  (*statement*);

При уменьшении (обратном отсчете) downtoвместо ключевого слова используется ключевое слово to:

for Counter := 5 downto 1 do
  (*statement*);

Числовой диапазон for-loop варьируется несколько больше.

1972: C / C ++

for (initialization; condition; increment/decrement)
    statement

Утверждение часто блок операторов; примером этого может быть:

//Using for-loops to add numbers 1 - 5
int sum = 0;
for (int i = 1; i < 6; ++i) {
    sum += i;
}

Публикация ISO / IEC 9899: 1999 (широко известная как C99 ) также допускает начальные объявления в forциклах. Все три раздела цикла for необязательны.

1972: Smalltalk

1 to: 5 do: [ :counter | "statements" ]

В отличие от других языков, в Smalltalk цикл for - это не языковая конструкция, а определенный в классе Number как метод с двумя параметрами, конечным значением и закрытием , с использованием self в качестве начального значения.

1980: Ада

for Counter in 1 .. 5 loop
   -- statements
end loop;

Оператор выхода может использоваться для выхода из цикла. Циклы могут быть помечены, и exit может оставить специально помеченный цикл в группе вложенных циклов:

Counting:
    for Counter in 1 .. 5 loop
   Triangle:
       for Secondary_Index in 2 .. Counter loop
          -- statements
          exit Counting;
          -- statements
       end loop Triangle;
    end loop Counting;

1980: Клен

В Maple есть две формы цикла for: одна для итерации диапазона значений, а другая для итерации по содержимому контейнера. Форма диапазона значений выглядит следующим образом:

for i from f by b to t while w do
    # loop body
od;

Все части, кроме doи, odявляются необязательными. Часть, если он присутствует, должен прийти первым. Остальные части ( , , , ) могут появляться в любом порядке. for ifrom fby bto twhile w

Итерация по контейнеру выполняется с использованием этой формы цикла:

for e in c while w do
    # loop body
od;

Предложение определяет контейнер, который может быть списком, набором, суммой, продуктом, неоцененной функцией, массивом или объектом, реализующим итератор. in c

Для цикла может быть прекращено od, endили end do.

1982: Maxima CAS

В Maxima CAS можно использовать и нецелочисленные значения:

for x:0.5 step 0.1 thru 0.9 do
    /* "Do something with x" */

1982: PostScript

Цикл for, записанный как [initial] [increment] [limit] { ... } forинициализирующий внутреннюю переменную, выполняет тело до тех пор, пока внутренняя переменная не превышает предел (или не меньше, если приращение отрицательное), и в конце каждой итерации увеличивает внутреннюю переменную на единицу. Перед каждой итерацией значение внутренней переменной помещается в стек.

1 1 6 {STATEMENTS} for

Также существует простой цикл повтора. Цикл повторения, записанный как X { ... } repeat, повторяет тело ровно X раз.

5 { STATEMENTS } repeat

1983: Ada 83 и выше

procedure Main is
  Sum_Sq : Integer := 0;
begin
  for I in 1 .. 9999999 loop 
    if Sum_Sq <= 1000 then
      Sum_Sq := Sum_Sq + I**2
    end if;
  end loop;
end;

1984: MATLAB

for n = 1:5 
     -- statements
end

После цикла nв этом примере будет 5.

Как iи в случае с мнимым модулем , его использование в качестве переменной цикла не рекомендуется.

1987: Perl

for ($counter = 1; $counter <= 5; $counter++) { # implicitly or predefined variable
    # statements;
}
for (my $counter = 1; $counter <= 5; $counter++) { # variable private to the loop
    # statements;
}
for (1..5) { # variable implicitly called $_; 1..5 creates a list of these 5 elements
    # statements;
}
statement for 1..5; # almost same (only 1 statement) with natural language order
for my $counter (1..5) { # variable private to the loop
    # statements;
}

(Обратите внимание, что « есть несколько способов сделать это » - девиз программирования Perl.)

1988: Математика

Конструкция, соответствующая циклу for в большинстве других языков, в системе Mathematica называется Do.

Do[f[x], {x, 0, 1, 0.1}]

В Mathematica также есть конструкция For, которая имитирует цикл for C-подобных языков.

For[x= 0 , x <= 1, x += 0.1,
    f[x]
]

1989: Баш

# first form
for i in 1 2 3 4 5
do
    # must have at least one command in loop
    echo $i  # just print value of i
done
# second form
for (( i = 1; i <= 5; i++ ))
do
    # must have at least one command in loop
    echo $i  # just print value of i
done

Обратите внимание, что пустой цикл (т. Е. Цикл без команд между doи done) является синтаксической ошибкой. Если указанные выше циклы содержат только комментарии, выполнение приведет к сообщению «синтаксическая ошибка рядом с неожиданным токеном« готово »».

1990: Haskell

Встроенный императив forM_ отображает монадическое выражение в список, как

forM_ [1..5] $ \indx -> do statements

или получить результат каждой итерации в виде списка в

statements_result_list <- forM [1..5] $ \indx -> do statements

Но, если вы хотите сэкономить место в списке [1..5], более аутентичная монадическая конструкция forLoop_ может быть определена как

import Control.Monad as M

forLoopM_ :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m ()
forLoopM_ indx prop incr f = do
        f indx
        M.when (prop next) $ forLoopM_ next prop incr f
  where      
    next = incr indx

и используется как:

  forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- whatever with the index

1991: Оберон-2, Оберон-07 или Компонентный Паскаль

FOR Counter := 1 TO 5 DO
  (* statement sequence *)
END

Обратите внимание, что в исходном языке Oberon цикл for был опущен в пользу более общей конструкции цикла Oberon. В Оберон-2 был повторно введен цикл for.

1991: Python

Python не содержит классического цикла for, скорее, foreachцикл используется для итерации по выходным данным встроенной range()функции, которая возвращает итеративный список целых чисел.

for i in range(1, 6):  # gives i values from 1 to 5 inclusive (but not 6)
    # statements
    print(i)
# if we want 6 we must do the following
for i in range(1, 6 + 1):  # gives i values from 1 to 6
    # statements
    print(i)

Использование range(6)запустит цикл от 0 до 5.

1993: AppleScript

repeat with i from 1 to 5
	-- statements
	log i
end repeat

Вы также можете перебирать список элементов, аналогично тому, что вы можете делать с массивами на других языках:

set x to {1, "waffles", "bacon", 5.1, false}
repeat with i in x
	log i
end repeat

Вы также можете использовать exit repeatдля выхода из цикла в любое время. В отличие от других языков, AppleScript в настоящее время не имеет команды для перехода к следующей итерации цикла.

1993: Lua

for i = start, stop, interval do
  -- statements
end

Итак, этот код

for i = 1, 5, 2 do
  print(i)
end

напечатает:

1 3 5

Циклы For также могут перемещаться по таблице, используя

ipairs()

численно перебирать массивы и

pairs()

для случайного перебора словарей.

Общий цикл for с использованием замыканий :

for name, phone, address in contacts() do
  -- contacts() must be an iterator function
end

1995: CFML

Синтаксис скрипта

Простой индексный цикл:

for (i = 1; i <= 5; i++) {
	// statements
}

Используя массив:

for (i in [1,2,3,4,5]) {
	// statements
}

Используя список строковых значений:

loop index="i" list="1;2,3;4,5" delimiters=",;" {
	// statements
}

Выше listпример доступен только в диалекте CFML , используемого Lucee и Railo .

Синтаксис тега

Простой индексный цикл:

<cfloop index="i" from="1" to="5">
	<!--- statements --->
</cfloop>

Используя массив:

<cfloop index="i" array="#[1,2,3,4,5]#">
	<!--- statements --->
</cfloop>

Используя «список» строковых значений:

<cfloop index="i" list="1;2,3;4,5" delimiters=",;">
	<!--- statements --->
</cfloop>

1995: Java

for (int i = 0; i < 5; i++) {
    //perform functions within the loop;
    //can use the statement 'break;' to exit early;
    //can use the statement 'continue;' to skip the current iteration
}

О расширенном цикле for см. В разделе « Цикл по каждому элементу» § Java .

1995: JavaScript

JavaScript поддерживает циклы с «тремя выражениями» в стиле C. Операторы breakи continueподдерживаются внутри циклов.

for (var i = 0; i < 5; i++) {
    // ...
}

В качестве альтернативы можно перебирать все ключи массива.

for (var key in array) {  // also works for assoc. arrays
    // use array[key]
    ...
}

1995: PHP

Это распечатает треугольник *

for ($i = 0; $i <= 5; $i++) {
    for ($j = 0; $j <= $i; $j++) {
        echo "*";
    }
    echo "<br />\n";
}

1995: Рубин

for counter in 1..5
  # statements
end

5.times do |counter|  # counter iterates from 0 to 4
  # statements
end

1.upto(5) do |counter|
  # statements
end

Ruby имеет несколько возможных синтаксисов, включая приведенные выше примеры.

1996: OCaml

См. Синтаксис выражения.

 (* for_statement := "for" ident '='  expr  ( "to" ∣  "downto" ) expr "do" expr "done" *)

for i = 1 to 5 do
    (* statements *)
  done ;;

for j = 5 downto 0 do
    (* statements *)
  done ;;

1998: ActionScript 3

for (var counter:uint = 1; counter <= 5; counter++){
    //statement;
}

2008: Small Basic

For i = 1 To 10
    ' Statements
EndFor

2008: Ним

В Nim есть foreachцикл -type и различные операции для создания итераторов.

for i in 5 .. 10:
  # statements

2009: Вперед

for i := 0; i <= 10; i++ {
    // statements
}

2010: Ржавчина

for i in 0..10 {
    // statements
}

2012: Юлия

for j = 1:10
    # statements
end

Смотрите также

использованная литература