Instruction conditionnelle
Les instructions conditionnelles, ou instructions de test, permettent de faire des choix dans un programme. Elles permettent d'altérer le déroulement du programme en fonction de la valeur de conditions. Il y a trois instructions conditionnelles en Java : l'instruction if
, l'instruction if-else
et l'instruction switch
.
Instruction if
L'instruction if
se retrouve dans de nombreux langages de programmation et permet d'exécuter une instruction si une condition est vérifiée. La condition est une expression booléenne et elle est dite vérifiée si sa valeur est true
. Voici un exemple d'instruction if
:
La condition n'est pas vérifiée puisque la valeur de l'expression diviseur == 0
est false
. Donc, l'instruction System.out.println ("Division par 0 impossible !");
n'est pas exécutée et le programme affiche à l'écran :
Diviseur = 2
Reprenons maintenant le même exemple mais en affectant la valeur 0 à la variable diviseur
:
Cette fois-ci la condition est vérifiée et donc, l'instruction System.out.println ("Division par 0 impossible !");
est exécutée et le programme affiche à l'écran :
Division par 0 impossible ! Diviseur = 0
Une instruction if
consite donc en le mot réservé if
suivi d'une condition entre parenthèses, et enfin d'une instruction. La figure 5 montre la syntaxe de l'instruction if
.
En ce qui concerne l'exécution de l'instruction if
, elle est illustrée par le flowchart présenté à la figure 6. La condition est d'abord évaluée, et si sa valeur est true
, alors l'instruction est exécutée. Sinon, la valeur de la condition vaut false
, et l'instruction est passée. Dans les deux cas, le programme continue à l'instruction suivante.
Remarquez que l'instruction à exécuter si la condition est vraie est indentée. Ce n'est pas obligatoire, mais cela permet de la mettre en évidence, afin de voir directement d'un coup d'œil qu'elle est celle de l'instruction if
. C'est une question de style, on aurait pu ne pas l'indenter ou même tout mettre sur une seule ligne (rappelez-vous la règle sur les blancs vue à la section 1.5).
Si on veut exécuter plus d'une instruction en fonction d'une condition, il suffit d'utiliser un bloc de code. Voici par exemple une instruction if
qui teste si la variable points
contenant vos points sur 20 pour un examen est supérieure à 10, et si c'est le cas, affiche vos points en pourcents à l'écran :
Ce bloc de code est tout naturellement appelé bloc if
de l'instruction if
. Il est une bonne pratique de toujours utiliser un bloc avec l'instruction if
, afin de clairement identifier les instructions qui seront exécutées si la condition est vérifiée et ainsi lever toute possible ambigüité. Pourriez-vous par exemple dire ce que va afficher l'instruction suivante à l'écran lors de son exécution ?
La condition est une expression booléenne et vous pouvez donc construire des conditions complexes en utilisant les opérateurs logiques ET, OU et NON présentés dans le chapitre précédent. Voici, par exemple, un programme qui affiche un message à l'écran si la valeur de la variable temperature
est comprise entre 36 et 38.
On vérifie simplement que la valeur de la variable temperature
est plus grande ou égale à 36 (temperature >= 36
) ET plus petite ou égale à 38 (temperature <= 38
) en utilisant l'opérateur ET logique (&&
). En Java, on ne peut pas écrire cette condition sous la forme 36 <= temperature <= 38
, ce qui pourrait sembler plus naturel. Mais on peut quand même rendre plus explicite le fait que la valeur de temperature
doit être comprise entre 36 et 38 en écrivant plutôt 36 <= temperature && temperature <= 38
.
Instruction if-else
Parfois, on aimerait exécuter une instruction si une condition est vérifiée et une autre si la condition n'est pas vérifiée. Une solution pour ce faire est d'utiliser deux instructions if
, telles que la condition de la seconde est la négation de celle de la première. Voici un extrait de programme qui teste une variable points
contenant les points d'un examen et affiche à l'écran une phrase indiquant si l'examen est réussi ou non :
L'exécution de ce code affiche à l'écran le mot raté
puisque la valeur de la condition points >= 10
est false
et donc, celle de la condition ! (points >= 10)
est true
. Vous voyez qu'on a utilisé l'opérateur NON logique pour exprimer la condition de la seconde instruction if
. On aurait également pu mettre comme condition : resultat < 10
si on voulait, il s'agit de conditions équivalentes.
Simplifier les conditions est très souvent utile pour rendre leurs compréhensions plus aisée pour les humains. Prenons par exemple la condition suivante :
La condition se lit en français comme « il ne pleut pas ou il ne fait pas noir », ce qui n'est pas facile à comprendre. En utilisant la loi de de Morgan, on peut la transformer pour obtenir la condition suivante qui se lit comme « il ne pleut pas et ne fait pas noir » :
Revenons-en à notre problème initial : exécuter une instruction si une condition est vérifiée et une autre si elle ne l'est pas. Étant donné que l'on doit assez souvent utiliser ce genre de structure, Java propose l'instruction if-else
. Voici le même exemple que tantôt revu avec l'instruction if-else
:
La figure 7 présente la syntaxe de l'instruction if-else
. La première partie est exactement la même que pour l'instruction if
; vient ensuite la seconde partie constituée du mot réservé else
suivi d'une instruction. Lorsque cette instruction est un bloc, il est appelé bloc else
. Tout comme pour l'instruction if
, il est recommandé de toujours en utiliser un.
L'instruction if-else
représente un aiguillage avec deux sorties possibles. La condition est tout d'abord évaluée et si sa valeur vaut true
, instruction1
est exécutée, sinon c'est instruction2
qui est exécutée. Le programme continue ensuite son exécution. La figure 8 montre le flowchart de l'instruction if-else
.
Instruction if-else if
Si on a plusieurs instructions, que chacune de celles-ci ne peut être exécutée que si une certaine condition est vérifiée et qu'on ne veut en exécuter qu'une seule, on va devoir utiliser plusieurs instructions if-else
imbriquées les unes dans les autres. Le programme suivant affiche une lettre correspondant à des points sur 20 en suivant la correspondance suivante : A (18–20), B (16–18), C (14–16), D (12–14) et F (0–12) (il existe de nombreux systèmes de notation, celui qui vous est présenté est l'échelle de notation du système européen ECTS.
Dans cet exemple, on a donc utilisé des blocs de code à chaque fois, pour le if
et pour le else
. On se rend vite compte que le niveau d'indentation augmente au fur et à mesure qu'on avance dans le code, ce qui risque de rendre sa lecture moins aisée si les lignes de code finissent par déborder hors de l'écran. Pour rendre le code plus clair dans de tels cas, il est conseillé de ne pas définir un bloc de code pour les else
dont l'unique instruction est une instruction if
ou if-else
. Cela permet de mettre en évidence le fait que ce que le programmeur souhaite, c'est qu'une seule instruction parmi un ensemble d'instructions soit exécutée, chacune étant liée à une condition. On obtient alors le code suivant :
Quand on utilise des instructions if-else
imbriquées, il devient important de toujours utiliser des blocs de code pour rendre le code lisible et bien faire ressortir quel else
se rapporte à quel if
. Sinon, il faut savoir que la règle est qu'un else
se rapporte toujours au if
« solitaire », c'est-à-dire sans else
, le plus proche de lui.
Dans l'exemple suivant, il ne faut pas se faire avoir par l'indentation du code et penser que le else
est lié au premier if
. En effet, le if
« solitaire » le plus proche du else
est bel et bien le second if
. L'exécution de ce code affichera donc bel et bien raté.
.
Instruction switch
La dernière instruction conditionnelle disponible en Java est l'instruction switch
. Cette instruction représente un aiguillage multiple : le choix est fait en fonction de la valeur d'une variable; chaque chemin possible correspond à une valeur différente pour la variable. Prenons d'abord un exemple : l'instruction switch
suivante permet d'afficher une phrase à l'écran en fonction de la valeur de la variable sexe
:
La valeur de l'expression du switch
est tout d'abord évaluée. Dans notre exemple, sa valeur est 'F'
et le programme se rend directement au case
correspondant à cette valeur. L'instruction System.out.println ("Vous êtes une femme.");
est donc exécutée et puis c'est au tour de l'instruction break
qui permet de directement quitter le switch
, on revient sur cette instruction à la section 3.4.
L'instruction switch
n'est ni plus ni moins qu'un raccourci d'écriture pour l'instruction if-else if
. Ce genre de raccourci est appelé sucre syntaxique; il s'agit de constructions du langage dont on pourrait se passer et qui n'apportent rien de plus si ce n'est des facilités au niveau de l'écriture du code et de sa lisibilité (il y a quand même une petite différence puisqu'avec switch
, la valeur de l'expression est évaluée une seule fois, mais avec l'équivalent if-else if
, elle l'est à chaque fois).
Le cas default
correspond au dernier else
et n'est pas obligatoire. Si on omet ce cas et qu'aucun case
ne correspond à la valeur de l'expression, aucune instruction n'est exécutée. La figure 9 montre la syntaxe de l'instruction switch
: on commence avec le mot réservé switch
suivi d'une expression entre parenthèses. Vient ensuite un bloc de code qui contient zéro, un ou plusieurs case
et éventuellement un default
. Chaque cas est défini par le mot réservé case
suivi d'une valeur et de deux-points ( :
), suivi d'une séquence d'instructions. Le cas par défaut est construit avec le mot réservé default
suivi de deux-points et d'une séquence d'instructions.
La figure 10 illustre le déroulement d'une instruction switch
en supposant que tous les cas se terminent par une instruction break
. L'expression est donc évaluée et ensuite, si un des case
correspond à sa valeur, les instructions du case
correspondant sont exécutées. Sinon, ce sont celles du default
qui sont exécutées.
L'expression du switch
doit être de type (ou doit pouvoir être converti en) int
ou char
. De plus, les valeurs utilisées dans les case
doivent être expressions constantes : c'est-à-dire soit des littéraux, soit des constantes (définies avec final
), soit des expressions dont tous les opérandes sont des constantes.
Opérateur conditionnel
Comme on l'a vu au chapitre sur les opérateurs, l'opérateur conditionnel permet de faciliter l'écriture de courtes instructions if-else
dont le but est d'affecter une valeur à une variable, celle-ci dépendant d'une condition. Voici un exemple d'utilisation de cet opérateur :
Voici maintenant l'instruction if-else
correspondante, qui calcule exactement la même chose :
Cet opérateur est donc un sucre syntaxique permettant de remplacer de courtes instructions if-else
. Il permet assez souvent d'accroitre la lisibilité du code; il ne faut cependant pas en abuser.