Ich möchte die vorherigen Antworten ergänzen - und teilweise widersprechen. Während es sicherlich üblich ist, if-else zu verwenden, wenn es sich um einen Schalter handelt, der den gesamten Bereich denkbarer Werte für einen Ausdruck abdecken soll, ist keineswegs garantiert, dass ein Bereich möglicher Bedingungen vollständig abgedeckt ist. Das Gleiche gilt für das Switch-Konstrukt selbst, daher die Anforderung, eine Standardklausel zu verwenden, die alle verbleibenden Werte abfängt und, sofern dies nicht anderweitig erforderlich ist, als Assertionsschutz verwendet werden kann.
Die Frage selbst enthält ein gutes Gegenbeispiel: Die zweite Bedingung bezieht sich überhaupt nicht auf x (weshalb ich häufig die flexiblere if-basierte Variante der switchbasierten Variante vorziehe). Aus dem Beispiel geht hervor, dass x auf einen bestimmten Wert gesetzt werden sollte, wenn die Bedingung A erfüllt ist. Sollte A nicht erfüllt sein, wird Bedingung B getestet. Wenn es erfüllt ist, sollte x einen anderen Wert erhalten. Wenn weder A noch B erfüllt sind, sollte x unverändert bleiben.
Hier können wir sehen, dass ein leerer else-Zweig verwendet werden sollte, um die Absicht des Programmierers für den Leser zu kommentieren.
Andererseits kann ich nicht verstehen, warum es eine else-Klausel speziell für die neueste und innerste if-Anweisung geben muss. In C gibt es kein "else if". Es gibt nur wenn und sonst. Stattdessen sollte laut MISRA das Konstrukt auf diese Weise formal eingerückt werden (und ich hätte die öffnenden geschweiften Klammern auf ihre eigenen Linien setzen sollen, aber das gefällt mir nicht):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Wenn MISRA darum bittet, geschweifte Klammern um jeden Zweig zu setzen, widerspricht es sich selbst, indem es "wenn ... sonst wenn Konstrukte" erwähnt.
Jeder kann sich die Hässlichkeit tief verschachtelter Bäume vorstellen, siehe hier eine Randnotiz . Stellen Sie sich nun vor, dass dieses Konstrukt beliebig überall erweitert werden kann. Dann wird es absurd, am Ende nach einer else-Klausel zu fragen, aber nirgendwo anders.
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.
}
Ich bin mir also sicher, dass die Leute, die die MISRA-Richtlinien entwickelt haben, das switch-like if-else-beabsichtigte Ziel hatten.
Am Ende kommt es darauf an, genau zu definieren, was mit einem "wenn ... sonst wenn Konstrukt" gemeint ist.