Чем отличаются while, do-while и for в C#?
Только разбираюсь с циклами и запутался: есть while, do-while и for, и все вроде что-то повторяют. В каких случаях брать какой? Слышал, что do-while «выполнится хотя бы раз» — что это значит на практике? И как сделать бесконечный цикл, если он вдруг понадобится?
2 ответа
Все три повторяют код, но отличаются моментом проверки условия и удобством для разных задач.
while — цикл с предусловием. Условие проверяется до тела. Если оно сразу ложно — тело не выполнится ни разу.
int i = 0;
while (i < 3)
{
Console.WriteLine(i); // 0, 1, 2
i++;
}
do-while — цикл с постусловием. Тело выполняется, и только потом проверяется условие. Поэтому тело гарантированно отработает хотя бы один раз, даже если условие изначально ложно.
int n;
do
{
Console.Write("Введи число > 0: ");
n = int.Parse(Console.ReadLine());
}
while (n <= 0); // переспрашиваем, пока не введут корректное
Это идеальный кейс: меню или запрос ввода надо показать минимум один раз, а повторять — по ситуации.
for — тот же while, но с местом для счётчика. Удобен, когда заранее известно число итераций. Всё про счётчик собрано в одной строке: инициализация; условие; шаг.
for (int j = 0; j < 5; j++)
{
Console.WriteLine(j); // 0..4
}
Как выбирать:
- Знаешь, сколько раз крутить (по индексу, по диапазону) —
for. - Крутишь «пока выполняется условие», число итераций неизвестно —
while. - То же, но тело надо выполнить хотя бы раз —
do-while.
Бесконечный цикл и управление. Иногда нужен цикл «навсегда» с выходом изнутри:
while (true)
{
var cmd = Console.ReadLine();
if (cmd == "exit") break; // выходим из цикла
if (cmd == "") continue; // пропускаем итерацию, идём дальше
Console.WriteLine($"Команда: {cmd}");
}
break полностью прерывает цикл, continue пропускает остаток текущей итерации и переходит к следующей проверке. Без break внутри while(true) программа зависнет — это важно держать в голове.
Короткое практическое наблюдение: for и while взаимозаменяемы — for(init; cond; step) это ровно init; while(cond){ ...; step; }. Выбор между ними — вопрос читаемости: если есть явный счётчик, for держит его в одном месте и меньше шансов забыть инкремент (классический баг бесконечного while — забыли i++).
И да, не путай do-while с обычным while: точка с запятой после условия в do-while обязательна, забудешь — получишь ошибку компиляции.