Gostaria de acrescentar - e parcialmente contradizer - as respostas anteriores. Embora seja certamente comum usar if-else se de uma maneira semelhante a uma opção que cubra toda a gama de valores pensáveis para uma expressão, não é de forma alguma garantido que qualquer faixa de condições possíveis seja totalmente coberta. O mesmo pode ser dito sobre a própria construção do comutador, daí o requisito de usar uma cláusula padrão, que captura todos os valores restantes e pode, se não for necessário de outra forma, ser usado como uma salvaguarda de asserção.
A pergunta em si apresenta um bom contra-exemplo: a segunda condição não se relaciona com x (de modo que é a razão pela qual eu prefiro a variante baseada em if mais flexível do que a variante baseada em switch). A partir do exemplo, é óbvio que, se a condição A for atendida, x deve ser definido com um determinado valor. Se A não for atendido, a condição B será testada. Se for atendido, x deve receber outro valor. Se nem A nem B forem atendidos, x deve permanecer inalterado.
Aqui podemos ver que um ramo else vazio deve ser usado para comentar a intenção do programador para o leitor.
Por outro lado, não vejo por que deve haver uma cláusula else especialmente para a declaração if mais recente e mais interna. Em C, não existe um 'else if'. Existe apenas se e mais. Em vez disso, de acordo com MISRA, o construto deve ser formalmente recuado dessa maneira (e eu deveria ter colocado as chaves de abertura em suas próprias linhas, mas não gosto disso):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Quando MISRA pede para colocar chaves em todos os ramos, ele se contradiz mencionando "se ... senão se constrói".
Qualquer um pode imaginar a feiúra das árvores profundamente aninhadas, veja aqui em uma nota lateral . Agora imagine que essa construção possa ser arbitrariamente estendida em qualquer lugar. Então, pedir uma cláusula else no final, mas não em nenhum outro lugar, torna-se absurdo.
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.
}
Portanto, tenho certeza de que as pessoas que desenvolveram as diretrizes da MISRA tinham em mente a intenção de alternar entre outros fatores.
No final, cabe a eles definir com precisão o que se entende por um "se ... outro se constrói"