0 nel while
-
25-10-2019 - |
Domanda
Ho una domanda e si prega di aiuto me.i aver letto sulla pagina web somthing circa fare while, diverso è che, nel mentre c'è scritto 0, non condizione booleana
do{
// do some instruction
}while(condition );
è chiaramente comprensibile, ma questo
do
{
//again some instruction
}while(0);
? Non riesco a immaginare che cosa fa è equivalenza a questo:?? Fare qualcosa mentre (false) o forse si tratta ciclo infinito please help me
Soluzione
Si fa qualcosa solo una volta. E ' ampiamente utilizzato nelle macro alle dichiarazioni di gruppo e rendere l'utilizzo più naturale (cioè richiedono fine e virgola).
Ogni compilatore degno dovrebbe ignorare il do .. mentre del tutto e solo eseguire le istruzioni allegate.
Altri suggerimenti
Anche se questo "loop" viene eseguito solo una volta, si può usare in questo modo:
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);
IMHO, nella maggior parte dei casi è meglio di riscrivere questo in maniera più strutturata, sia in questo modo
// do something
if(!TestSomeConditions())
{
// do something more
}
oppure introducendo una funzione separata, riflettendo la portata originale:
void MyFunction()
{
// declare some local variables only visible here
// do something
if(TestSomeConditions())
return;
// do something more
}
Si tratterà 0 per falso e un loop volta eseguirà e rompere non appena raggiunto a while (g ++ compilatore testato).
Il ciclo Do While esegue tutte le istruzioni del corpo del ciclo prima e quindi verifica per la condizione. Quindi, questo ciclo solo esegue le istruzioni del corpo del ciclo, una volta.
do
{
//my instructions
}while(0)
è equivalente alla scrittura
{
//my instructions
}
I compilatori moderni sono abbastanza intelligente per ottimizzare queste cose!
Tecnicamente parlando, lo rende eseguito una volta, in quanto i controlli (e non supera il controllo) dopo che viene eseguito una volta.
Oltre a questo, è utilizzato nelle macro. Ad esempio:
#define blah(a) \
something(1); \
something(2)
if(a)
blah(4);
else
blah(19);
porterebbe a questo:
...
if(a)
something(1); something(2);
else
something(1); something(2);
che non è sintassi valida, come il resto non fa parte della istruzione if più. Che cosa si può fare è:
define blah(a) \
do {
something(1); something(2);
} while(0)
...
, che si tradurrebbe in una singola istruzione nel blocco if:
if(a)
do { something(1); something(2); } while(0);
else
...