使用 else 子句终止 if ... else if 构造有什么好处?

2023-11-23

我们的组织有一个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(使用前将#替换为@)

使用 else 子句终止 if ... else if 构造有什么好处? 的相关文章

随机推荐