0 в заявлении while - PullRequest
       0

0 в заявлении while

2 голосов
/ 18 октября 2011

У меня есть один вопрос, и, пожалуйста, помогите мне. Я читал на веб-странице что-то о выражении do while, но в то время как там написано 0, не булево условие

do{
   // do some instruction
}while(condition );

понятно, но этот

 do
  {
    //again some instruction
  }while(0);

Я не могу догадаться, что он делает? Это эквивалентно этому: сделать что-то, пока (false)? Или, может быть, это бесконечный цикл? Пожалуйста, помогите мне

Ответы [ 5 ]

6 голосов
/ 18 октября 2011

Делает что-то только один раз. широко используется в макросах для группировки операторов и делает использование более естественным (т. Е. Требует окончания точки с запятой).

Любой компилятор, достойный своей соли, должен игнорировать do .. в целом и просто запускать вложенные операторы.

3 голосов
/ 18 октября 2011

Хотя этот «цикл» выполняется только один раз, его можно использовать так:

do
{
  // declare some local variables only visible here
  // do something

  if(TestSomeConditions())
      break;

  // do something more
  // destructors of local variables run here automatically
}while(0);

ИМХО, в большинстве случаев лучше переписать это более структурированным способом, либо так:

  // do something
  if(!TestSomeConditions())
  {
      // do something more
  }

или введя отдельную функцию, отражающую исходную область действия:

  void MyFunction()
  {
      // declare some local variables only visible here
      // do something

      if(TestSomeConditions())
          return;

      // do something more
  }
1 голос
/ 18 октября 2011

С технической точки зрения, он запускает его один раз, так как он проверяет (и не проходит проверку) после того, как один раз запускается.

Кроме этого, он используется в макросах.Например:

#define blah(a) \
        something(1); \
        something(2)

if(a)
    blah(4);
else
    blah(19);

приведет к этому:

...
if(a)
    something(1); something(2);
else
    something(1); something(2);

, что не является допустимым синтаксисом, так как else больше не является частью оператора if.То, что вы можете сделать, это:

 define blah(a) \
    do {
       something(1); something(2);
    } while(0)

    ...

, который будет преобразован в один оператор в блоке if:

if(a)
    do { something(1); something(2); } while(0);
else
    ...
1 голос
/ 18 октября 2011

Он будет обрабатывать 0 как ложное, и один временной цикл будет выполняться и прерываться, как только будет достигнуто время (проверено компилятором g ++).

1 голос
/ 18 октября 2011

Цикл do while сначала выполняет все инструкции в теле цикла, а затем проверяет условие.Следовательно, этот цикл просто выполняет инструкции тела цикла один раз.

do
{
    //my instructions
}while(0)

эквивалентно записи

{
    //my instructions
}

Современные компиляторы достаточно умны, чтобы оптимизировать эти вещи!

...