0 в операторе while


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

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

Понятно, но этот

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

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

5 2

5 ответов:

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

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

Хотя этот" цикл " выполняется только один раз, можно использовать его следующим образом:

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
  }

Он будет рассматривать 0 как false и один цикл времени будет выполняться и прерываться, как только достигнет while (G++ compiler tested).

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

do
{
    //my instructions
}while(0)

Эквивалентно написанию

{
    //my instructions
}

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

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

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

#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
    ...