2010-03-12 11 views
8

quale comportamento posso aspettarmi quando ho eseguito questo codice:Java fare mentre, mentre

Intende comportarsi come:

do { 
    while(testA) { 
     // do stuff 
    }  
} while(testB); 

Oppure:

if(testA) { 
    do { 
     // do stuff 
    } while(testA && testB); 
} 

O qualcosa di totalmente inaspettato?

Ho fatto questa domanda perché penso che questo sia abbastanza ambiguo, e per le altre persone che cercano su questo argomento, non perché sono pigro per provarlo.

+12

Il comportamento si dovrebbe aspettare è che un collega ti colpisce con un bastone. – voyager

+0

@voyager Fortunatamente non ho nessun collega a cui prestare attenzione; grazie per il consiglio però! – Pindatjuh

risposta

6

È equivalente al primo blocco:

do { 
    while(testA) { 
     // do stuff 
    }  
} while(testB); 

Le parti rilevanti del Java grammar durante l'analisi di questo sono:

DoStatement: 
    do Statement while (Expression) ; 

Statement: 
    WhileStatement 

WhileStatement: 
    while (Expression) Statement 

Statement: 
    Block 

Block: 
    { BlockStatements_opt } 

Si può vedere che il compilatore Java analizzare questo come do <WhileStatement> while (Expression) ;. Questo è l'unico modo valido per analizzare il codice che hai scritto.

Ricordare che non ha alcuna regola speciale per analizzare questo costrutto. Finisce per essere fonte di confusione per un essere umano da leggere a causa del modo insolito in cui è scritto il ciclo del do-while.Nell'uso normale do-while è sempre scritto come do { ... } while con parentesi graffe esplicite.

1

La risposta è # 1. Continuerà ad andare in loop fintanto che testB è soddisfatto ma non eseguirà il codice se testA non è soddisfatto.

+0

È una sintassi legale (JDK 1.6). Allora perché dovrebbe essere un codice illegale? Spiega per favore. – Pindatjuh

+0

Hai ragione, l'ho provato e la risposta è # 1. Ho modificato la mia risposta. –

1

"do {} while();" è un costrutto, mentre "while(){}" è un altro.

Non esiste una cosa come "do while"; li stai inavvertitamente annidando e approfittando del fatto che {} è facoltativo per le singole istruzioni.

In altre parole, questo è la sintassi legale:

do System.out.println("Hello World") while (true); 

E come in if -statements, un blocco è trattata come una singola istruzione.

vale a dire, la prima risposta possibile è quella giusta, dove "while(){}" è la sola cosa non parentesi all'interno del esterna "do {} while();"

1

Si comporta come

do { 
    while(testA) { 
     // stuff 
    } 
} while(testB); 

Così , questo blocco di codice viene analizzato in questo modo:

do {a block of code} mentre testB è true. Dove {un blocco di codice} è il tempo interiore.

E 'certamente un po' insolito per scrivere codice così :)

0

Non credo che questo codice è legale.

do while(testA) { 

     // do stuff 

    } while(testB); 
+0

Lo è. Provalo e guarda –

3

Funziona davvero, ma il comportamento dipende da quali condizioni si stanno testando. Per esempio. questo codice:

int i = 2; 
    int j = 4; 
    do while(j > 0) { 
     i--; j--; 
     System.out.println("i:" + i + " j:" + j); 
} while(i > 0); 

uscite:

i:1 j:3 
i:0 j:2 
i:-1 j:1 
i:-2 j:0 

Così funziona così:

while(j>0) { 

} 

considerando che con lo scambio dei nomi delle variabili:

do while(i > 0) { 
    //.. same as above 
} while(j > 0); 

L'output è:

i:1 j:3 
i:0 j:2 

Sembra che comporta come nel primo caso (ossia il primo è considerato), ma qui, l'applicazione non sta terminando!


Sommario:
Nel momento in cui è testAnon è soddisfatto più e testB è anche non soddisfatti, il codice funziona come un normale while(testA){} ciclo.
Ma: Se, nel momento in cui è testAnon è più soddisfatta, testBè ancora soddisfatto, il ciclo è non eseguita più e lo script è non terminare. Questo si applica solo se la condizione del ciclo "esterno" deve essere modificata all'interno del ciclo.

Aggiornamento: e dopo aver letto altra risposta, mi rendo conto che questo è esattamente il comportamento del nidificato do-while - while loop.
In ogni caso, abbiamo imparato la lezione: non utilizzare questo tipo di sintassi perché può confondere;)

+0

Non termina perché una volta che ho raggiunto 0, il ciclo interno non viene eseguito più - e quindi j non può mai raggiungere 0. –

+0

Interessante, questo ovviamente è dovuto al ciclo esterno 'do while', ma il contenuto di questo 'do while' non si arresta perché il loop interno fallisce una condizione! Grazie per il test. – Pindatjuh

Problemi correlati