do...while
Цикл do...while гарантирует хотя бы одно выполнение тела, а затем проверяет условие — удобно для опроса датчиков или ожидания ввода.
Полная статья
Описание
Цикл do...while похож на while, но с одним важным отличием: условие проверяется после выполнения тела цикла, а не до. Это гарантирует, что код внутри блока do выполнится как минимум один раз — даже если условие изначально ложно.
Это отличие принципиально: обычный while может не выполниться ни разу, если условие ложно с самого начала. do...while такого не допускает.
Синтаксис
do {
// блок операторов
} while (condition);
Параметры
condition: логическое выражение, результат которого равен true или false. Пока оно истинно, цикл продолжается. Как только становится ложным — выполнение переходит к следующей строке после цикла.
Пример кода
// инициализация x и i значением 0
int x = 0;
int i = 0;
do {
delay(50); // ожидание стабилизации датчиков
x = readSensors(); // считывание показаний датчиков
i++; // увеличение i на 1
} while (i < 100); // повторить 100 раз
Где применяется
- Ожидание пользовательского ввода — когда нужно хотя бы раз прочитать данные с кнопки или сенсора, прежде чем проверять условие.
- Меню и диалоги — показать пункты меню один раз, а потом повторять, пока не выбран правильный вариант.
- Инициализация с проверкой — выполнить попытку подключения к устройству и повторять её, если устройство не ответило.
- Опрос датчика до получения стабильного значения — считать показание и повторять, пока оно не попадёт в допустимый диапазон.
Практические замечания
- Не забывайте точку с запятой после закрывающей скобки условия:
while (condition);— это обязательная часть синтаксисаdo...while, без неё скетч не скомпилируется. - Если условие всегда остаётся
true, цикл станет бесконечным и заблокирует выполнение остального кода. Убедитесь, что внутри тела цикла что-то изменяет переменные, влияющие наcondition. do...whileудобен именно тогда, когда первое выполнение тела цикла необходимо для получения данных, которые затем проверяются в условии — например, чтение с Serial или опрос кнопки.- Если тело цикла должно выполниться ноль или более раз (то есть может не выполниться вовсе), используйте обычный
whileвместоdo...while.