stringtranslate.com

Для цикла

Блок-схема следующего кода цикла:
for ( я = 0 ; я < 5 ; я ++ ) printf ( "*" );        
Цикл приведет к печати пяти звездочек.

В информатике цикл for или цикл for — это оператор потока управления , определяющий итерацию . В частности, цикл for функционирует путем многократного выполнения фрагмента кода до тех пор, пока не будет выполнено определенное условие.

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

Для обозначения использования цикла for используются различные ключевые слова: потомки АЛГОЛА используют « for », а потомки Фортрана используют « do ». Есть и другие возможности, например COBOL , который использует .PERFORM VARYING

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

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

ДЛЯ

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

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

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

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

for i = первый - последний оператор do (* или просто *) for i = первый .. последний оператор do            

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

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

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

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

// Печатает числа от 0 до 99 (а не 100), за каждым из которых следует пробел.для ( int я знак равно 0 ; я < 100 ; я ++ ) { System . вне . распечатать ( я ); Система . вне . Распечатать ( ' ' ); } Система . вне . печатьln ();      

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

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

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

для  элемента  в  some_iterable_object :  do_something ()  do_something_else ()

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

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

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

для i := 2 : N - 1 делаем A(i) := [A(i - 1) + A(i) + A(i + 1)]/3; следующий я;для всех i := 2 : N - 1 делаем A(i) := [A(i - 1) + A(i) + A(i + 1)]/3;

Разница может быть существенной.

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

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

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

Составные циклы for

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

для i := 1 : N, пока A(i) > 0, делайте и т. д.

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

Счетчики циклов

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

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

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

Пример

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

for ( я знак равно 0 ; я < 100 ; я ++ ) { for ( j знак равно я ; j < 10 ; j ++ ) { some_function ( i , j ); } }                    

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

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

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

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

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

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

for (;;) //тело цикла  

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

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

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

DO I = 1 , N операторов !Выполняется для всех значений «I», вплоть до катастрофы, если таковая имеется. ЕСЛИ ( нехорошо ) ЦИКЛ !Пропустите это значение « I», перейдите к следующему. заявления !Выполняется только там, где преобладает добро. ЕСЛИ ( катастрофа ) ВЫХОД !Выйти из цикла. заявления !Хотя и хорошо, никакой катастрофы. END DO !Должен совпадать с «DO».                   

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

X1 : DO I = 1 , N операторов X2 : DO J = 1 , M операторов IF ( проблема ) CYCLE X1 операторов END DO X2 операторов END DO X1              

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

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

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

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

DO I = 1 , N I = 7 !Открытая регулировка переменной контура. Возможна жалоба компилятора. Z = НАСТРОЙКА ( I ) !Функция «НАСТРОЙКА» может изменить «I» с неопределенным эффектом. нормальные операторы ! Память может исчезнуть, что «I» — это переменная цикла. PRINT ( A ( I ), B ( I ), I = 1 , N , 2 ) !Неявный цикл for для печати нечетных элементов массивов A и B, повторно используя «I»... PRINT I !Какое значение будет представлено ? END DO !Сколько раз будет выполнен цикл?                          

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

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

Корректировка границ

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

for i := первый : последний : шаг сделать A(i) := A(i) / A(последний);

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

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

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

делаю  я = 1 , 7 , от 12 до 15 ; /*операторы*/ end ;       

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

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

факториал := 1 для счетчика от 2 до 5 факториал := факториал * счетчиксчетчик := счетчик - 1напечатать счетчик + "! равно" + факториал

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

факториал := 1счетчик := 1 пока счетчик < 5 счетчик := счетчик + 1 факториал := факториал * счетчикнапечатать счетчик + "! равно" + факториал

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

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

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

1957: ФОРТРАН

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

   Счетчик меток DO = операторы первого , последнего шага , оператор метки          

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

   DO 9 , СЧЕТЧИК = 1 , 5 , 1 ЗАПИСЬ ( 6 , 8 ) СЧЕТЧИК  8 ФОРМАТ ( I2 )  9 ПРОДОЛЖИТЬ                

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

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

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

* Пример цикла DO. PROGRAM MAIN SUM SQ = 0 DO 199 I = 1 , 9999999 IF ( SUM SQ . GT . 1000 ) ПЕРЕЙДИТЕ К 200 199 SUM SQ = SUM SQ + I ** 2 200 ПЕЧАТЬ 206 , SUMSQ 206 ФОРМАТ ( I2 ) КОНЕЦ                                      

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

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

* Пример цикла DO. программа основная неявная нет         целое число :: sumsq целое число :: i          sumsq = 0 do i = 1 , 9999999 if ( sumsq > 100 0.0 ) выход sumsq = sumsq + i ** 2 end do print * , sumsq                                 завершить программу

1958: АЛГОЛ

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

FOR Идентификатор = Базовый ( Разница ) Предел

Например, чтобы напечатать от 0 до 10 с приращением 1:

FOR x = 0 (1) 10 НАЧАЛОПЕЧАТЬ (FL) = x КОНЕЦ

