Цикл for
В прошлом уроке цикл while повторял тело, пока условие истинно, а счётчик жил отдельно: его объявляли до цикла и меняли в теле. Когда число повторений известно заранее, всё это собирают в одну строку — заголовок цикла for.
Вернёмся к бегуну. Теперь тренер говорит точно: «Пробеги сто кругов». Бегун выходит на старт, перед каждым кругом сверяется со счётом под аркой, а после круга ставит отметку в блокноте. Цикл for устроен так же. Сложим числа от 1 до 100:
int sum = 0;
for (int i = 1; i <= 100; i++)
{
sum += i;
}
Console.WriteLine(sum); // 5050Три части заголовка
В скобках после for стоят три части через точку с запятой:
int i = 1выполняется один раз, до начала цикла. Бегун выходит на старт.- Условие
i <= 100проверяется перед каждой итерацией. Если оно истинно, выполняется тело в фигурных скобках. Это проверка под аркой перед кругом. - Шаг
i++выполняется после тела. Это отметка в блокноте.
Теперь пройдём по программе:
int sum = 0;заводит сумму.for (int i = 1; i <= 100; i++)повторяет тело дляiот1до100.sum += i;добавляет к сумме очередноеi.Console.WriteLine(sum)стоит после закрывающей скобки цикла. Он выполняется один раз, когда цикл уже закончился, и выводит5050.
Порядок частей заголовка — то место, где новички путаются чаще всего. В виджете тот же цикл, но до 3: нажимайте «Следующий шаг» и следите, когда выполняется каждая часть заголовка.
1int sum = 0;2 3for (int i = 1; i <= 3; i++)4{5 sum += i;6}7 8Console.WriteLine(sum);
int sum = 0 заводит сумму.
Шаг i++ выполняется после тела, а условие — перед ним. Поэтому последняя проверка 4 <= 3 ложна, и тело с i, равной 4, не выполняется. Условие проверяется и перед первой итерацией: если оно ложно сразу, тело не выполнится ни разу.
На собеседовании часто дают короткий цикл и просят предсказать, что он выведет. Такие задачи проверяют именно этот порядок частей заголовка.
Здесь картинка со стадионом неточна. Блокнот с отметками остаётся у бегуна и после забега, а переменная i исчезает вместе с циклом: на последнем шаге виджета её уже нет.
for и while
Любой for можно переписать через while. Вот та же сумма:
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++. Счётчик может уменьшаться или расти на любое число:
for (int i = 10; i > 0; i -= 3)
{
Console.WriteLine(i);
}
// 10
// 7
// 4
// 1Разберём по шагам:
int i = 10задаёт стартовое значение10.- Условие
i > 0проверяется перед каждой итерацией. - Шаг
i -= 3после тела уменьшаетiна3, и программа печатает10,7,4,1. - После
1шаг даёт-2, условие-2 > 0ложно, и цикл заканчивается.
Частая ошибка
Переменную цикла прочитали после цикла:
for (int i = 0; i < 3; i++)
{
Console.WriteLine(i);
}
Console.WriteLine(i); // ✗error CS0103: The name 'i' does not exist in the current contextПрограмма не компилируется. Переменная, объявленная в заголовке for, видна только внутри цикла: в заголовке и в теле. За закрывающей скобкой цикла имени i уже нет, как и самой переменной. Если значение нужно после цикла, объявите переменную до него, как в варианте с while.
Главное
- В заголовке
forтри части: начальное значение задаётся один раз, условие проверяется перед каждой итерацией, шаг выполняется после тела. - Если условие ложно сразу, тело
forне выполнится ни разу. - Любой
forможно переписать черезwhile: начальное значение до цикла, шаг в конце тела. - Переменная из заголовка
forвидна только внутри цикла.