For (цикл)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
For loop flow diagram

В інформатиці цикл for — це оператор, що дозволяє виконувати код багаторазово.

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

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

У FORTRAN і PL/I ключове слово DO використовується для того самого, і воно називається циклом do; це відрізняється від циклу do-while.

Різновиди циклів for[ред. | ред. код]

Оператор циклу for доступний у більшості імперативних мов програмування. Як правило, цикли for поділяються на кілька категорій.

Традиційні цикли for[ред. | ред. код]

Цикл for таких мов як ALGOL, Simula, BASIC, Pascal, Modula, Oberon, Ada, MATLAB, Ocaml, F# тощо, вимагає керуючої змінної з початковими та кінцевими значеннями і виглядає приблизно так:

for i = first to last do statement
(* або просто *)
for i = first..last do statement

Залежно від мови замість знака рівності може використовуватися явний знак присвоєння (а в деяких мовах слово int вимагається навіть у числовому випадку). Додаткове значення кроку (інкремент або декремент ≠ 1) також може бути включено, хоча точний синтаксис, який використовується для цього, дещо відрізняється в різних мовах. Деякі мови вимагають окремого оголошення керуючої змінної, деякі ні.

Інша форма була популяризована мовою програмування C. Для цього потрібні 3 частини: ініціалізація (варіант циклу), умова та перехід до наступної ітерації. Усі ці три частини є необов'язковими. Цей тип «циклів із крапкою з комою» прийшов з мови програмування B, і спочатку його винайшов Стівен Джонсон.

У частині ініціалізації оголошуються всі необхідні змінні (і зазвичай їм призначаються значення). Якщо оголошено кілька змінних, усі вони мають бути одного типу. Частина умови перевіряє певну умову і виходить з циклу, якщо вона хибна, навіть якщо цикл жодного разу не виконався. Перехід до наступної частини ітерації виконується рівно один раз щоразу, коли цикл закінчується. Потім цикл повторюється, якщо умова має значення істини.

Ось приклад традиційного циклу for в стилі C у Java.

// Друкує числа від 0 до 99 (не включаючи 100) з пробілом між ними.

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 має цей тип циклу під назвою foreach, а також цикл for із трьома виразами під назвою for.

Векторизовані цикли for[ред. | ред. код]

Деякі мови пропонують цикл for, який діє так, ніби обробляє всі ітерації паралельно, наприклад ключове слово for all у FORTRAN 95, яке має інтерпретацію, що всі вирази правої частини оцінюються перед виконанням будь-яких присвоєнь, на відміну від явної ітераційної форми. Наприклад, в операторі for у наступному фрагменті псевдокоду під час обчислення нового значення для A(i), крім першого (з i = 2), посилання на A(i — 1) отримає нове значення, яке мало було розміщено там на попередньому кроці. Однак у версії для всіх кожне обчислення відноситься лише до вихідного, незмінного 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, чи щось інше.

Складені цикли for[ред. | ред. код]

Введений в ALGOL 68 , а далі в PL/I, цикл for дозволяє поєднувати ітерацію циклу з тестом, наприклад:

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

Тобто значення присвоюється змінній циклу і, та лише якщо вираз while є істинним, тіло циклу буде виконано. Якщо результат був хибним, виконання циклу for припиняється. Враховуючи, що значення змінної циклу визначено після завершення циклу, тоді наведений вище оператор знайде перший непозитивний елемент у масиві A (а якщо такого немає, його значення буде N + 1), або, з відповідними варіантами, перший непустий символ у рядку тощо.