Можно ли заменить следующий бесконечный цикл на обычный цикл? Слышал, что всегда можно, но не понимаю как.
while (true) {
if (c1(a)) {
a = f1(a);
}
if (c2(a)) {
break;
}
a = f2(a);
}
Здесь f1, f2 - функции, возвращающие какое-то значение, зависящее от a, c1, c2 - условия (функции, возвращающие bool), зависящие от a.
upd:
под обычным я понимаю без break, continue, goto и прочих хаков, а чтобы условие было не постоянным/пустым
Заменить можно так
do {
if (c1(a)) {
a = f1(a);
}
cond = !c2(a);
if (cond)
a = f2(a);
} while (cond);
но в данном случае бесконечный цикл нагляднее
Например можно так. Но я бы не сказал что это улучшит читабельность.
for (;!c2(a=!c1(a)?:f1(a));a=f2(a));
Внезапный код-гольф?
Если вы хотите for (обычный) - то можно просто
for(;;) {
if (c1(a)) {
a = f1(a);
}
if (c2(a)) {
break;
}
a = f2(a);
}
Или
for(;;a = f2(a)) {
if (c1(a)) a = f1(a);
if (c2(a)) break;
}
Мне кажется, что так понятнее всего.
Если захотите, то можно ещё использовать Go to, но это не советуется использовать. Главное не забывайте, что нужно условие выхода, оно делается через
if() {
}
Самым практичным является
while (true) {
Тело
}
Либо
for(;;) {
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости