Pergunta

o comportamento posso esperar quando eu executar esse código:

do while(testA) {

    // do stuff

} while(testB);

Será que vai se comportar como:

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

Ou:

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

Ou algo totalmente inesperado?

Faço esta pergunta porque eu acho que isso é muito ambígua, e para outras pessoas que pesquisam sobre esse tópico, não , porque eu sou preguiçoso para testá-lo.

Foi útil?

Solução

É equivalente ao seu primeiro bloco:

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

As partes relevantes do Java gramática ao analisar este são:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

Você pode ver que o compilador Java irá analisar isso como do <WhileStatement> while ( Expression ) ;. Essa é a maneira válida apenas para analisar o código que você escreveu.

Tenha em mente que ele não tem qualquer regra especial para analisar esta construção. Ele só acaba por ser confuso para um ser humano para ler devido à forma incomum a fazer-while é escrito. Em uso normal do-while é sempre escrita como do { ... } while com chaves explícitas.

Outras dicas

Ele funciona realmente, mas o comportamento depende do que condições você está testando. Por exemplo. este código:

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

saídas:

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

Assim, ele funciona como:

while(j>0) {

}

Considerando que trocando os nomes de variáveis:

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

A saída é:

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

Parece que ele se comporta o mesmo que no primeiro caso (ou seja, o primeiro, enquanto é considerado), mas aqui, o aplicativo não está terminando!


Resumo:
No momento em que testA é não satisfeito mais e testB também é não satisfeito , o código funciona como um loop while(testA){} normal.
Mas: Se, no momento em que testA é não está mais satisfeito , testB ainda está satisfeito , o loop é não executado mais eo script é não terminação . Isso só se aplica se a condição das necessidades de loop "exteriores" de ser mudado dentro do loop.

Update: E depois de ler outra resposta, eu percebo que este é exatamente o comportamento do do-while nested -. Laço while
De qualquer forma, lição aprendida: Não use este tipo de sintaxe, porque ele pode confundi-lo;)

Ele se comporta como

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

Então, isso bloco de código é analisado desta forma:

fazer {um bloco de código} enquanto TestB é verdade. Onde {um bloco de código} é o tempo interior.

É certamente um pouco incomum para escrever código como esse:)

A resposta é # 1. Ele continuará a ciclo enquanto a testB está satisfeito, mas não vai executar o código se testA não está satisfeito.

"do {} while();" é um constructo, enquanto "while(){}" é outra.

Não existe tal coisa como "do while"; você está, inadvertidamente, aninhando-os e aproveitando o fato de que {} é opcional para instruções individuais.

Em outras palavras, esta é a sintaxe legal:

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

E como em if-declarações, um bloco é tratada como uma única instrução.

O que significa dizer, a sua primeira resposta possível é o caminho certo, onde "while(){}" é a única coisa que não entre colchetes dentro do "do {} while();" externa

Eu não acho que esse código é legal.

do while(testA) {

        // do stuff

    } while(testB);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top