Я хотел бы добавить - и частично опровергнуть - предыдущие ответы. Хотя, безусловно, часто используют if-else if в виде переключателя, который должен охватывать весь диапазон мыслимых значений для выражения, отнюдь не гарантируется, что любой диапазон возможных условий будет полностью покрыт. То же самое можно сказать и о самой конструкции switch, отсюда и требование использовать предложение по умолчанию, которое перехватывает все оставшиеся значения и может, если в любом случае не требуется иное, использоваться в качестве гарантии подтверждения.
Сам вопрос имеет хороший контрпример: второе условие вообще не относится к x (именно поэтому я часто предпочитаю более гибкий вариант на основе if, чем вариант на основе коммутатора). Из примера очевидно, что если условие A выполнено, x должно быть установлено на определенное значение. Если A не выполняется, то условие B проверяется. Если оно выполнено, то x должен получить другое значение. Если ни A, ни B не выполняются, то x должен остаться без изменений.
Здесь мы можем видеть, что пустая ветвь else должна использоваться, чтобы прокомментировать намерение программиста для читателя.
С другой стороны, я не могу понять, почему должно быть предложение else, особенно для самого последнего и самого внутреннего оператора if. В C не существует такой вещи, как «else if». Есть только если и еще. Вместо этого, согласно MISRA, конструкция должна формально иметь отступ таким образом (и я должен был поставить открывающие фигурные скобки на их собственных строках, но мне это не нравится):
if (A) {
// do something
}
else {
if (B) {
// do something else (no pun intended)
}
else {
// don't do anything here
}
}
Когда MISRA просит поместить фигурные скобки вокруг каждой ветви, это противоречит самому себе, говоря «if ... else if constructs».
Любой может вообразить безобразие глубоко вложенных, если не еще деревьев, см. Здесь на заметке . Теперь представьте, что эта конструкция может быть произвольно расширена где угодно. Тогда просьба о предложении else в конце, но не в другом месте, становится абсурдной.
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.
}
Так что я уверен, что люди, которые разработали руководящие принципы MISRA, имели в виду что-то вроде переключателя «если-еще, если-то».
В конце концов, все сводится к точному определению того, что подразумевается под «если ... еще, если конструкция»