Перейти к содержимому
Теория · Условия и циклы · урок 7 из 13

Цикл for

В прошлом уроке цикл while повторял тело, пока условие истинно, а счётчик жил отдельно: его объявляли до цикла и меняли в теле. Когда число повторений известно заранее, всё это собирают в одну строку — заголовок цикла for.

Вернёмся к бегуну. Теперь тренер говорит точно: «Пробеги сто кругов». Бегун выходит на старт, перед каждым кругом сверяется со счётом под аркой, а после круга ставит отметку в блокноте. Цикл for устроен так же. Сложим числа от 1 до 100:

C#
int sum = 0;

for (int i = 1; i <= 100; i++)
{
    sum += i;
}

Console.WriteLine(sum); // 5050

Три части заголовка

В скобках после for стоят три части через точку с запятой:

  1. int i = 1 выполняется один раз, до начала цикла. Бегун выходит на старт.
  2. Условие i <= 100 проверяется перед каждой итерацией. Если оно истинно, выполняется тело в фигурных скобках. Это проверка под аркой перед кругом.
  3. Шаг i++ выполняется после тела. Это отметка в блокноте.

Теперь пройдём по программе:

  1. int sum = 0; заводит сумму.
  2. for (int i = 1; i <= 100; i++) повторяет тело для i от 1 до 100.
  3. sum += i; добавляет к сумме очередное i.
  4. Console.WriteLine(sum) стоит после закрывающей скобки цикла. Он выполняется один раз, когда цикл уже закончился, и выводит 5050.

Порядок частей заголовка — то место, где новички путаются чаще всего. В виджете тот же цикл, но до 3: нажимайте «Следующий шаг» и следите, когда выполняется каждая часть заголовка.

ВживуюПорядок частей forшаг 1 из 13 · рамок: 1

int sum = 0 заводит сумму.

Рамка Main показывает переменные программы после каждого шага

Шаг i++ выполняется после тела, а условие — перед ним. Поэтому последняя проверка 4 <= 3 ложна, и тело с i, равной 4, не выполняется. Условие проверяется и перед первой итерацией: если оно ложно сразу, тело не выполнится ни разу.

На собеседовании часто дают короткий цикл и просят предсказать, что он выведет. Такие задачи проверяют именно этот порядок частей заголовка.

Здесь картинка со стадионом неточна. Блокнот с отметками остаётся у бегуна и после забега, а переменная i исчезает вместе с циклом: на последнем шаге виджета её уже нет.

for и while

Любой for можно переписать через while. Вот та же сумма:

C#
int sum = 0;
int i = 1;

while (i <= 100)
{
    sum += i;
    i++;
}

Console.WriteLine(sum); // 5050

Части заголовка for разошлись по своим местам:

  • начальное значение int i = 1 стоит до цикла;
  • условие i <= 100 стоит в скобках while;
  • шаг i++ стоит в конце тела, после sum += i, и поэтому выполняется после тела, как в for.

Одно отличие всё же есть: здесь i объявлена до цикла и живёт после него, а i из заголовка for видна только внутри цикла.

for выбирают, когда известно, сколько раз повторять: для каждого числа от 1 до 100. while выбирают, когда повторять нужно, пока что-то не случится.

Шаг может быть любым

Шаг не обязан быть i++. Счётчик может уменьшаться или расти на любое число:

C#
for (int i = 10; i > 0; i -= 3)
{
    Console.WriteLine(i);
}
// 10
// 7
// 4
// 1

Разберём по шагам:

  1. int i = 10 задаёт стартовое значение 10.
  2. Условие i > 0 проверяется перед каждой итерацией.
  3. Шаг i -= 3 после тела уменьшает i на 3, и программа печатает 10, 7, 4, 1.
  4. После 1 шаг даёт -2, условие -2 > 0 ложно, и цикл заканчивается.

Частая ошибка

Переменную цикла прочитали после цикла:

C#
for (int i = 0; i < 3; i++)
{
    Console.WriteLine(i);
}

Console.WriteLine(i); // ✗
TEXT
error CS0103: The name 'i' does not exist in the current context

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

Главное

  • В заголовке for три части: начальное значение задаётся один раз, условие проверяется перед каждой итерацией, шаг выполняется после тела.
  • Если условие ложно сразу, тело for не выполнится ни разу.
  • Любой for можно переписать через while: начальное значение до цикла, шаг в конце тела.
  • Переменная из заголовка for видна только внутри цикла.