Зачем использовать {...} 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?