Question

quel comportement puis-je attendre quand je lance ce code:

do while(testA) {

    // do stuff

} while(testB);

Est-ce qu'il se comporte comme:

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

Ou:

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

Ou quelque chose de totalement inattendu?

Je pose cette question parce que je pense que cela est tout à fait ambiguë, et pour d'autres personnes à la recherche sur ce sujet, pas parce que je suis paresseux pour le tester.

Était-ce utile?

La solution

Il est équivalent à votre premier bloc:

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

Les parties pertinentes du Java grammaire lors de l'analyse ce sont:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

Vous pouvez voir que le compilateur Java va analyser cela comme do <WhileStatement> while ( Expression ) ;. C'est la seule façon valable pour analyser le code que vous avez écrit.

Gardez à l'esprit qu'il n'a pas de règle spéciale pour analyser cette construction. Il finit juste par être source de confusion pour un être humain à lire en raison de la façon inhabituelle la boucle do-while est écrit. En usage normal do-while est toujours écrit do { ... } while avec des accolades explicites.

Autres conseils

Il fonctionne en effet, mais le comportement dépend de quelles conditions vous êtes test. Par exemple. ce code:

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

sorties:

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

Il fonctionne comme:

while(j>0) {

}

considérant que, par l'échange des noms de variables:

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

La sortie est la suivante:

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

On dirait qu'il se comporte comme dans le premier cas (à savoir le premier tout est considéré), mais ici, l'application ne se terminant pas!


Résumé: Au moment où testA est non satisfait et plus testB est ne se satisfait pas , le code fonctionne comme une boucle de while(testA){} normale.
Mais: Si, au moment où testA est ne satisfait , testB est toujours satisfait , la boucle est pas exécuté plus et le script est ne se terminant pas . Cela vaut seulement si la condition de la boucle « externe » doit être changé dans la boucle.

Mise à jour: Et après avoir lu autre réponse, je me rends compte que c'est exactement le comportement du do-while imbriquée -. Boucle while
Quoi qu'il en soit, ACQUIS: Ne pas utiliser ce type de syntaxe, car il peut vous confondre;)

Il se comporte comme

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

Alors, ce bloc de code est analysé ainsi:

{faire un bloc de code} tout TESTB est vrai. Où {un bloc de code} est le tout intérieur.

Il est certainement un peu rare d'écrire du code comme ça:)

La réponse est # 1. Il continuera à boucle tant que testB est satisfait, mais il ne sera pas exécuter le code si testA est pas satisfait.

"do {} while();" est une construction, alors que "while(){}" est une autre.

Il n'y a pas une telle chose comme « do while »; vous les imbriquant, par inadvertance, et en profitant du fait que {} est facultative pour les instructions simples.

En d'autres termes, il est syntaxiquement légal:

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

Et comme dans les déclarations de if, un bloc est traité comme une seule instruction.

Quel est-à-dire votre première réponse possible est celle de droite, où « while(){} » est la seule chose non placé entre crochets à l'intérieur du « do {} while(); » externe

Je ne pense pas que ce code est légal.

do while(testA) {

        // do stuff

    } while(testB);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top