Java fazer enquanto, ao mesmo tempo
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.
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);