Pregunta

qué comportamiento se puede esperar cuando corro este código:

do while(testA) {

    // do stuff

} while(testB);

¿Se comportan 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.

¿Fue útil?

Solución

Es equivalente a su primer bloque:

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

Las partes pertinentes de la gramática de Java al analizar esto son:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

Se puede ver que el compilador Java analizar esto como do <WhileStatement> while ( Expression ) ;. Esa es la única forma válida para analizar el código que escribiste.

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

Otros consejos

Funciona bien, y el comportamiento depende de lo que las condiciones de su están poniendo a prueba. 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 se comporta igual que en el primer caso (es decir, el primero, mientras que se considera), pero aquí, la aplicación no está terminando!


Resumen:
En el momento en testA es no está satisfecho más y testB también es no satisfizo , el código funciona como un bucle while(testA){} normal.
Pero: Si, en el momento en testA es ya no se cumple , testB sigue siendo satisfecha , el bucle es no ejecutados más y el guión es no poner fin a . Esto sólo se aplica si la condición del bucle "exterior" necesita ser cambiado dentro del bucle.

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

Se comporta como

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

Por lo tanto, ese bloque de código se analiza de esta manera:

{hacer un bloque de código} mientras TESTB es cierto. Donde {un bloque de código} es el tiempo interno.

Es sin duda un poco raro que escribir código como:)

La respuesta es # 1. Continuará bucle mientras testB está satisfecho, pero no ejecutará el código si testA no está satisfecho.

"do {} while();" es un constructo, mientras que "while(){}" es otro.

No hay tal cosa como "do while"; sin darse cuenta que está anidando ellos y aprovechando el hecho de que {} es opcional para las instrucciones individuales.

En otras palabras, esta es la sintaxis legal:

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

Y como en if estados de cuenta, un bloque es tratado como un único estado.

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

No creo que este código es legal.

do while(testA) {

        // do stuff

    } while(testB);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top