 |
 |
3) Contrôle du flux du programme |
|
 |
|
Texte original |
 |
Traducteur : Jean-Pierre VIDAL |
|
 |
///
|
Ce chapitre contient 6 pages
1
2
3
4
5
6
|
|
|
 |
 |
 |
 |
 |
 |
|
 |
|
 |
 |
 |
There’s no need for else
because the method will not continue after executing a
return.
|
 |
En fait les clauses else sont inutiles car les
instructions return terminent l'exécution de la méthode.
|
 |
 |
 |
Iteration
|
 |
Itération
|
 |
 |
 |
while, do-while and
for control looping and are sometimes classified as iteration
statements. A statement repeats until the controlling
Boolean-expression evaluates to false. The form for a while
loop is
|
 |
Les instructions de contrôle de boucle while,
do-while et for sont souvent appelés instructions
d'itération. Une instruction est répétée jusqu'à ce que l'expression
booléenne de contrôle devienne fausse. Voici la forme d'une boucle
while :
|
 |
 |
 |
while(Boolean-expression) statement
|
 |
while(expression booléenne) instruction
|
 |
 |
 |
The Boolean-expression is
evaluated once at the beginning of the loop and again before each further
iteration of the statement.
|
 |
expression booléenne est évaluée à l'entrée de la boucle, puis
après chaque itération ultérieure d'instruction.
|
 |
 |
 |
Here’s a simple example that
generates random numbers until a particular condition is met:
|
 |
Voici un exemple simple qui génère des nombres aléatoires jusqu'à l'arrivée
d'une condition particulière :
|
 |
 |
 |
//: c03:WhileTest.java // Demonstrates the while loop.
public class WhileTest { public static void main(String[] args) { double r = 0; while(r < 0.99d) { r = Math.random(); System.out.println(r); } } } ///:~
|
 |
//: c03:WhileTest.java // Démonstration de la boucle while.
public class WhileTest { public static void main(String[] args) { double r = 0; while(r < 0.99d) { r = Math.random(); System.out.println(r); } } } ///:~
|
 |
 |
 |
This uses the static method
random( ) in the Math library, which generates a double
value between 0 and 1. (It includes 0, but not 1.) The conditional
expression for the while says “keep doing this loop until the
number is 0.99 or greater.” Each time you run this program you’ll
get a different-sized list of
numbers.
|
 |
Ce test utilise la méthode static
random( ) de la bibliothèque Math, qui génère une valeur
double comprise entre 0 et 1. (0 inclus, 1 exclu). L'expression conditionnelle de
la boucle while signifie « continuer l'exécution de cette boucle jusqu'à ce
que le nombre généré soit égal ou supérieur à 0.99 ». Le résultat est une liste de nombre, et
la taille de cette liste est différente à chaque exécution du programme.
|
 |
 |
 |
do-while
|
 |
do-while
|
 |
 |
 |
The form for do-while
is
|
 |
Voici la forme de la boucle do-while :
|
 |
 |
 |
do statement while(Boolean-expression);
|
 |
do instruction while(expression booléenne);
|
 |
 |
 |
The sole difference between while
and do-while is that the statement of the do-while always executes
at least once, even if the expression evaluates to false the first time. In a
while, if the conditional is false the first time the statement never
executes. In practice, do-while is less common than
while.
|
 |
La seule différence entre while et
do-while est que dans une boucle do-while, instruction
est exécutée au moins une fois, même si l'expression est fausse la première fois. Dans une boucle
while, si l'expression conditionnelle est fausse la première fois, l'instruction
n'est jamais exécutée. En pratique, la boucle do-while est moins utilisée que
while.
|
 |
 |
 |
for
|
 |
for
|
 |
 |
 |
A for loop performs initialization
before the first iteration. Then it performs conditional testing and, at the end
of each iteration, some form of “stepping.” The form of the
for loop is:
|
 |
La boucle for effectue une initialisation avant la
première itération. Puis elle effectue un test conditionnel et, à la fin de chaque itération, une
« instruction d'itération ». Voici la forme d'une boucle
for :
|
 |
 |
 |
