• Aucun résultat trouvé

L’instruction for

Dans le document Programmer en Java (Page 115-120)

Les instructions de contrôle de Java

5 L’instruction for

Etudions maintenant la dernière instruction permettant de réaliser des boucles.

5.1 Exemple d'introduction

Considérons ce programme :

public class For1

{ public static void main (String args[]) { int i ;

for (i=1 ; i<=5 ; i++)

{ System.out.print ("bonjour ") ; System.out.println (i + " fois") ; }

} }

bonjour 1 fois bonjour 2 fois bonjour 3 fois bonjour 4 fois bonjour 5 fois

Exemple d’instruction for La ligne :

for (i=1 ; i<=5 ; i++ )

comporte en fait trois expressions. La première est évaluée (une seule fois) avant d'entrer dans la boucle. La deuxième conditionne la poursuite de la boucle. Elle est évaluée avant chaque parcours. La troisième, enfin, est évaluée à la fin de chaque parcours.

Le programme précédent équivaut au suivant :

public class For2

{ public static void main (String args[]) { int i = 1 ;

i = 1 ; while (i <= 5)

{ System.out.print ("bonjour ") ; System.out.println (i + " fois") ; i++ ;

} } }

Pour remplacer une boucle for par une boucle while

5.2 L’instruction for en général

L’exemple précédent correspond à l’usage le plus fréquent d’une instruction for :

• la première partie correspond à l’initialisation d’un compteur (ici i),

• la deuxième partie correspond à la condition d’arrêt (i<=5),

• la troisième partie correspond à l’incrémentation du compteur.

En fait, Java autorise qu’on place en première et en troisième partie une liste d’expressions, c’est-à-dire une ou plusieurs expressions (de type quelconque) séparées par des virgules. La deuxième partie, en revanche, est obligatoirement une expression booléenne.

Voici un exemple de programme utilisant ces possibilités :

public class For3

{ public static void main (String args[]) { int i, j ;

for (i=1 , j=3 ; i<=5 ; i++, j+=i)

{ System.out.println ("i = " + i + " j = " + j) ; }

} }

i = 1 j = 3 i = 2 j = 5 i = 3 j = 8

i = 4 j = 12 i = 5 j = 17

La première partie de l’instruction for peut également être une déclaration, ce qui permet d’écrire l’exemple précédent de cette façon :

public class For4

{ public static void main (String args[]) { for (int i=1 , j=3 ; i<=5 ; i++, j+=i)

{ System.out.println ("i = " + i + " j = " + j) ; }

} }

Dans ce cas, les variables i et j sont locales au bloc régis par l’instruction for. L’emplacement correspondant est alloué à l’entrée dans l’instruction for et il disparaît à la fin.

Ainsi les deux formulations des deux programmes précédents ne sont-elles pas rigoureuse-ment équivalentes. Dans le premier cas, en effet, i et j existent encore après sortie de la bou-cle.

5.3 Syntaxe de l’instruction for

instruction est une instruction quelconque,

initialisation est une déclaration ou une suite d’expressions quelconques séparées par des virgules,

condition est une expression booléenne quelconque,

incrémentations sont des suites d’expressions quelconques séparées par des virgu-les.

N.B. : Les crochets [ et ] signifient que ce qu'ils renferment est facultatif.

Commentaires

1 Chacune des trois parties de l’instruction est facultative. Ainsi, les trois ensembles d’instructions suivants sont équivalents :

for (i=1 ; i<=5 ; i++) { System.out.print ("bonjour ") ; System.out.println (i + " fois") ; }

for ( [initialisation] ; [condition] ; [incrémentationss]) instruction

i=1 ;

for ( ; i<=5 ; i++) // ne pas oublier le premier point-virgule { System.out.print ("bonjour ") ;

System.out.println (i + " fois") ; }

i=1 ;

for (; i<=5 ; )

{ System.out.print ("bonjour ") ; System.out.println (i + " fois") ; i++ ;

}

Si la condition est absente, elle est considérée comme vraie. On pourrait penser que, dans ce cas, on aboutit à une boucle infinie. En fait, on verra qu’il est possible qu’une telle boucle renferme une instruction break permettant d’y mettre fin.

2 La généralité de la syntaxe de l’instruction permet de placer plusieurs actions dans les différentes parties. Nous avons déjà vu :

for (int i=1 , j=3 ; i<=5 ; i++, j+=i)

On pourrait même imaginer (bien que ce ne soit guère raisonnable) de remplacer

for (i=1 ; i<= 5 ; i++) ...

par :

for (i=0 ; ++i <= 5 ; )

3 La partie initialisation vous demande de choisir entre déclaration et liste d’expressions.

En général, cela s’avère suffisant. Ainsi, nous avons vu que l’on pouvait employer

for (int i=1, j=3 ; ... )

au lieu de :

int i, j ; ...

for (i=1, j=3 ; ... )

En revanche, vous ne pourrez pas initialiser deux variables de types différentes en les déclarant dans for :

for (int i=1, double x=0. ; ... ) // incorrect

Il vous faudra en déclarer au moins une à l’extérieur.

4 On peut écrire une boucle dont le corps est vide. Ainsi, les deux constructions :

for ( ; ; ) ; for ( ; ; ) { }

sont syntaxiquement correctes. Elles représentent des boucles infinies de corps vide (n'oubliez pas que, lorsque la seconde expression est absente, elle est considérée

comme vraie). En pratique, elles ne présentent aucun intérêt. En revanche, cette cons-truction

for ( ; ; ) instruction

est une boucle infinie dont on pourra éventuellement sortir par une instruction break (comme nous le verrons un peu plus loin).

Remarques

1 Comme dans tous les langages, il faut prendre des précautions avec les compteurs qui ne sont pas de type entier. Ainsi, avec une construction telle que :

for (double x=0. ; x <=1.0 ; x+=0.1)

le nombre de tours dépend de l’erreur d’arrondi des calculs. Pire, avec :

for (double x=0. ; x !=1.0 ; x+=0.1)

on obtient une boucle infinie car, après 10 tours, la valeur de x n’est pas rigoureusement égale à 10...

2 Java ne vous interdit pas une construction telle que :

for (i=1 ; i<=5 ; i++) { ...

i-- ; ...

}

Si la valeur de i n’est pas modifiée ailleurs dans le corps de boucle, on aboutit à une boucle infinie.

Contrairement à ce qui se passe dans certains langages comme Pascal ou Fortran, l’ins-truction for de Java est en effet une boucle conditionnelle (comme celle de C++). Il ne s’agit pas d’une vraie boucle avec compteur (dans laquelle on se contenterait de citer le nom d’un compteur, sa valeur de début et sa valeur de fin), même si finalement elle est surtout utilisée ainsi.

Dans ces conditions, le compilateur ne peut pas vous interdire de modifier la valeur d’un compteur (voire de plusieurs) dans la boucle. Il est bien entendu vivement déconseillé de le faire.

En C++

En C++, l’instruction for fonctionne de manière semblable. Mais le test porte sur la non-nullité de la valeur d’une expression numérique. Comme en C++, il existe un opérateur virgule (que ne possède pas Java), cette expression peut en fait en juxtaposer plusieurs.

6 Les instructions de branchement

Dans le document Programmer en Java (Page 115-120)