1960: КОБОЛ

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

 ВЫПОЛНЯЙТЕ SQ-ПРОГРАММУ , ИЗМЕНЯЮ I ОТ 1 НА 1 ДО I > 1000          SQ-ПРОГРАММА ДОБАВИТЬ I ** 2 К СУММЕ-SQ .    

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

 ВЫПОЛНЯЙТЕ ИЗМЕНЕНИЕ I ОТ 1 НА 1 ДО I > 1000 ДОБАВЬТЕ I ** 2 К SUM-SQ . КОНЕЦ-ИСПОЛНЕНИЕ            

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

1964: БАЗОВЫЙ

В BASIC цикл иногда называют циклом for-next .

10 REM THIS FOR LOOP ПЕЧАТАЕТ НЕЧЕТНЫЕ ЧИСЛА ОТ 1 ДО 15 20 FOR I = 1 ДО 15 ШАГ 2 30 ПЕЧАТЬ I 40 СЛЕДУЮЩИЙ I             

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

1964: ПЛ/И

do  counter = от 1 до 5 на 1 ; /* «на 1» используется по умолчанию, если не указано */ /*statements*/ ; конец ;         

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

1968: АЛГОЛ 68

В АЛГОЛе 68 есть то, что считалось универсальным циклом, полный синтаксис:

ДЛЯ i ОТ 1 НА 2 ДО 3 ПОКА i≠4 DO ~ OD

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

INT сумма кв := 0;ДЛЯ Я ПОКА print(("Пока:", i, новая строка)); # Вставлено для целей отслеживания. # sum sq ≠ 70↑2 # Это проверка ПОКА #ДЕЛАТЬ сумма кв +:= я↑2ОД

Последующие расширения стандарта АЛГОЛ 68 позволили toзаменить синтаксический элемент uptoи downtoдобиться небольшой оптимизации. Те же компиляторы также включили:

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

1970: Паскаль

for Counter := от 1 до 5 do (*оператор*) ;       

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

for Counter := 5 до 1 do (*оператор*) ;       

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

1972: Си, С++

оператор for ( инициализация ; условие ; увеличение / уменьшение )    

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

//Использование циклов for для сложения чисел 1–5 int sum = 0 ; для ( int я знак равно 1 ; я <= 5 ; ++ я ) { сумма += я ; }               

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

1972: Светская беседа

от 1  до:  5  сделать: [ : счетчик  |  "заявления" ]

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

1980: Ада

for  Counter  в  цикле 1  ..  5  -- операторы завершают цикл ;  

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

Подсчет :  для  счетчика  в  цикле 1  ..  5  Треугольник  : для Secondary_Index в цикле 2 .. счетчика -- операторы выходят из подсчета ; -- операторы завершают цикл Triangle ; завершить цикл подсчета ;                 

1980: Клен

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

for  i  от  f  by  b  до  t  while  w  do  # тело цикла od ;

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

Перебор контейнера выполняется с использованием следующей формы цикла:

for  e  in  c  while  w  do  # тело цикла od ;

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

Цикл for может быть завершен с помощью od, endили end do.

1982: Максима CAS

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

for x : 0,5 шаг от 0,1 до 0,9 do /* "Сделать что-нибудь с x" */       

1982: Постскриптум

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

1  1  6  { ЗАЯВЛЕНИЯ }  для

Существует также простой цикл повторения. Повторяющийся цикл, записанный как X { ... } repeat, повторяет тело ровно X раз. [7]

5  {  ЗАЯВЛЕНИЯ  }  повторить

1983: Ада 83 и выше

процедура  Main   Sum_Sq  :  Integer  :=  0 ; начало  цикла  I  в  1  ..  9999999  ,  если  Sum_Sq  <=  1000  , то  Sum_Sq  :=  Sum_Sq  +  I ** 2  end  if ;  конец  цикла ; конец ;

1984: МАТЛАБ

для n = 1 : 5 -- операторы заканчиваются     

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

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

1987: Перл

