2011-12-25 4 views
5

Diamo un'occhiata al seguente ciclo do-while. È abbastanza ovvio e non c'è dubbio al riguardo.loop di do-while con continua e con e senza etichetta in Java

do 
{ 
    System.out.println("Hello world"); 
    break; 
} while(false); 

E 'abbastanza ovvio e solo visualizza la stringa Ciao mondo sulla console ed esce.


Ora, la seguente versione di do-while sembra essere rimanere bloccati in un ciclo infinito, ma non è così. Visualizza anche la stringa Hello world sulla console ed esce silenziosamente.

do 
{ 
    System.out.println("Hello world"); 
    continue; 
} while(false); 

Vediamo l'ennesima versione di do-while con un'etichetta come segue.

label:do 
{ 
    System.out.println("Hello world"); 
    continue label; 
} while(false); 

troppo viene visualizzato il messaggio Ciao mondo sulla console ed esce. Non è un ciclo infinito in quanto potrebbe sembrare che tutte le versioni in questo scenario funzionino allo stesso modo. Come?

risposta

9

L'istruzione continue significa "passare alla logica di controllo loop per la successiva iterazione". Non significa iniziare la successiva iterazione del ciclo incondizionatamente.

(Se qualcuno vuole fare riferimento a JLS su questo, la sezione pertinente è JLS 14.16. Tuttavia, questa parte della specifica è un po 'complicata e dipende dalle specifiche di altri costrutti, ad esempio le varie istruzioni del ciclo e provare/catch/finally)

+0

Hm, questa forse più chiaramente formulato che la mia risposta. –

4

Proprio come con un ciclo for, il while condizionale in un do-while è sempre controllato prima di entrare nel corpo del ciclo (dopo il primo passaggio attraverso, ovviamente). E, proprio come con un ciclo for, continue non fa mai saltare l'espressione di terminazione.

3

il continuano sta controllando l'espressione booleana prima realmente di continuare, come il manuale dice:.

l'istruzione continue salta l'iterazione corrente di un for, while, o do-while ciclo continuo. La forma senza etichetta salta alla fine del corpo del ciclo più interno e valuta l'espressione booleana che controlla il ciclo.

Per maggiori dettagli un'occhiata a: branching semantics