Зачем использовать {...} while (FALSE); в С++ вне макросов
Возможный дубликат:
Обходные циклы do-while-false?
Есть ли причина иметь такой код:
do {
// a lot of code that only needs to be run once
} while (FALSE);
когда код не определяет макрос? Я знаю, что это трюк, когда дело доходит до макросов, но есть ли причина для этого в нормальном коде?
Ответы
Ответ 1
Ну, это позволяет вам использовать ключевое слово break;
(или continue
) для раннего выхода, если по какой-то причине вам это нужно. Однако это было бы некрасиво. Я бы предпочел, чтобы это переместилось в свою собственную процедуру, а ранний выход был выполнен с помощью инструкции return;
.
Ответ 2
Ну, одна из причин этого - если вы захотите в какой-то момент вырваться.
то есть.
do
{
//some code that should always execute...
if ( condition )
{
//do some stuff
break;
}
//some code that should execute if condition is not true
if ( condition2 )
{
//do some more stuff
break;
}
//further code that should not execute if condition or condition2 are true
}
while(false);
В некоторых ситуациях результирующий код немного более понятный/понятный, если он написан как указано выше.
Ответ 3
Такая конструкция используется как вид goto
, чтобы иметь возможность прыгать после конца цикла, используя оператор break
внутри.
Ответ 4
Я бы не сделал этого, но:
Я выгляжу несколько логичнее, чем просто фигурные скобки
int main()
{
{
std::ifstream file("Data");
// DO STUFF
} // Data now closed.
// LOTS OF STUFF SO YOU CANT SEE file2 below.
// We can re-use data here as it was closed.
std::ofstream file2("Data");
// DO STUFF
}
Несвязанный сопровождающий может видеть фигурные скобки и думать.
Что черт и удалить их
int main()
{
std::ifstream file("Data");
// DO STUFF
// LOTS OF STUFF SO YOU CANT SEE file2 below.
// FAIL. data is still open from before.
std::ofstream file2("Data");
// DO STUFF
}
Я полагаю, что использование галочки по типу, по крайней мере, заставляет задуматься об этом (хотя сторонний сопровождающий может удалить его).
int main()
{
do
{
std::ifstream file("Data");
// DO STUFF
} while (false);
// LOTS OF STUFF SO YOU CANT SEE file2 below.
// We can re-use data here as it was closed.
std::ofstream file2("Data");
// DO STUFF
}
Ответ 5
Нет причин когда-либо писать цикл, который известен во время компиляции, выполнить ровно один раз.
Для этого, чтобы притвориться, что goto
написано как break
, является оскорбительным.
EDIT:
Я только что понял, что мое утверждение о знаниях времени компиляции ложно: я полагаю, что вы можете сделать что-то сложное с условными #defines, что может означать, что во время компиляции для одной конфигурации сборки он, как известно, выполняется один раз, но для другой конфигурации сборки он выполняется несколько раз.
#ifdef SOMETHING
#define CONDITION (--x)
#else
#define CONDITION 0
#endif
...
int x = 5
do{
...
} while(CONDITION)
Однако дух моего утверждения все еще стоит.
Ответ 6
Его можно использовать для реализации поведения, аналогичного выражению goto
, или скажем поведение jump!
Смотрите это:
do
{
if (doSomething() != 0) break; //jump
if (doSomethingElse() != 0) break; //jump
...
if (doSomethingElseNew() != 0) break; //jump
} while(false);
//if any of the break encountered, execution can continue from here, just after the do-while block!
// statement1
// statement2
// statement3
// so on
Взято отсюда: Обходные циклы do-while-false?