for ( $counter = 1 ; $counter <= 5 ; $counter ++ ) { # неявно или предопределенная переменная # операторы; } for ( my $counter = 1 ; $counter <= 5 ; $counter ++ ) { # переменная, приватная для # операторов цикла ; } for ( 1 .. 5 ) { # переменная, неявно называемая $_; 1..5 создает список из этих 5 элементов # операторов; } оператор для 1 .. 5 ; # почти то же самое (только 1 оператор) с порядком естественного языка для моих $counter ( 1 .. 5 ) { # частная переменная цикла # операторов; }                                  

« Есть несколько способов сделать это » — девиз программирования на Perl.

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

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

Делай [ ж [ Икс ] , { Икс , 0 , 1 , 0 . 1 } ]    

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

Для [ x знак равно 0 , x <= 1 , x += 0 . 1 , ж [ Икс ] ]         

1989: Баш

# первая форма для  i в 1 2 3 4 5 do # должна содержать хотя бы одну команду в цикле echo $i # просто вывести значение i Done          
# вторая форма for (( i = 1 ; i < = 5 ; i++ )) do # в цикле должна быть хотя бы одна команда echo $i # просто вывести значение i Done             

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

1990: Хаскелл

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

forM_ [ 1 .. 5 ] $ \ indx -> операторы do      

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

операторы_result_list <- forM [ 1 .. 5 ] $ \ indx -> операторы do        

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

импортировать Control.Monad как 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 где next = incr indx                                           

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

 forLoopM_ ( 0 :: Int ) ( < len ) ( + 1 ) $ \ indx -> do -- что угодно с индексом         

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

FOR  Counter  :=  от 1  до  5  DO  (* последовательность операторов *) END

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

1991: Питон

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

for  i  in  range ( 1 ,  6 ):  # дает i значения от 1 до 5 включительно (но не 6)  # операторы  print ( i ) # если мы хотим 6, мы должны сделать следующее для  i  в  диапазоне ( 1 ,  6  +  1) ):  # присваивает i значения от 1 до 6  # операторы  print ( i )

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

1993: AppleScript

повторить  с  i  от  1  до  5 -- журнал операторов  i end  повтор

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

установите  x  в  { 1 ,  "вафли" ,  "бекон" ,  5.1 ,  false } повторите  с  i  в  x log  i , закончите  повтор

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

1993: Кристалл

for  i  =  start ,  stop ,  интервал  do  — операторы заканчиваются

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

для  i  =  1 ,  5 ,  2  напечатайте  ( i ) end

напечатает:

1  3  5

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

IP-пары ()

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

пары ()

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

Общий цикл for, использующий замыкания:

для  имени ,  телефона ,  адреса  в  контактах ()  do -- contacts() должен быть  завершением функции итератора

1995: Язык разметки ColdFusion (CFML).

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

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

for  ( я  =  1 ;  я  <=  5 ;  я ++ )  { // операторы }

Использование массива:

for  ( i  in  [ 1 , 2 , 3 , 4 , 5 ])  { // операторы }

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

 индекс цикла = "i"  список = "1;2,3;4,5"  разделители = ",;"  { // заявления }

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

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

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

<cfloop  index = "i"  from = "1"  to = "5" > <!--- операторы ---> </cfloop>

Использование массива:

<cfloop  index = "i"  array = " #[1,2,3,4,5]# " > <!--- операторы ---> </cfloop>

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

<cfloop  index = "i"  list = "1;2,3;4,5"  разделители = ",;" > <!--- утверждения ---> </cfloop>

1995: Ява

for ( int i = 0 ; i < 5 ; i ++ ) { // выполняем функции внутри цикла; //можно использовать оператор «break;» выйти раньше; //можно использовать оператор «продолжить;» чтобы пропустить текущую итерацию }            

Подробнее о расширенном цикле for см. в разделе Цикл Foreach § Java .

1995: JavaScript

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

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

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

for ( var key in array ) { // также работает для assoc. массивы // используем массив[ключ] ... }        

1995: PHP

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

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

1995: Руби

для счетчика в 1 .. 5 # операторы конца    5 . раз делать | счетчик | # счетчик выполняет итерацию от 0 до 4 # конец оператора    1 . до ( 5 ) делать | счетчик | # операторов заканчивается   

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

1996: ОКамл

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

 (* for_statement := "for" ident '=' expr ( "to" ∣ "downto" ) expr "do" expr "done" *)для  i  =  от 1  до  5  do  (* операторы *)  сделано  ;;для  j  =  5  до  0  do  (* операторы *)  Done  ;;

1998: ActionScript 3

for ( var counter : uint = 1 ; счетчик <= 5 ; счетчик ++){ //оператор; }         

2008: Малый базовый

For i = 1 To 10 ' Операторы EndFor      

2008: Ним

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

for i in 5 .. 10 : # операторов      

2009: Вперёд

для я := 0 ; я <= 10 ; я ++ { // операторы }         

2010: Ржавчина

for i in 0 .. 10 { // операторы }     

2012: Юлия

for j = 1 : 10 # операторы заканчиваются    

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

Рекомендации

  1. ^ Вирт, Никлаус (1973). "Предисловие". Систематическое программирование: Введение . стр. XIII. ISBN 0138803692.
  2. ^ «Для циклов в C++». Изучите С++ .
  3. ^ Томпсон, Кен . VCF East 2019 – Брайан Керниган берет интервью у Кена Томпсона. YouTube . Архивировано из оригинала 12 декабря 2021 г. Проверено 16 ноября 2020 г. Я видел версию цикла for с точкой с запятой Джонсона и поместил ее в [B], я украл ее.
  4. ^ http://www.knosof.co.uk/vulnerabilities/loopcntrl.pdf Анализ переменных управления циклом в C
  5. ^ «Предупреждение компилятора (уровень 4) C4127» . Майкрософт . Проверено 29 июня 2011 г.
  6. ^ Справочник по языку PostScript . Издательство Аддисон-Уэсли. 1999. с. 596. ИСБН 0-201-37922-8.
  7. ^ «Учебное пособие по PostScript — Циклы» .
  8. ^ «Синтаксис выражения OCaml» . Архивировано из оригинала 12 апреля 2013 г. Проверено 19 марта 2013 г.
  9. ^ https://nim-lang.org/docs/system.html#...i%2CT%2CT ".. итератор"