Our organization has a required coding rule (without any explanation) that:
if … else if constructs should be terminated with an else clause
Example 1:
if ( x < 0 )
{
x = 0;
} /* else not needed */
Example 2:
if ( x < 0 )
{
x = 0;
}
else if ( y < 0 )
{
x = 3;
}
else /* this else clause is required, even if the */
{ /* programmer expects this will never be reached */
/* no change in value of x */
}
What edge case is this designed to handle?
What also concerns me about the reason is that Example 1 does not need an else
but Example 2 does. If the reason is re-usability and extensibility, I think else
should be used in both cases.
As mentioned in another answer, this is from the MISRA-C coding guidelines. The purpose is defensive programming, a concept which is often used in mission-critical programming.
That is, every
if - else if
must end with anelse
, and everyswitch
must end with adefault
.There are two reasons for this:
Self-documenting code. If you write an
else
but leave it empty it means: "I have definitely considered the scenario when neitherif
norelse if
are true".Not writing an
else
there means: "either I considered the scenario where neitherif
norelse if
are true, or I completely forgot to consider it and there's potentially a fat bug right here in my code".Stop runaway code. In mission-critical software, you need to write robust programs that account even for the highly unlikely. So you could see code like
This code will be completely alien to PC programmers and computer scientists, but it makes perfect sense in mission-critical software, because it catches the case where the "mybool" has gone corrupt, for whatever reason.
Historically, you would fear corruption of the RAM memory because of EMI/noise. This is not much of an issue today. Far more likely, memory corruption occurs because of bugs elsewhere in the code: pointers to wrong locations, array-out-of-bounds bugs, stack overflow, runaway code etc.
So most of the time, code like this comes back to slap yourself in the face when you have written bugs during the implementation stage. Meaning it could also be used as a debug technique: the program you are writing tells you when you have written bugs.
EDIT
Regarding why
else
is not needed after every singleif
:An
if-else
orif-else if-else
completely covers all possible values that a variable can have. But a plainif
statement is not necessarily there to cover all possible values, it has a much broader usage. Most often you just wish to check a certain condition and if it is not met, then do nothing. Then it is simply not meaningful to write defensive programming to cover theelse
case.Plus it would clutter up the code completely if you wrote an empty
else
after each and everyif
.MISRA-C:2012 15.7 gives no rationale why
else
is not needed, it just states: