В чем преимущество do-while (ложного)? - PullRequest
19 голосов
/ 18 сентября 2009

При просмотре кода, обработанного другим сотрудником, я вижу много кода, написанного на:

do{
    ...
}while(false);

Какое преимущество (если есть) это дает?

Вот еще скелет, который происходит в коде:

try{
    do{
        // Set some variables

        for(...) {
            if(...) break;
            // Do some more stuff
            if(...) break;
            // Do some more stuff
        }
    }while(false);
}catch(Exception e) { 
    // Exception handling 
}

Обновление:

C ++ Версия:
Являются ли циклы do-while-false обычными?

Ответы [ 14 ]

23 голосов
/ 18 сентября 2009

Может быть, это было сделано для того, чтобы в любой момент выпрыгнуть из «петли», например:

do
{
    ...
    if (somethingIsWrong) break;
    //more code
    ...
}
while(false);

Но, как говорили другие, я бы так не поступил.

17 голосов
/ 18 сентября 2009

В Java нет причин делать это.

В Си это общая идиома при определении макросов:

Рассмотрим:

#define macro1 doStuff(); doOtherStuff()
#define macro2 do{ doStuff(); doOtherStuff(); } while( false )

if( something ) macro1; // only the first statement in macro1 is executed conditionally
if( something ) macro2; // does what it looks like it does

... но макросы в Си злые и их следует избегать, если это вообще возможно.

Ваш коллега происходит из C-фона?

14 голосов
/ 18 сентября 2009

Нет преимуществ. Не делай этого.

5 голосов
/ 18 июля 2013

Может использоваться для перехода в конец блока, который может использоваться для избежания вложенных блоков if / then.

do {
    if (done()) continue;
    // do a bunch of stuff
    if (done()) continue;
    // do a bunch more stuff
    if (done()) continue;
    // do even more stuff
} while (false);
4 голосов
/ 18 сентября 2009

Используется в C для определения блока внутри макроса. См., Например, this .

Пример, следующее недопустимо:

#define f(x) { g(x); h(x); }

if (x >= 0) f(x); else f(-x);

но с этим определением будет работать:

#define f(x) do { g(x); h(x) } while(false)
3 голосов
/ 18 сентября 2009

Это бесполезно, но кодировщик мог использовать несколько команд прерывания, чтобы сделать некоторую странную обработку исключений.

do{
if(<something>){...}else{break}
if(<something else>){...}else{break}
...
}while(false)

Конечно, это глупо, но я однажды нашел что-то похожее на старую программу на c

2 голосов
/ 18 сентября 2009

Ваша интуиция права. Это совершенно бесполезная вещь.

Возможно , что тот, кто закодировал его изначально, имел в качестве условия нечто иное, чем false, и просто изменил его на false вместо удаления всего блока, чтобы не потерять эту "историю" код. Это только цепляние за соломинку как бы то ни было. Откровенно говоря, это просто пример тавтологии , которой нет места в коде.

1 голос
/ 02 июня 2016

Я использовал это соглашение в течение многих лет! Это наиболее полезно, когда у вас есть «конвейер» обработки и / или условных проверок. Он просто избегает нескольких уровней вложенных операторов if () и, таким образом, делает код (намного) более удобным для чтения. Да, есть альтернативы, такие как try / catch, и я использую этот стиль только в определенных тонких / низкоуровневых ситуациях.

Я запускаю «цикл» (на самом деле никогда не циклы) с комментарием вроде ...

// Error loop (never loops)

Цикл ошибки ...

set errorCode = fail;
do {
  if (this)
    break;

  if (that)
    break;

  // Success
  set errorCode = ok;

  // Alternative Success
  errorCode = doWhatever();
} while (false);

Рассмотрите этот стиль, если у вас есть куча вложенных операторов if () и ваши отступы имеют глубину более 3-х уровней.

Я использовал это соглашение в Perl, C / C ++, Java и Delphi / Pascal.

1 голос
/ 30 марта 2010

Его можно использовать для пропуска выполнения некоторого кода (например, goto или чего-то подобного), но когда я смотрю на него снова, кажется, что в цикле for (где находятся операторы if(...) break;) do-while. В противном случае я бы сказал, что это будет версия Java goto ...

.
1 голос
/ 18 сентября 2009

Как заполнитель для будущего, когда вместо false.

ставится какое-то другое условие.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...