for(initialization; Boolean-expression; step) statement
|
 |
for(instruction d'initialisation; expression booléenne; instruction d'itération) instruction
|
 |
 |
 |
Any of the expressions
initialization, Boolean-expression or step can be empty.
The expression is tested before each iteration, and as soon as it evaluates to
false execution will continue at the line following the for
statement. At the end of each loop, the step executes.
|
 |
Chacune des expressions instruction d'initialisation,
expression booléenne et instruction d'itération peut être vide. expression
booléenne est testée avant chaque itération, et dès qu'elle est évaluée à
false l'exécution continue à la ligne suivant l'instruction for.
À la fin de chaque boucle, instruction d'itération est exécutée.
|
 |
 |
 |
for loops are usually used for
“counting” tasks:
|
 |
Les boucles for sont généralement utilisées pour les
tâches impliquant un décompte :
|
 |
 |
 |
//: c03:ListCharacters.java // Demonstrates "for" loop by listing // all the ASCII characters.
public class ListCharacters { public static void main(String[] args) { for( char c = 0; c < 128; c++) if (c != 26 ) // ANSI Clear screen System.out.println( "value: " + (int)c + " character: " + c); } } ///:~
|
 |
//: c03:ListCharacters.java // Démonstration de la boucle "for" listant // tous les caractères ASCII.
public class ListCharacters { public static void main(String[] args) { for( char c = 0; c < 128; c++) if (c != 26 ) // Effacement de l'écran ANSI System.out.println( "value: " + (int)c + " character: " + c); } } ///:~
|
 |
 |
 |
Note that the variable c is
defined at the point where it is used, inside the control expression of the
for loop, rather than at the beginning of the block denoted by the open
curly brace. The scope of c is the expression controlled by the
for.
|
 |
Remarquons que la variable c est définie à l'endroit où
elle est utilisée, à l'intérieur de l'expression de contrôle de la boucle for,
plutôt qu'au début du bloc commençant à l'accolade ouvrante. La portée de c est
l'expression contrôlée par la boucle for.
|
 |
 |
 |
Traditional procedural languages like C
require that all variables be defined at the beginning of
a block so when the compiler creates a block it can allocate space for those
variables. In Java and C++ you can spread your variable declarations throughout
the block, defining them at the point that you need them. This allows a more
natural coding style and makes code easier to understand.
|
 |
Les langages procéduraux traditionnels tels que C exigent que toutes les
variables soient définies au début d'un bloc afin que le compilateur leur alloue de l'espace
mémoire lorsqu'il crée un bloc. En Java et C++ les déclarations de variables peuvent apparaître
n'importe où dans le bloc, et être ainsi définies au moment où on en a besoin. Ceci permet un style
de code plus naturel et rend le code plus facile à comprendre.
|
 |
 |
 |
You can define multiple variables within
a for statement, but they must be of the same type:
|
 |
Il est possible de définir plusieurs variables dans une instruction
for, à condition qu'elles aient le même type :
|
 |
 |
 |
for(int i = 0, j = 1; i < 10 && j != 11; i++, j++) /* body of for loop */;
|
 |
for(int i = 0, j = 1; i < 10 && j != 11; i++, j++) /* corps de la boucle for */;
|
 |
 |
 |
The int definition in the for
statement covers both i and j. The ability to define
variables in the control expression is limited to the for loop. You
cannot use this approach with any of the other selection or iteration
statements.
|
 |
La définition int de l'instruction for
s'applique à la fois à i et à j. La possibilité de définir des
variables dans une expression de contrôle est limitée à la boucle for. On ne peut
l'utiliser dans aucune autre instruction de sélection ou d'itération.
|
 |
 |
 |
The comma operator
|
 |
L'opérateur virgule
|
 |
 |
 |
Earlier in this chapter I stated that the
comma operator (not the
comma separator, which is used to separate definitions and function
arguments) has only one use in Java: in the control expression of a for
loop. In both the initialization and step portions of the control expression you
can have a number of statements separated by commas, and those statements will
be evaluated sequentially. The previous bit of code uses this ability.
Here’s another example:
|
 |
Au début de ce chapitre j'ai déclaré que l'opérateur virgule (à
distinguer du séparateur virgule, utilisé pour séparer les définitions et les arguments de
fonctions) avait un seul usage en Java, à savoir dans l'expression de contrôle d'une boucle
for. Aussi bien la partie initialisation que la partie itération de l'expression
de contrôle peuvent être formées de plusieurs instructions séparées par des virgules, et ces
instructions seront évaluées séquentiellement. L'exemple précédent utilisait cette possibilité.
Voici un autre exemple :
|
 |
 |
 |
//: c03:CommaOperator.java public class CommaOperator { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { System.out.println("i= " + i + " j= " + j); } } } ///:~
|
 |
//: c03:CommaOperator.java public class CommaOperator { public static void main(String[] args) { for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) { System.out.println("i= " + i + " j= " + j); } } } ///:~
|
 |
 |
 |
Here’s the output:
|
 |
En voici le résultat :
|
 |
 |
 |
i= 1 j= 11 i= 2 j= 4 i= 3 j= 6 i= 4 j= 8
|
 |
i= 1 j= 11 i= 2 j= 4 i= 3 j= 6 i= 4 j= 8
|
 |
 |
 |
You can see that in both the
initialization and step portions the statements are evaluated in sequential
order. Also, the initialization portion can have any number of definitions of
one type.
|
 |
remarquez que la partie initialisation ainsi que la partie itération sont
évaluées en ordre séquentiel. La partie initialisation peut comporter n'importe quel nombre de
définitions du même type.
|
 |
 |
 |
break and continue
|
 |
break et continue
|
 |
 |
 |
Inside the body of any of the iteration
statements you can also control the flow of the loop by using break and
continue. break quits the loop without executing the rest of the
statements in the loop. continue stops the execution of the current
iteration and goes back to the beginning of the loop to begin the next
iteration.
|
 |
Le déroulement de toutes les instructions d'itération peut être contrôlé de
l'intérieur du corps de la boucle au moyen des instructions break et
continue. L'instruction break sort de la boucle sans exécuter la
suite des instructions. L'instruction continue arrête l'exécution de l'itération
courante, et l'exécution reprend en début de boucle avec l'itération suivante.
|
 |
 |
 |
This program shows examples of
break and continue within for and while
loops:
|
 |
Ce programme montre des exemples d'utilisation des instructions
break et continue dans des boucles for et
while :
|
 |
 |
 |
//: c03:BreakAndContinue.java // Demonstrates break and continue keywords.
public class BreakAndContinue { public static void main(String[] args) { for(int i = 0; i < 100; i++) { if(i == 74) break; // Out of for loop if(i % 9 != 0) continue; // Next iteration System.out.println(i); } int i = 0; // An "infinite loop": while(true) { i++; int j = i * 27; if(j == 1269) break; // Out of loop if(i % 10 != 0) continue; // Top of loop System.out.println(i); } } } ///:~
|
 |
//: c03:BreakAndContinue.java // Démonstration des mots clefs break et continue.
public class BreakAndContinue { public static void main(String[] args) { for(int i = 0; i < 100; i++) { if(i == 74) break; // Sortie définitive de la boucle for if(i % 9 != 0) continue; // Continue avec l'itération suivante System.out.println(i); } int i = 0; // une "boucle infinie" : while(true) { i++; int j = i * 27; if(j == 1269) break; // Sortie de boucle if(i % 10 != 0) continue; // Début de boucle System.out.println(i); } } } ///:~
|
 |
 |
 |
In the for loop the value of
i never gets to 100 because the break statement breaks out of the
loop when i is 74. Normally, you’d use a break like this
only if you didn’t know when the terminating condition was going to occur.
The continue statement causes execution to go back to the top of the
iteration loop (thus incrementing i) whenever i is not evenly
divisible by 9. When it is, the value is printed.
|
 |
Dans la boucle for la valeur de i
n'atteint jamais 100 car l'instruction break termine la boucle lorsque
i prend la valeur 74. En principe, il ne faudrait pas utiliser
break de cette manière, à moins que l'on ne connaisse pas le moment où la
condition de fin arrivera. L'instruction continue provoque un branchement au début
de la boucle d'itération (donc en incrémentant i) chaque fois que
i n'est pas divisible par 9. Lorsqu'il l'est, la valeur est imprimée.
|
 |
 |
 |
The second portion shows an
“infinite loop” that would, in theory, continue forever. However,
inside the loop there is a break statement that will break out of the
loop. In addition, you’ll see that the continue moves back to the
top of the loop without completing the remainder. (Thus printing happens in the
second loop only when the value of i is divisible by 10.) The output
is:
|
 |
La seconde partie montre une « boucle infinie » qui,
théoriquement, ne devrait jamais s'arrêter. Toutefois, elle contient une instruction
break lui permettant de le faire. De plus, l'instruction continue
retourne au début de la boucle au lieu d'exécuter la fin, ainsi la seconde boucle n'imprime que
lorsque la valeur de i est divisible par 10. La sortie est :
|
 |
 |
 |
0 9 18 27 36 45 54 63 72 10 20 30 40
|
 |
0 9 18 27 36 45 54 63 72 10 20 30 40
|
 |
 |
 |
The value 0 is printed because 0 % 9
produces 0.
|
 |
La valeur 0 est imprimée car 0 % 9 a pour résultat 0.
|
 |
 |
 |
A second form of the infinite loop is
for(;;). The compiler treats both while(true) and for(;;)
in the same way so whichever one you use is a matter of programming
taste.
|
 |
Il existe une seconde forme de boucle infinie, c'est
for(;;). Le compilateur traite while(true) et
for(;;) de la même manière, le choix entre l'une et l'autre est donc affaire de
goût.
|
 |
 |
 |
The infamous “goto”
|
 |
L'infâme « goto »
|
 |
 |
 |
The goto
keyword has been present in programming languages from the beginning.
Indeed, goto was the genesis of program control in assembly language:
“if condition A, then jump here, otherwise jump there.” If you read
the assembly code that is ultimately generated by virtually any compiler,
you’ll see that program control contains many jumps. However, a goto
is a jump at the source-code level, and that’s what brought it into
disrepute. If a program will always jump from one point to another, isn’t
there some way to reorganize the code so the flow of control is not so jumpy?
goto fell into true disfavor with the publication of the famous
“Goto considered harmful” paper by Edsger Dijkstra, and since then
goto-bashing has been a popular sport, with advocates of the cast-out keyword
scurrying for cover.
|
 |
Le mot clef goto est aussi ancien que les langages de
programmation. En effet, goto a été le premier moyen de contrôle des programmes
dans les langages assembleur : « si la condition A est satisfaite, alors sauter ici,
sinon sauter là ». Lorsqu'on lit le code assembleur finalement généré par n'importe quel
compilateur, on voit qu'il comporte beaucoup de sauts. Toutefois, un goto au
niveau du code source est un saut, et c'est ce qui lui a donné mauvaise réputation. Un programme
n'arrêtant pas de sauter d'un point à un autre ne peut-il être réorganisé afin que le flux du
programme soit plus séquentiel ? goto tomba en disgrâce après la publication du
fameux article « Le goto considéré comme nuisible » écrit par Edsger Dijkstra, et depuis
lors les guerres de religion à propos de son utilisation sont devenues monnaie courante, les
partisans du mot clef honni recherchant une nouvelle audience.
|
 |
 |
 |
As is typical in situations like this,
the middle ground is the most fruitful. The problem is not the use of
goto, but the overuse of goto—in rare situations goto
is actually the best way to structure control flow.
|
 |
Comme il est habituel en de semblables situations, la voie du milieu est la
plus indiquée. Le problème n'est pas d'utiliser le goto, mais de trop l'utiliser -
dans quelques rares situations le goto est réellement la meilleure façon de
structurer le flux de programme.
|
 |
 |
 |
Although goto is a reserved word
in Java, it is not used in the language; Java has no goto. However, it
does have something that looks a bit like a jump tied in with the break
and continue keywords. It’s not a jump but rather a way to break
out of an iteration statement. The reason it’s
often thrown in with discussions of goto is because it uses the same
mechanism: a label.
|
 |
Bien que goto soit un mot réservé de Java, on ne le trouve
pas dans le langage ; Java n'a pas de goto. Cependant, il existe quelque
chose qui ressemble à un saut, lié aux mots clefs break et
continue. Ce n'est pas vraiment un saut, mais plutôt une manière de sortir d'une
instruction d'itération. On le présente dans les discussions sur le goto parce
qu'il utilise le même mécanisme : une étiquette.
|
 |
 |
 |
A label is an
identifier followed by a colon, like this:
|
 |
Une étiquette est un identificateur suivi du caractère deux points, comme
ceci :
|
 |
 |
 |
label1:
|
 |
label1:
|
 |
 |
 |
The only place a label is useful in Java is right before an iteration statement. And that means right before—it does no good to put any other statement between the label and the iteration. And the sole reason to put a label before an iteration is if you’re going to nest another iteration or a switch inside it. That’s because the break and continue keywords will normally interrupt only the current loop, but when used with a label they’ll interrupt the loops up to where the label exists:
|
 |
En Java, une étiquette ne peut se trouver qu'en un unique
endroit : juste avant une instruction d'itération. Et, j'insiste, juste avant - il
n'est pas bon de mettre une autre instruction entre l'étiquette et la boucle d'itération. De plus,
il n'y a qu'une seule bonne raison de mettre une étiquette avant une itération, c'est lorsqu'on a
l'intention d'y nicher une autre itération ou un switch. Ceci parce que les mots clefs
break et continue ont pour fonction naturelle d'interrompre la
boucle en cours, alors qu'utilisés avec une étiquette ils interrompent la boucle pour se brancher à
l'étiquette :
|
 |
 |
 |
label1: outer-iteration { inner-iteration { //... break; // 1 //... continue; // 2 //... continue label1; // 3 //... break label1; // 4 } }
|
 |
label1: outer-iteration { inner-iteration { //... break; // 1 //... continue; // 2 //... continue label1; // 3 //... break label1; // 4 } }
|
 |
 |
 |
In case 1, the break breaks out of
the inner iteration and you end up in the outer iteration. In case 2, the
continue moves back to the beginning of the inner iteration. But in case
3, the continue label1 breaks out of the inner iteration and the
outer iteration, all the way back to label1. Then it does in fact
continue the iteration, but starting at the outer iteration. In case 4, the
break label1 also breaks all the way out to label1, but it does
not re-enter the iteration. It actually does break out of both
iterations.
|
 |
Cas 1 : break interrompt l'itération intérieure, on
se retrouve dans l'itération extérieure. Cas 2 : continue branche à
l'itération intérieure. Mais, cas 3 : continue label1 interrompt l'itération
intérieure et l'itération extérieure, et branche dans tous les cas à
label1. En fait, l'itération continue, mais en redémarrant à partir de l'itération
extérieure. Cas 4 : break label1 interrompt lui aussi dans tous les cas et
branche à label1, mais ne rentre pas à nouveau dans l'itération. En fait il sort
des deux itérations.
|
 |
 |
 |
Here is an example using for
loops:
|
 |
Voici un exemple utilisant les boucles
for :
|
 |
 |
 |
//: c03:LabeledFor.java // Java’s "labeled for" loop.
public class LabeledFor { public static void main(String[] args) { int i = 0; outer: // Can't have statements here for(; true ;) { // infinite loop inner: // Can't have statements here for(; i < 10; i++) { prt("i = " + i); if(i == 2) { prt("continue"); continue; } if(i == 3) { prt("break"); i++; // Otherwise i never // gets incremented. break; } if(i == 7) { prt("continue outer"); i++; // Otherwise i never // gets incremented. continue outer; } if(i == 8) { prt("break outer"); break outer; } for(int k = 0; k < 5; k++) { if(k == 3) { prt("continue inner"); continue inner; } } } } // Can't break or continue // to labels here } static void prt(String s) { System.out.println(s); } } ///:~
|
 |
//: c03:LabeledFor.java // la boucle for "étiquetée" en Java.
public class LabeledFor { public static void main(String[] args) { int i = 0; outer: // Il ne peut y avoir d'instruction ici for(; true ;) { // boucle infinie inner: // Il ne peut y avoir d'instruction ici for(; i < 10; i++) { prt("i = " + i); if(i == 2) { prt("continue"); continue; } if(i == 3) { prt("break"); i++; // Sinon i ne sera // jamais incrémenté. break; } if(i == 7) { prt("continue outer"); i++; // Sinon i ne sera // jamais incrémenté. continue outer; } if(i == 8) { prt("break outer"); break outer; } for(int k = 0; k < 5; k++) { if(k == 3) { prt("continue inner"); continue inner; } } } } // On ne peut pas utiliser un break ou // un continue vers une étiquette ici } static void prt(String s) { System.out.println(s); } } ///:~
|
 |
 |
 |
This uses the prt( ) method
that has been defined in the other examples.
|
 |
Ce programme utilise la méthode prt( ) déjà définie
dans d'autres exemples.
|
 |
 |
 |
Note that break breaks out of the
for loop, and that the increment-expression doesn’t occur until the
end of the pass through the for loop. Since break skips the
increment expression, the increment is performed directly in the case of i ==
3. The continue outer statement in the case of i == 7 also
goes to the top of the loop and also skips the increment, so it too is
incremented directly.
|
 |
Noter que break sort de la boucle for, et
l'expression d'incrémentation ne sera jamais exécutée avant le passage en fin de boucle
for. Puisque break saute l'instruction d'incrémentation,
l'incrémentation est réalisée directement dans le cas où i == 3. Dans le cas
i == 7, l'instruction continue outer saute elle aussi en tête de
la boucle, donc saute l'incrémentation, qui est, ici aussi, réalisée directement.
|
 |
 |
 |
Here is the output:
|
 |
Voici le résultat :
|
 |
 |
 |
i = 0 continue inner i = 1 continue inner i = 2 continue i = 3 break i = 4 continue inner i = 5 continue inner i = 6 continue inner i = 7 continue outer i = 8 break outer
|
 |
i = 0 continue inner i = 1 continue inner i = 2 continue i = 3 break i = 4 continue inner i = 5 continue inner i = 6 continue inner i = 7 continue outer i = 8 break outer
|
 |
 |
 |
If not for the break outer
statement, there would be no way to get out of the outer loop from within an
inner loop, since break by itself can break out of only the innermost
loop. (The same is true for continue.)
|
 |
Si l'instruction break outer n'était pas là, il n'y aurait
aucun moyen de se brancher à l'extérieur de la boucle extérieure depuis la boucle intérieure,
puisque break utilisé seul ne permet de sortir que de la boucle la plus interne
(il en est de même pour continue).
|
 |
 |
 |
Of course, in the cases where breaking
out of a loop will also exit the method, you can simply use a
return.
|
 |
Évidemment, lorsque break a pour effet de sortir de la
boucle et de la méthode, il est plus simple d'utiliser return.
|
 |
 |
 |
Here is a demonstration of labeled
break and continue statements with while
loops:
|
 |
Voici une démonstration des instructions étiquetées break
et continue avec des boucles while :
|
 |
 |
 |
//: c03:LabeledWhile.java // Java's "labeled while" loop.
public class LabeledWhile { public static void main(String[] args) { int i = 0; outer: while(true) { prt("Outer while loop"); while(true) { i++; prt("i = " + i); if(i == 1) { prt("continue"); continue; } if(i == 3) { prt("continue outer"); continue outer; } if(i == 5) { prt("break"); break; } if(i == 7) { prt("break outer"); break outer; } } } } static void prt(String s) { System.out.println(s); } } ///:~
|
 |
//: c03:LabeledWhile.java // La boucle while "étiquetée" en Java.
public class LabeledWhile { public static void main(String[] args) { int i = 0; outer: while(true) { prt("Outer while loop"); while(true) { i++; prt("i = " + i); if(i == 1) { prt("continue"); continue; } if(i == 3) { prt("continue outer"); continue outer; } if(i == 5) { prt("break"); break; } if(i == 7) { prt("break outer"); break outer; } } } } static void prt(String s) { System.out.println(s); } } ///:~
|
 |
 |
 |
The same rules hold true for
while:
|
 |
Les mêmes règles s'appliquent au while :
|
 |
 |
 |
- A plain continue
goes to the top of the innermost loop and
continues.
- A labeled
continue goes to the label and re-enters the loop right after that
label.
- A
break “drops out of the bottom” of the
loop.
- A labeled
break drops out of the bottom of the end of the loop denoted by the
label.
|
 |
- Un continue génère un saut en tête de la boucle courante
et poursuit l'exécution ;
- Un continue étiqueté génère un saut à l'étiquette puis
entre à nouveau dans la boucle juste après cette étiquette ;
- Un break « sort de la boucle par le
bas » ;
- Un break étiqueté sort de la boucle par le bas, à la fin
de la boucle repérée par l'étiquette.
|
 |
 |
 |
The output of this
method makes it clear:
|
 |
Le résultat de cette méthode éclaircit cela :
|
 |
 |
 |
Outer while loop i = 1 continue i = 2 i = 3 continue outer Outer while loop i = 4 i = 5 break Outer while loop i = 6 i = 7 break outer
|
 |
Outer while loop i = 1 continue i = 2 i = 3 continue outer Outer while loop i = 4 i = 5 break Outer while loop i = 6 i = 7 break outer
|
 |
 |
 |
It’s important to remember that the
only reason to use labels in Java is when you have nested loops and you
want to break or continue through more than one nested
level.
|
 |
Il est important de se souvenir qu'il n'y a qu'une seule raison
d'utiliser une étiquette en Java, c'est lorsqu'il existe plusieurs boucles imbriquées et que l'on
veut utiliser break ou continue pour traverser plus d'un niveau
d'itération.
|
 |
 |
 |
In Dijkstra’s “goto
considered harmful” paper, what he specifically objected to was the
labels, not the goto. He observed that the number of bugs seems to increase with
the number of labels in a program. Labels and gotos make programs difficult to
analyze statically, since it introduces cycles in the program execution graph.
Note that Java labels don’t suffer from this problem, since they are
constrained in their placement and can’t be used to transfer control in an
ad hoc manner. It’s also interesting to note that this is a case where a
language feature is made more useful by restricting the power of the
statement.
|
 |
Dijkstra, dans son article « Le goto considéré comme nuisible »,
critiquait les étiquettes, mais pas le goto lui-même. Il avait observé que le nombre de bugs
semblait augmenter avec le nombre d'étiquettes d'un programme. Les étiquettes et les goto rendent
difficile l'analyse statique d'un programme, car ils introduisent des cycles dans le graphe
d'exécution de celui-ci. Remarquons que les étiquettes Java ne sont pas concernées par ce problème,
dans la mesure où leur emplacement est contraint, et qu'elles ne peuvent pas être utilisées pour
réaliser un transfert de contrôle à la demande. Il est intéressant de noter que nous nous trouvons
dans un cas où une fonctionnalité du langage est rendue plus utile en en diminuant la
puissance.
|
 |
 |
 |
switch
|
 |
switch
|
 |
 |
 |
The switch is sometimes classified
as a selection statement. The switch statement selects from among
pieces of code based on the value of an integral expression. Its form
is:
|
 |
On parle parfois de switch comme d'une instruction
de sélection. L'instruction switch sélectionne un morceau de code
parmi d'autres en se basant sur la valeur d'une expression entière. Voici sa
forme :
|
 |
 |
 |
switch(integral-selector) { case integral-value1 : statement; break; case integral-value2 : statement; break; case integral-value3 : statement; break; case integral-value4 : statement; break; case integral-value5 : statement; break; // ... default: statement; }
|
 |
switch(sélecteur-entier) { case valeur-entière1 : instruction; break; case valeur-entière2 : instruction; break; case valeur-entière3 : instruction; break; case valeur-entière4 : instruction; break; case valeur-entière5 : instruction; break; // ... default : instruction; }
|
 |
 |
 |
 |
 |
 |
 |
 |
|
 |
 |
 |