Циклы¶
Используются для того, чтобы совершить несколько одинаковых действий подряд.
Итерация — один "пробег" по командам внутри цикла.
Нередко требуется и понятие вложенных циклов — когда один из них находится внутри другого и, соответственно, сам выполняется столько раз, сколько работает внешний цикл. От многократной вложенности в целях оптимизации обычно следует избавляться, потому что во вложенных циклах время исполнения растёт очень, очень быстро. Например, простой цикл тройной вложенности, на каждом уровне которого исполняется всего десять операций, будет суммарно иметь 10³ = 1000 итераций.
Общепринятое обозначение переменных в цикле¶
Обычно длинные названия переменных для использования внутри циклов не делают, за исключением случаев, когда это необходимо для облегчения понимания.
Переменная во внешнем цикле зовётся "i" (сокращение от английского "iterator"), в первом вложенном — "j" (как следующая буква после "i"), во втором вложенном — "k" и так далее.
for¶
Наверное, самый известный цикл в любом языке программирования. Позволяет указать инициализирующие значения, условие выхода и действие в конце каждой итерации цикла. Зачастую — с какого числа начинать, каким заканчивать и каков шаг.
Синтаксис:
for ( инициализация; условие_конца_цикла; действие ) {
// Здесь тело цикла.
}
// Пример:
for ( int i = 0; i < 10; i++ ) {
console.printf( "Current i: " .. i );
// Будет выведено:
//"Current i: 0";
//"Current i: 1";
//<...>
//"Current i: 9".
}
Для единственной команды в теле цикла операторные скобки также, как и в случае с условиями, можно не ставить.
Также можно не указывать один или более параметров. Так, в примере ниже объявление переменной i вынесено за цикл, и потому в самом for () пропущено.
int i = 6;
for ( ; i < 99; i += 5 )
console.printf( "From 6 to 98, step 5: " .. i );
// Вывод:
//"From 6 to 98, step 5: 6";
//"From 6 to 98, step 5: 11";
//<...>
//"From 6 to 98, step 5: 96";
Условие выхода проверяется до начала новой итерации (в том числе и перед первой), поэтому блок кода внутри "for" может не исполниться вовсе.
for ( int i = 10; i < 5; i++ ) {
// Строка не будет выведена: "10" сразу больше, чем "5", и
//поэтому тело цикла не исполнится ни разу.
console.printf( "This string will never be printed..." );
}
while¶
Цикл с предусловием выхода. По сравнению с "for" нет ни инициализации, ни что делать в конце шага. Также может не выполниться ни разу.
Синтаксис:
while ( условие_конца_цикла ) {
// Тело цикла.
}
// Пример:
int a = 82445;
while ( a != 0 ) {
console.printf( "Last digit: " .. a % 10 );
a /= 10;
// "Last digit: 5";
// "Last digit: 4";
// "Last digit: 4";
// "Last digit: 2";
// "Last digit: 8".
}
Ради единственной команды операторный блок можно не выделять:
do..while¶
Цикл с постусловием выхода, то есть тело цикла исполнится хотя бы один раз перед проверкой на условие окончания.
Синтаксис:
Пример аналогичен; ради одной команды логический блок также можно не выделять.