Замена бесконечного цикла

198
11 октября 2021, 16:10

Можно ли заменить следующий бесконечный цикл на обычный цикл? Слышал, что всегда можно, но не понимаю как.

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 и прочих хаков, а чтобы условие было не постоянным/пустым

Answer 1

Заменить можно так

do {
  if (c1(a)) {
    a = f1(a);
  }
  cond = !c2(a);
  if (cond)
    a = f2(a);
} while (cond);

но в данном случае бесконечный цикл нагляднее

Answer 2

Например можно так. Но я бы не сказал что это улучшит читабельность.

for (;!c2(a=!c1(a)?:f1(a));a=f2(a));

Внезапный код-гольф?

Answer 3

Если вы хотите 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;
}

Мне кажется, что так понятнее всего.

Answer 4

Если захотите, то можно ещё использовать Go to, но это не советуется использовать. Главное не забывайте, что нужно условие выхода, оно делается через

if() {
}

Самым практичным является

while (true) {
Тело
}

Либо

for(;;) {
}
READ ALSO
Оптимизация кода по обращению к памяти

Оптимизация кода по обращению к памяти

Необходимо написать оптимальную по обращению к памяти функцию для обрезки пробелов справаСама обрезка сложностей не вызывает, непонятно,...

226
Не выходит вывести результат в следующей программе

Не выходит вывести результат в следующей программе

Вывести на экран таблицу значений функции Y(x) и ее разложения в ряд S(x) с точностью ε (табл8

169
Обрезка файла C++

Обрезка файла C++

Есть у меня файл :

111