Цикл do-while
Цикл while проверяет условие перед каждой итерацией. Если условие ложно с самого начала, блок не выполняется ни разу. Обычно именно это и нужно. Но иногда блок должен выполниться хотя бы один раз. Для этого в C есть цикл do ... while, который проверяет условие после каждой итерации:
int count = 1;
do {
printf("%d\n", count);
count++;
} while (count <= 3);1
2
3Сначала идёт ключевое слово do, затем блок, а условие стоит в конце, после закрывающей скобки. Программа выполняет блок, затем проверяет условие, и если оно истинно, выполняет блок снова. Обратите внимание на точку с запятой после условия: } while (count <= 3);. Без неё компилятор сообщает error: expected ';' after do/while statement.
Разница заметна, когда условие ложно с самого начала:
int count = 10;
do {
printf("%d\n", count);
count++;
} while (count <= 3);10Блок выполняется один раз и выводит 10, и только потом цикл выясняет, что 11 <= 3 ложно. Цикл while с тем же условием не вывел бы ничего.
Когда это полезно? Допустим, вы хотите посчитать цифры в числе. Целочисленное деление на 10 отбрасывает последнюю цифру (2026 / 10 равно 202), поэтому можно делить, пока ничего не останется: 2026, 202, 20, 2, 0. Это четыре деления, значит, в числе четыре цифры:
int number = 2026;
int digits = 0;
do {
digits++;
number /= 10;
} while (number > 0);
printf("Цифр: %d\n", digits);Цифр: 4Для 2026 подошёл бы и цикл while. Но число 0 тоже записывается одной цифрой, а для 0 цикл while (number > 0) не выполнился бы вовсе, и программа сказала бы, что в нём 0 цифр. Цикл do ... while выполняет блок хотя бы один раз, так что 0 получает свою одну цифру.
На практике do ... while используют гораздо реже, чем while и for. В программах на вашем компьютере он удобен, когда программа о чём-то спрашивает пользователя и спрашивает снова, пока ответ неверный. Программы на этом сайте получают данные из переменных, так что вам он понадобится нечасто.
Задание
- 1
Программа в редакторе считает цифры числа
number. Запустите её: она выводитЦифр: 0, но 0 записывается одной цифрой. Перепишите циклwhileкак циклdo ... while:doперед блоком иwhile (number > 0);после его закрывающей скобки. Тогда программа выведетЦифр: 1. - 2
Проверьте, что цикл по-прежнему работает для других чисел: измените значение
numberна2026. Программа выведетЦифр: 4.