Предположим, у меня есть цикл в C ++ или C #, который выглядит следующим образом:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Это обычно называют «бесконечным циклом». Тем не менее, он не является технически бесконечным - он остановится, как только контроль пройдет break
.
Как называется такой цикл - в нем есть оператор управления циклом «цикл навсегда» и «разрыв» внутри?
terminology
Sharptooth
источник
источник
condition()
всегда возвращает false? Я бы сказал, что это бесконечный цикл с условными разрывами.break
цикл не является бесконечным (kill
, ctrl-alt-del, unplug ...). Так зачем беспокоиться о деталях терминологии?Ответы:
Изучая CS, этот профессор научил нас, что есть циклы предварительной проверки (
while(cond) {}
), циклы последующей проверки (do {} while(cond);
) и циклы средней проверки . (Я мог бы плохо перевести это на английский, но вы поняли.)C и C ++ не имеют последних (ISTR Ada, BICBW), поэтому ваша конструкция используется для этого в C и C ++.
источник
loop ... exit when condition; ... end loop;
Самый первый курс по CS в Стэнфорде ( Методология программирования Мехрана Сахами ) называет это циклом с половиной . И это не обязательно плохая практика программирования. Рассмотрим этот пример по сбору пользовательского ввода (взято из книги «Искусство и наука о Java» Эрика Робертса , где Робертс также называет это « петлей с половиной» ):
И затем то же самое было решено с использованием цикла с половиной идеи, чтобы избежать дублирования кода:
источник
Не имея официального названия, я бы назвал его « Сломанная петля» . Предполагается неоднозначность этого термина, поскольку разрыв в середине цикла немного нечист, почти как a
goto
.источник
goto
также были действительные приложения, например, эмуляция блока try ... finally в C.while(XEventGet(&ev) != NULL){ ... }
, вы , естественно , будете хотеть , чтобы проверить ключи внутри цикла:if(ev.key == XK_q) break;
. Делать следующее:while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }
уродливо и, возможно, труднее для чтения, чем разрыв в середине цикла. Кроме того, что, если что-то нужно сделать со значением, прежде чем его можно будет проверить? Ты же не собираешься всерьез вставлять все это в базовый вариант цикла?Там нет окончательного названия. Я думаю, что бесконечный цикл - это подходящий термин. Никакие циклы не являются действительно бесконечными, но это потенциально может быть фактически бесконечным, поскольку вполне возможно, что ветвь, содержащая разрыв, никогда не произойдет.
Если вы скажете кому-то «создать бесконечный цикл и использовать разрыв для условия X», и они поймут, что вы имеете в виду. Если кто-то просматривает ваш код и говорит не что иное, как «мне не нравится бесконечный цикл, который вы написали», вы поймете, о чем он говорит (если, конечно, у вас их больше одного).
источник
while
цикле, и способ подтверждения завершения точно такой же (поиск монотонно убывающей метрики - отличное начало).Это цикл с условным заданием в неправильном месте.
источник
break
илиcontinue
. Избегайте дозорных значений любой ценой, это просто еще одна произвольная часть состояния, которую нужно мысленно отслеживать, которая маскирует цель кода.Я бы проголосовал за «безусловный цикл» , похожий на «безусловный переход». Он иллюстрирует, что именно происходит (код выполняется без каких-либо условий), не обманывая (в отличие от «бесконечного цикла»).
источник
if
/break
в середине является частью шаблона.Это бесконечный цикл с условием разрыва.
Я согласен с ammilind в том, что если вы хотите дать ему специальное имя, вы можете назвать его бесконечной частичной петлей
источник
В коде Розетты этот конкретный шаблон описывается как цикл «N плюс одна половина» . Хотя это не мой любимый термин, он не ужасен и, несомненно, является шаблоном, который полезен для некоторых типов циклов. (Альтернативой является дублирование кода «до условия», что может быть сложно в реальных программах, или увеличение глубины вложения кода после условия при добавлении переменной условия цикла; ни улучшается удобство сопровождения или понятность кода Единственная причина отклонения таких конструкций - если кто-то настаивает на написании циклов, чтобы быть
break
свободными.)источник
Стандартного термина нет, но я бы сказал, что это частичный цикл .
Этот цикл используется, когда вы хотите разорвать только после выполнения какой-то части цикла в последний раз (то есть частичное выполнение). Он используется, когда вы не находите подходящую ситуацию, когда вы можете разорвать весь цикл .
В этом случае вы хотите разорвать цикл после хотя бы
doSomething()
одного выполнения в последний раз.источник
Я должен согласиться с sbi здесь - мне нравится термин цикла проверки середины . Этот вид конструкции был более популярен, когда начали развиваться структурированные программы, и многие языки имели синтаксическую поддержку для них.
Тем не менее, в настоящее время широко известно, что
while
циклы, как правило, более управляемы, так как об инвариантах легче рассуждать, и они часто лучше справляются с хитрым пустым случаем.В вашем конкретном случае ваш цикл просто эквивалентен
поэтому я хотел бы использовать только
break
версию , если либоdoSomething
илиdoSomethingElse
привлеченные несколько операторов , и я предпочел бы не убрать их на отдельные функции , как вы делали.Тем не менее, если ваш цикл более сложный, чем итерация (начало, проверка, приращение), то вам следует рассмотреть возможность его реорганизации в нечто более простое.
источник
Я думаю, если мы собираемся попытаться придумать термин для этого, может быть:
источник
Я называю это тем, что есть, «пока истинный цикл».
Также посмотрите, является ли (правда) плохой практикой программирования?
источник
Это не так плохо в каждом случае. Я пишу такие циклы с определенными API-интерфейсами. Скажем, например, что у вас есть объект цикла, и вам нужно проверить какое-то условие достаточно глубоко в нем, например:
Теперь предположим, что каждый метод getXXX потенциально может возвращать ноль. Тогда можно было бы написать логическое выражение, хотя и довольно сложное и нечитаемое. И затем мы должны повторить почти то же самое, чтобы получить текущий объект-обработчик. В таких случаях мне легче написать
while (true)
цикл с break и продолжить.источник