Récemment, j’ai discuté avec un collègue du mot clef elseif présent en PHP, nécessaire au bon fonctionnement de sa syntaxe alternative. Celui-ci me disait qu’utiliser directement else if, permettait de simplifier l’analyse syntaxique étant donné que le compilateur n’avait plus à parser deux mots clefs à la suite dans un cas spécifique. Par avant, j’avais déjà rencontré sur des forums des débutants qui pensaient même que else if est un mot clef du langage (en C++), qui possède un espace.
Par conséquent, je fais ce petit rappel sur le fonctionnement de l’instruction if (if statement). Il est probable que les notions abordées dans cet article soient déjà connues par la majorité des développeurs.
En C++, (et de façon similaire en Java, C# etc… qui suivent cette syntaxe héritée du C), l’instruction if suit la syntaxe suivante (depuis C++17) :
1 2 3 4 5 6 7 |
attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement-true attr(optional) if constexpr(optional) ( init-statement(optional) condition ) statement-true else statement-false |
Si on oublie les éléments optionnels (les attributs, le constexpr et l’init-statement), cela se resume ainsi :
1 2 3 4 5 6 7 |
if(condition) expression_vrai; if (condition) expression_vrai; else expression_faux; |
Constatez qu’il n’est jamais fait mention d’un bloc else if, ni même d’une instruction else (qui fait simplement partie de l’instruction if ) Si la condition est vraie, expression_vrai est exécutée, sinon l' expression_faux est exécutée.
Prenons un exemple tout simple :
1 2 3 4 5 6 7 8 9 10 11 12 |
void print_age(int age) { using std::cout; if(age < 0) cout << "Vous n'êtes pas encore né.\n"; if(age >= 0 && age < 18) cout << "Vous êtes mineur.\n"; if(age >=18 && age < 100) cout << "Vous êtes majeur.\n"; if(age >= 100) cout << "Vous êtes centenaire.\n"; } |
L’intérêt d’avoir un if dans le bloc else, c’est qu’on sait déjà que la condition précédente est fausse :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void print_age(int age) { using std::cout; if( age < 0) cout << "Vous n'êtes pas encore né.\n"; else { if (age < 18) cout << "Vous êtes mineur.\n"; else { if (age < 100) cout << "Vous êtes majeur.\n"; else cout << "Vous êtes centenaire.\n"; } } } |
Le bloc if (ou if/else) est un if-statement, et constitue donc une unique expression. Par conséquent, les accolades ne sont pas nécessaires :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void print_age(int age) { using std::cout; if( age < 0) cout << "Vous n'êtes pas encore né.\n"; else if (age < 18) cout << "Vous êtes mineur.\n"; else if (age < 100) cout << "Vous êtes majeur.\n"; else cout << "Vous êtes centenaire.\n"; } |
Dans un cas comme celui-ci, pour des langages tels que le C où l’indentation est laissée au choix du développeur, il est possible de rendre le code nettement plus facile à lire :
1 2 3 4 5 6 7 8 9 10 11 12 |
void print_age(int age) { using std::cout; if( age < 0) cout << "Vous n'êtes pas encore né.\n"; else if (age < 18) cout << "Vous êtes mineur.\n"; else if (age < 100) cout << "Vous êtes majeur.\n"; else cout << "Vous êtes centenaire.\n"; } |
Ici, seule l’indentation a été changée, il s’agit toujours d’une imbrication de bloc if.
Dans un langage comme le Python ou encore PHP en syntaxe alternative, l’indentation n’est pas libre étant donné qu’elle définit la portée en se substituant aux accolades. L’équivalent en python par exemple serait :
1 2 3 4 5 6 7 8 9 10 11 |
def print_age(age) : if age < 0: print("Vous n'êtes pas encore né.") else: if age < 18: print("Vous êtes mineur.") else: if age < 100: print("Vous êtes majeur.") else: print("Vous êtes centenaire.") |
C’est pourquoi, ces langages se voient obligés d’introduire un mot clef supplémentaire ( elseif en PHP ou elif en Python par exemple) pour compenser :
1 2 3 4 5 6 7 8 9 |
def print_age(age) : if age < 0: print("Vous n'êtes pas encore né.") elif age < 18: print("Vous êtes mineur.") elif age < 100: print("Vous êtes majeur.") else: print("Vous êtes centenaire.") |
Ainsi ce termine cette réflexion au sujet des blocs if/else en programmation, à bientôt pour de nouveaux articles.
You must log in to post a comment.