Цикл for
У большинства циклов со счётчиком одни и те же три части: переменная, созданная перед циклом, условие и изменение в конце блока:
int number = 1; // начало
while (number <= 5) { // условие
printf("%d\n", number);
number++; // шаг
}Считать так приходится настолько часто, что в C есть цикл, который собирает все три части в одной строке, — for:
for (int i = 1; i <= 5; i++) {
printf("%d\n", i);
}Оба цикла выводят одно и то же:
1
2
3
4
5В круглых скобках после for стоят три части, разделённые точками с запятой (;):
int i = 1— это начало. Оно создаёт переменную цикла и выполняется только один раз, перед всем остальным.i <= 5— это условие. Оно проверяется перед каждой итерацией. Когда оно ложно, цикл заканчивается.i++— это шаг. Он выполняется после каждой итерации, когда блок отработал.
Поэтому порядок такой: начало, условие, блок, шаг, условие, блок, шаг и так далее. В нашем цикле i равно 1, 1 <= 5 истинно, блок выводит 1, шаг делает i равным 2, 2 <= 5 истинно, блок выводит 2… После вывода 5 шаг делает i равным 6, 6 <= 5 ложно, и цикл заканчивается.
Переменную цикла часто называют i, но подойдёт любое имя. Она существует только внутри цикла. Если использовать i после цикла, компилятор её не знает:
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 3; i++) {
printf("%d\n", i);
}
printf("%d\n", i);
return 0;
}main.c:7:20: error: use of undeclared identifier 'i'
7 | printf("%d\n", i);
| ^
1 error generated.Необъявленный идентификатор (undeclared identifier) — это имя, которое компилятор в этом месте не знает. Если значение нужно после цикла, используйте цикл while с переменной, созданной перед ним, как в предыдущих упражнениях. Зато у каждого цикла может быть своя переменная i, ведь каждая i исчезает, когда заканчивается её цикл.
Разделяйте три части точками с запятой, а не запятыми. С запятыми, for (int i = 1, i <= 3, i++), компилятор запутается и сообщит сразу о нескольких ошибках. Первая из них, error: invalid '<=' at end of declaration; did you mean '='?, мало что объясняет. Когда ошибка указывает на строку с for, в первую очередь проверьте точки с запятой.
for или while? Используйте for, когда знаете, сколько раз выполнится цикл: от 1 до 10 или 7 раз по дням недели. Используйте while, когда заранее этого не знаете, например когда вы удваиваете число, пока оно не станет больше 1000:
int number = 1;
int doublings = 0;
while (number <= 1000) {
number = number * 2;
doublings++;
}
printf("Удвоений: %d\n", doublings);
printf("Число: %d\n", number);Удвоений: 10
Число: 1024Задание
- 1
Перепишите цикл
whileв редакторе как циклforс переменнойi. Удалите циклwhileи строку, которая создаётnumber. Программа по-прежнему выводит числа от 1 до 5. - 2
Измените свой цикл так, чтобы он выводил числа от 1 до 10 включительно.
- 3
Ниже напишите второй цикл
for, снова с переменнойi, который выводит квадраты чисел от 1 до 5:1 x 1 = 1,2 x 2 = 4и так далее до5 x 5 = 25, каждый на отдельной строке. Квадрат можно вычислить прямо вprintf:i * i.