Pregunta

Tengo una pregunta y por favor ayúdame. He leído en la página web algo sobre hacer mientras que la declaración, diferente es que, mientras hay escrito 0, no una condición booleana

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

es claramente comprensible, pero este

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

No puedo adivinar qué hace? ¿Es una equivalencia a esto: hacer algo mientras (falso)? ¿O tal vez es un bucle infinito? Por favor ayúdame

¿Fue útil?

Solución

Hace algo solo una vez. Está ampliamente utilizado en macros a las declaraciones agrupar y hacer que el uso sea más natural (es decir, requerir fin de semicolon).

Cualquier compilador que valga la pena debe ignorar el Do ... mientras está completamente y simplemente ejecute las declaraciones adjuntas.

Otros consejos

Aunque este "bucle" se ejecuta solo una vez, uno puede usarlo de esta manera:

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);

En mi humilde opinión, en la mayoría de los casos es mejor reescribir esto de una manera más estructurada, ya sea de esta manera

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

o introduciendo una función separada, reflejando el alcance original:

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

      if(TestSomeConditions())
          return;

      // do something more
  }

Tratará 0 como falso y un bucle de tiempo se ejecutará y se romperá tan pronto como se alcance hasta que (compilador G ++ probado).

El bucle DO while ejecuta todas las instrucciones en el cuerpo del bucle primero y luego verifica la condición. Por lo tanto, este bucle solo ejecuta las instrucciones del cuerpo del bucle una vez.

do
{
    //my instructions
}while(0)

es equivalente a escribir

{
    //my instructions
}

¡Los compiladores modernos son lo suficientemente inteligentes como para optimizar estas cosas!

Técnicamente hablando, hace que se ejecute una vez, ya que verifica (y falla el cheque) después de que se ejecuta una vez.

Aparte de eso, se usa en macros. Por ejemplo:

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

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

conduciría a esto:

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

que no es una sintaxis válida, ya que el lo contrario ya no es parte de la declaración IF. Lo que puedes hacer es:

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

    ...

que se traduciría en una sola declaración en el bloque if:

if(a)
    do { something(1); something(2); } while(0);
else
    ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top