2010-03-12 18 views
8

qué comportamiento puedo esperar cuando corro este código:Java hacer, mientras que, mientras

¿Va a comportarse como:

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

O:

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

O algo totalmente ¿inesperado?

hago esta pregunta porque creo que esto es bastante ambigua, y para otras personas que buscan en este tema, no porque soy perezoso para probarlo.

+12

El comportamiento que debe esperar es que un compañero de trabajo lo golpee con un palo. – voyager

+0

@voyager Afortunadamente no tengo compañeros de trabajo a los que deba prestarle atención; ¡gracias por el consejo! – Pindatjuh

Respuesta

6

Es equivalente a su primer bloque:

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

Las partes pertinentes de la Java grammar al análisis sintáctico esto son:

DoStatement: 
    do Statement while (Expression) ; 

Statement: 
    WhileStatement 

WhileStatement: 
    while (Expression) Statement 

Statement: 
    Block 

Block: 
    { BlockStatements_opt } 

se puede ver que el compilador de Java analizará este como do <WhileStatement> while (Expression) ;. Esa es la única forma válida de analizar el código que escribió.

Tenga en cuenta que no tiene ninguna regla especial para analizar esta construcción. Simplemente resulta confuso para un humano leer debido a la forma inusual en que se escribe el ciclo do-while.En el uso normal do-while siempre se escribe como do { ... } while con llaves explícitas.

1

La respuesta es # 1. Continuará en bucle siempre que se cumpla testB pero no ejecutará el código si testA no se cumple.

+0

Es la sintaxis legal (JDK 1.6). Entonces, ¿por qué debería ser un código ilegal? Por favor explique. – Pindatjuh

+0

Tienes razón, lo he probado y la respuesta es # 1. He editado mi respuesta. –

1

"do {} while();" es una construcción, mientras que "while(){}" es otra.

No existe el "do while"; está anidando inadvertidamente y aprovechando el hecho de que {} es opcional para instrucciones individuales.

En otras palabras, esta es la sintaxis legal:

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

Y al igual que en if -statements, un bloque es tratado como una sola instrucción.

es decir, su primera respuesta posible es la correcta, donde "while(){}" es la única cosa que no entre corchetes en el interior del exterior "do {} while();"

1

Se comporta como

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

Así , ese bloque de código se analiza de esta manera:

do {un bloque de código} mientras testB es verdadero. Donde {un bloque de código} es el tiempo interno.

Es sin duda un poco raro que escribir el código de esa manera :)

0

No creo que este código es legal.

do while(testA) { 

     // do stuff 

    } while(testB); 
+0

Lo es. Pruébalo y mira. –

3

Funciona de hecho, pero el comportamiento depende de las condiciones que esté probando. P.ej. 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); 

salidas:

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

Así funciona así:

while(j>0) { 

} 

Considerando que, mediante el intercambio de los nombres de las variables:

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

La salida es:

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

Parece que comporta igual que en el primer caso (es decir, el primero mientras se considera), pero aquí, ¡la aplicación no está terminando!


Resumen:
En el momento en testA es no está satisfechotestB más y es también no está satisfecho, el código funciona como un rizo while(testA){}.
Pero: Si, en el momento en testA es ya no se cumple, testBsigue siendo satisfecha, el bucle es no ejecutadas más y el guión es que no termina. Esto solo aplica si la condición del bucle "exterior" necesita ser cambiada dentro del bucle.

Actualización: Y después de leer otra respuesta, me doy cuenta de que esto es exactamente el comportamiento de la anidada do-while - bucle while.
De todos modos, lección aprendida: No use este tipo de sintaxis porque puede confundirlo;)

+0

No está terminando porque una vez que alcanzo 0, el bucle interno ya no se ejecuta, y por lo tanto j nunca puede llegar a 0. –

+0

Interesante, esto obviamente se debe a que el bucle 'do while' externo repetirá, pero el contenido de este 'do while' no se repetirá porque el ciclo interno falla. Gracias por probar – Pindatjuh

Cuestiones relacionadas