if … else if constructs should be terminated with an else clause
实施例1:
if ( x < 0 )
{
x = 0;
} /* else not needed */
实施例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 */
}
这个设计处理什么边缘情况?
我还关心的是,原因是示例1不需要else,但是示例2。如果原因是可重用性和可扩展性,我认为其他应该在这两种情况下使用。
也就是说,每个if – else if必须以一个else结束,并且每个开关必须以默认值结束。
有两个原因:
>自我记录代码。如果你写一个else但是留空它意味着:“我肯定考虑了情况,既不是if或者else都是真的。
不是写一个else的意思是:“我认为的情况下,既不是,如果是真的,或者我完全忘了考虑它,并有可能在我的代码一个脂肪的bug”。
>停止失控代码。在任务关键型软件中,您需要编写强大的程序,即使是极不可能的。所以你可以看到代码
if (mybool == TRUE)
{
}
else if (mybool == FALSE)
{
}
else
{
// handle error
}
这个代码将完全与PC程序员和计算机科学家疏远,但它在任务关键型软件中非常有意义,因为它捕获了“mybool”因为任何原因而损坏的情况。
历史上,你会害怕RAM存储器的损坏,因为EMI /噪声。这不是今天的问题。更可能的是,内存损坏发生是因为代码中的错误:指向错误位置的指针,数组超出错误,堆栈溢出,失控代码等。
所以大多数时候,像这样的代码回来,当你在实施阶段编写错误的时候拍下自己的脸。这意味着它也可以用作调试技术:您编写的程序会告诉您何时编写错误。
编辑
关于为什么不需要后每一个如果:
if-else或if-else if-else完全覆盖了变量可能具有的所有可能的值。但是一个简单的if语句不一定要覆盖所有可能的值,它有更广泛的用法。通常你只是想检查一个特定的条件,如果它不符合,然后什么也不做。然后,编写防御性编程来覆盖else case根本没有意义。
加上它会使代码完全混乱,如果你写一个空的else后每一个如果。
MISRA-C:2012 15.7没有给出为什么不需要别的原因,它只是说:
Note: a final
else
statement is not required for a simpleif
statement.
相关文章
转载注明原文:如果… else if结构带有else子句,结束的好处是什么? - 代码日志