2010-03-12 8 views
8

quel comportement dois-je attendre quand je lance ce code:Java faire pendant que, tout en

aura-t-il se comporter 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 c'est assez ambigu, et pour d'autres personnes recherchant sur ce sujet, pas parce que je suis paresseux pour le tester.

+12

Le comportement que vous devriez vous attendre est qu'un collègue vous frappe avec un bâton. – voyager

+0

@voyager Heureusement, je n'ai pas de collègues à surveiller; Merci quand même pour le conseil! – Pindatjuh

Répondre

6

Il est équivalent à votre premier bloc:

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

Les parties pertinentes du Java grammar 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 cette comme do <WhileStatement> while (Expression) ;. C'est la seule façon valide d'analyser le code que vous avez écrit. Gardez à l'esprit qu'il n'a pas de règle spéciale pour analyser cette construction. Cela finit par être source de confusion pour un humain à lire en raison de la façon inhabituelle dont la boucle do-while est écrite.En usage normal, do-while est toujours écrit do { ... } while avec des accolades explicites.

1

La réponse est # 1. Il continuera à boucler tant que testB est satisfait mais il n'exécutera pas le code si testA n'est pas satisfait.

+0

C'est la syntaxe légale (JDK 1.6). Alors pourquoi devrait-il alors être un code illégal? S'il vous plaît, expliquez. – Pindatjuh

+0

Vous avez raison, je l'ai testé et la réponse est # 1. J'ai édité ma réponse. –

1

"do {} while();" est une construction, tandis que "while(){}" en est une autre. Il n'y a pas de "do while"; vous les imbriquez par inadvertance et vous profitez du fait que {} est facultatif pour les instructions uniques.

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

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

Et comme dans if -statements, un bloc est traité comme une seule instruction.

Ce qui veut 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 extérieur « do {} while(); »

1

Il se comporte comme

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

Alors , ce bloc de code est analysé de la façon suivante:

faire {un bloc de code} alors que testB est vrai. Où {un bloc de code} est le moment intérieur.

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

0

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

do while(testA) { 

     // do stuff 

    } while(testB); 
+0

C'est. Essayez-le et voyez. –

3

Cela fonctionne en effet, mais le comportement dépend des conditions que vous testez. 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:

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

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


Résumé:
Au moment où testA est pas satisfait plus et testB est pas satisfait, le code fonctionne comme une boucle while(testA){} normale.
Mais: Si, au moment où testA est ne se contente plus, testBest toujours satisfaite, la boucle est pas exécuté plus et le script est ne pas mettre fin. Ceci s'applique uniquement si la condition de la boucle "externe" doit être modifiée à l'intérieur de 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, leçon apprise: N'utilisez pas ce type de syntaxe parce qu'elle peut vous déranger;)

+0

Il ne se termine pas car une fois que j'atteins 0, la boucle interne ne tourne plus - et donc j ne peut jamais atteindre 0. –

+0

Intéressant, c'est évidemment parce que la boucle extérieure do do fera une boucle, mais le contenu de cette boucle 'do while' ne boucle pas car la boucle interne échoue à une condition! Merci pour les tests. – Pindatjuh

Questions connexes