"} While (0);" всегда равно "break;} while (1);"? - PullRequest
4 голосов
/ 11 июня 2010

Я сравнил вывод ассемблера gcc

do{ 

//some code 

}while(0);

с

do{

//some code

 break; 
}while(1);

Выход равен, с оптимизацией или без, но ..

Это всегда такКстати?

Никакой эксперимент не может доказать теории, они могут только показать, что они не правы

Ответы [ 6 ]

18 голосов
/ 11 июня 2010

Есть небольшая разница:

do {
  // code
  if ( condition )
    continue;
  // code
  break;
} while(1);

Перезапустит цикл, когда значение condition равно true, тогда как в версии } while(0); значение continue будет эквивалентно break.

Если нет continue, то они должны выдавать точно такой же код.

5 голосов
/ 11 июня 2010

Формы не эквивалентны.Это бесконечный цикл:

do {
    continue;
    break;
} while (1);

Это не так:

do {
    continue;
} while (0);
4 голосов
/ 11 июня 2010

Комментарий Маркуса указал мне на этот ответ: разница в использовании ключевого слова continue.

В этом случае:

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
    } while(0);

    return 0;
}

вы получаете только одну итерацию, тогда как в этом случае:

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
        break;
    } while(1);

    return 0;
}

вы получаете 30 итераций. Протестировано под VS2008.

4 голосов
/ 11 июня 2010

Редактировать: После прочтения различных комментариев по этому вопросу, я признаю, что этот ответ является неправильным. К сожалению.

Вместо:

do{ 

//some code 

}while(0);

или

do{

//some code

 break; 
}while(1);

Я бы просто использовал:

//some code

Я не уверен на 100%, можете ли вы сделать это в C ++, но если вы хотите ограничить область действия переменных, и именно поэтому вы делаете это, просто используйте фигурные скобки:

{

 // Some Code

}
3 голосов
/ 11 июня 2010

Предложения do while логически эквивалентны.Если они переведены в один и тот же байт-код, зависит от используемого компилятора.Я думаю, что большинство современных компиляторов будут относиться к ним одинаково.

0 голосов
/ 11 июня 2010

РЕДАКТИРОВАТЬ на основе вашего комментария, который вы используете некоторое время с break s, чтобы иметь возможность вырваться из «цикла» при выполнении определенных условий.

Если это то, чего вы пытаетесь достичь:

do
{ 
  // processing step 1
  if( some_condition )
    break;
  // processing step 2
  if( some_condition )
    break;
  // etcetera..
} while(0)

... затем просто разбейте код, который у вас есть в цикле while, на отдельную функцию с множественным возвратом:

void processing()
{

  // processing step 1
  if( some_condition )
    return;
  // processing step 2
  if( some_condition )
    return;
  // etcetera..
}

int main()
{
  // ...
  processing();
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...