Если существует только одно условие, при котором цикл может завершиться, и не существует большого количества кода, который необходимо выполнить перед проверкой условия, и не существует большого количества кода, который необходимо выполнить после проверяя условие, поместите условие в цикл.
Я действительно думаю, что есть определенное использование для "do {} while (1);" петля. Среди них:
- В случае продолжения цикла первичное условие должно иметь достаточное количество кода, выполняемого как до, так и после проверки того, что помещение кода в само условие будет в лучшем случае неудобным.
- Цикл имеет несколько условий выхода, и условие выхода, которое наиболее логично расположено в верхней или нижней части цикла, потребует специального кода для выполнения, который не должен выполняться для других условий выхода.
Некоторым людям нравится использовать флаги для различения условий выхода. Я склонен рассматривать такие флаги как попытку избежать структур кодирования, которые фактически лучше всего воплощают действие программы.
Если кто-то не слишком обеспокоен скоростью, можно избежать использования любой формы goto , преждевременного выхода return , или, в этом отношении, используя более одного while - и это с простым условием. Просто напишите всю свою программу как конечный автомат:
void do_whatever(void)
{
int current_state=1;
do
{
next_state = 0;
if (current_state == 1)
{
do_some_stuff();
next_state = 2;
}
if (current_state == 2)
{
do_some_more_stuff();
next_state = 3;
}
...
current_state = next_state;
} while(current_state);
}
Бывают случаи, когда такое кодирование полезно (особенно если «while» может быть извлечено из подпрограммы do_whwhat () в цикл, который запускает несколько подпрограмм с одинаковым кодированием «одновременно»). И никогда не нужно использовать что-то вроде «goto». Но для удобства чтения конструкции структурированного программирования гораздо приятнее.
На мой взгляд, использование флага для выхода из цикла, а затем выбор одного из нескольких фрагментов кода для выполнения на основе причины выхода означает замену структурированного кода неструктурированным кодом. Если внутри цикла я пишу
if (index >= numItems)
{
createNewItem(index);
break;
}
сразу (и локально) ясно, что причина, по которой я создаю новый элемент, заключается в том, что мой индекс превысил количество элементов, и мне не нужно избыточно проверять условие. Если вместо этого я выполняю цикл до тех пор, пока не найду что-то или не исчерпал элементы, то мне придется либо избыточно проверить условие после цикла, либо добавить проверку флага для каждой итерации цикла.