Je voudrais ajouter - et contredire en partie - les réponses précédentes. Bien qu'il soit certainement courant d'utiliser if-else if d'une manière de type interrupteur qui devrait couvrir l'ensemble des valeurs imaginables d'une expression, il n'est en aucun cas garanti que toute plage de conditions possibles soit entièrement couverte. La même chose peut être dite à propos de la construction du commutateur elle-même, d'où l'exigence d'utiliser une clause par défaut, qui capture toutes les valeurs restantes et peut, si ce n'est pas nécessaire de toute façon, être utilisée comme sauvegarde d'assertion.
La question elle-même présente un bon contre-exemple: la deuxième condition ne concerne pas du tout x (c'est la raison pour laquelle je préfère souvent la variante basée sur if plus flexible à la variante basée sur le commutateur). D'après l'exemple, il est évident que si la condition A est remplie, x doit être mis à une certaine valeur. Si A n'est pas satisfait, la condition B est testée. S'il est satisfait, alors x devrait recevoir une autre valeur. Si ni A ni B ne sont satisfaits, alors x doit rester inchangé.
Ici, nous pouvons voir qu'une branche else vide doit être utilisée pour commenter l'intention du programmeur pour le lecteur.
D'un autre côté, je ne vois pas pourquoi il doit y avoir une clause else, en particulier pour la dernière et la plus profonde déclaration if. En C, il n'y a pas de «sinon si». Il n'y a que si et autre. Au lieu de cela, selon MISRA, la construction devrait formellement être indentée de cette façon (et j'aurais dû mettre les accolades d'ouverture sur leurs propres lignes, mais je n'aime pas ça):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Quand MISRA demande de mettre des accolades autour de chaque branche, alors il se contredit en mentionnant "if ... else if constructs".
N'importe qui peut imaginer la laideur des arbres if else profondément imbriqués, voir ici sur une note latérale . Imaginez maintenant que cette construction puisse être étendue arbitrairement n'importe où. Ensuite, demander une clause else à la fin, mais pas ailleurs, devient absurde.
if (A) {
if (B) {
// do something
}
// you could to something here
}
else {
// or here
if (B) { // or C?
// do something else (no pun intended)
}
else {
// don't do anything here, if you don't want to
}
// what if I wanted to do something here? I need brackets for that.
}
Je suis donc sûr que les personnes qui ont développé les lignes directrices MISRA avaient l'intention de passer si-sinon si à l'esprit.
En fin de compte, il leur revient de définir précisément ce que l'on entend par "if ... else if construct"