Java fa while, while
Domanda
quale comportamento posso aspettarmi quando eseguo questo codice:
do while(testA) {
// do stuff
} while(testB);
Si comporterà come:
do {
while(testA) {
// do stuff
}
} while(testB);
O:
if(testA) {
do {
// do stuff
} while(testA && testB);
}
O qualcosa di totalmente inaspettato?
Faccio questa domanda perché penso che sia abbastanza ambiguo e per le altre persone che cercano su questo argomento, non perché sono pigro per provarlo.
Soluzione
E 'equivalente al vostro primo blocco:
do {
while(testA) {
// do stuff
}
} while(testB);
Le parti rilevanti del grammatica Java 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 analizzerà questo come do <WhileStatement> while ( Expression ) ;
. Questo è l'unico modo valido per analizzare il codice che hai scritto.
Tenete a mente che non ha alcuna regola speciale per analizzare questo costrutto. E 'appena finisce per essere fonte di confusione per un essere umano da leggere a causa del modo insolito il ciclo do-while è scritto. In condizioni normali di utilizzo do-while è sempre scritto come do { ... } while
con parentesi graffe esplicite.
Altri suggerimenti
Funziona davvero, ma il comportamento dipende dalle condizioni che stai 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
Quindi funziona come:
while(j>0) {
}
Mentre scambiando i 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 si comporti come nel primo caso (cioèviene considerato il primo while), ma qui, l'applicazione non si chiude!
Riepilogo:
Nel momento in cui testA
È non soddisfatto più e testB
è anche non soddisfatto, il codice funziona come un normale while(testA){}
ciclo continuo.
Ma: Se, nel momento in cui testA
È non più soddisfatto, testB
è ancora soddisfatto, il ciclo è non eseguito più e lo script è non terminare.Ciò si applica solo se è necessario modificare la condizione del loop "esterno" all'interno del loop.
Aggiornamento:E dopo aver letto l'altra risposta, mi rendo conto che questo è esattamente il comportamento del nidificato do-while
- while
ciclo continuo.
Ad ogni modo, lezione appresa:Non usare questo tipo di sintassi perché può confonderti ;)
Si comporta come
do {
while(testA) {
// stuff
}
} while(testB);
Quindi, questo blocco di codice viene analizzato in questo modo:
do {un blocco di codice} mentre TestB è vero. Dove {un blocco di codice} è il tempo interiore.
E 'certamente un po' insolito per scrivere codice così:)
La risposta è # 1. Essa continuerà a ciclo finché testB
è soddisfatto ma non verrà eseguito il codice se testA
non è soddisfatto.
"do {} while();
" è uno costrutto, mentre "while(){}
" è un altro.
Non esiste una cosa come "do while
"; si sta inavvertitamente loro nidificazione 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
-dichiarazioni, un blocco è trattata come una singola istruzione.
Il che equivale a dire, la prima risposta possibile è quella giusta, dove "while(){}
" è la sola cosa non parentesi all'interno del "do {} while();
" esterno
Non credo che questo codice è legale.
do while(testA) {
// do stuff
} while(testB);