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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top