我们的组织有一个required编码规则(没有任何解释):
if … else if 构造应以 else 子句终止
示例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
but 实施例2做。如果原因是可重用性和可扩展性,我认为else
两种情况都应该使用。
正如另一个答案中提到的,这是来自 MISRA-C 编码指南。目的是防御性编程,这是关键任务编程中经常使用的概念。
也就是说,每一个if - else if
必须以else
,以及每一个switch
必须以default
.
有两个原因:
-
自记录代码。如果你写一个else
但将其留空意味着:“我确实考虑过当两者都没有时的情况if
nor else if
是真的”。
不写一个else
意思是:“我要么考虑过这样的情况,要么if
nor else if
是真的,或者我完全忘记考虑它,并且我的代码中可能存在一个巨大的错误”。
-
停止失控代码。在关键任务软件中,您需要编写强大的程序,即使是极不可能的情况也能解决。所以你可以看到类似的代码
if (mybool == TRUE)
{
}
else if (mybool == FALSE)
{
}
else
{
// handle error
}
这段代码对于 PC 程序员和计算机科学家来说是完全陌生的,但它在关键任务软件中非常有意义,因为它捕获了“mybool”由于某种原因而损坏的情况。
从历史上看,您会担心 RAM 内存会因 EMI/噪声而损坏。今天这不是什么大问题。更有可能的是,内存损坏是由于代码中其他地方的错误而发生的:指向错误位置的指针、数组越界错误、堆栈溢出、失控代码等。
所以大多数时候,当你在实现阶段写出bug时,这样的代码就会回来打自己的脸。这意味着它也可以用作调试技术:您正在编写的程序会告诉您何时编写了错误。
EDIT
至于为什么else
不需要在每一个之后if
:
An if-else
or if-else if-else
完全涵盖了变量可以具有的所有可能值。但一个平淡的if
语句不一定涵盖所有可能的值,它有更广泛的用途。大多数情况下,您只想检查某个条件,如果不满足,则不执行任何操作。那么编写防御性编程来覆盖就没有任何意义了else
case.
另外,如果你写了一个空的,它会让代码完全混乱else
每一次之后if
.
MISRA-C:2012 15.7 没有给出原因else
不需要,它只是指出:
注:决赛else
对于简单的情况不需要声明if
陈述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)