Chciałbym uzupełnić - i częściowo zaprzeczyć - wcześniejszym odpowiedziom. Chociaż z pewnością powszechne jest użycie if-else, jeśli w sposób podobny do przełącznika, który powinien obejmować pełny zakres możliwych do pomyślenia wartości wyrażenia, w żaden sposób nie gwarantuje się, że jakikolwiek zakres możliwych warunków jest w pełni spełniony. To samo można powiedzieć o samej konstrukcji przełącznika, stąd wymóg użycia klauzuli domyślnej, która wyłapuje wszystkie pozostałe wartości i może, jeśli i tak nie jest wymagana, służyć jako zabezpieczenie asercji.
Samo pytanie zawiera dobry kontrprzykład: Drugi warunek w ogóle nie odnosi się do x (co jest powodem, dla którego często wolę bardziej elastyczny wariant oparty na if niż wariant oparty na przełączniku). Z przykładu jasno wynika, że jeśli warunek A jest spełniony, x należy ustawić na określoną wartość. Jeśli A nie zostanie spełniony, testowany jest warunek B. Jeśli jest spełnione, to x powinno otrzymać inną wartość. Jeśli ani A, ani B nie są spełnione, to x powinno pozostać niezmienione.
Tutaj widzimy, że należy użyć pustej gałęzi else, aby skomentować zamiary programisty względem czytelnika.
Z drugiej strony nie rozumiem, dlaczego musi istnieć klauzula else, szczególnie w przypadku ostatniego i najbardziej wewnętrznego stwierdzenia if. W C nie ma czegoś takiego jak „else if”. Jest tylko wtedy i jeszcze. Zamiast tego, według MISRA, konstrukcja powinna być formalnie wcięta w ten sposób (i powinienem był umieścić otwierające nawiasy klamrowe we własnych wierszach, ale nie podoba mi się to):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Kiedy MISRA prosi o umieszczenie nawiasów klamrowych wokół każdej gałęzi, zaprzecza sobie, wspominając „jeśli ... inaczej, jeśli konstrukcje”.
Każdy może sobie wyobrazić brzydotę głęboko zagnieżdżonych drzew if else, patrz tutaj na marginesie . Teraz wyobraź sobie, że ta konstrukcja może zostać dowolnie rozszerzona w dowolnym miejscu. Wtedy proszenie o klauzulę else na końcu, ale nie nigdzie indziej, staje się absurdalne.
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.
}
Jestem więc pewien, że ludzie, którzy opracowali wytyczne MISRA, mieli na myśli zamiar - jak gdyby - inaczej.
W końcu sprowadza się to do dokładnego zdefiniowania, co oznacza konstrukt „jeśli ... inaczej, jeśli”