Vorrei aggiungere - e in parte contraddire - le risposte precedenti. Mentre è certamente comune usare if-else se in un modo simile a un interruttore che dovrebbe coprire l'intera gamma di valori pensabili per un'espressione, non è affatto garantito che qualsiasi gamma di possibili condizioni sia completamente coperta. Lo stesso si può dire del costrutto switch stesso, quindi il requisito di utilizzare una clausola di default, che cattura tutti i valori rimanenti e può, se non diversamente richiesto, essere usato come garanzia di asserzione.
La domanda stessa presenta un buon contro-esempio: la seconda condizione non si riferisce affatto a x (motivo per cui spesso preferisco la variante if-based più flessibile rispetto alla variante switch-based). Dall'esempio è ovvio che se viene soddisfatta la condizione A, x deve essere impostato su un determinato valore. Se A non viene rispettato, viene verificata la condizione B. Se viene raggiunto, allora x dovrebbe ricevere un altro valore. Se non si incontrano né A né B, allora x dovrebbe rimanere invariato.
Qui possiamo vedere che un ramo vuoto altro dovrebbe essere usato per commentare l'intenzione del programmatore per il lettore.
D'altra parte, non riesco a capire perché ci debba essere una clausola else in particolare per l'ultima e più intima dichiarazione if. In C, non esiste un 'altro if'. C'è solo se e altro. Invece, secondo MISRA, il costrutto dovrebbe essere formalmente rientrato in questo modo (e avrei dovuto mettere le parentesi graffe aperte sulle loro stesse linee, ma non mi piace):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Quando MISRA chiede di mettere parentesi graffe attorno a ogni ramo, allora si contraddice citando "se ... altrimenti se costruisce".
Chiunque può immaginare la bruttezza degli alberi profondamente nidificati se altro, vedi qui in una nota a margine . Ora immagina che questo costrutto possa essere arbitrariamente esteso ovunque. Quindi chiedere una clausola else alla fine, ma non altrove, diventa assurdo.
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.
}
Quindi sono sicuro che le persone che hanno sviluppato le linee guida MISRA avevano in mente l'intenzione di cambiare se altro.
Alla fine, scende a loro per definire esattamente cosa si intende con un "if ... else if construct"