如果… else if结构带有else子句,结束的好处是什么?

我们的组织有一个必要的编码规则(没有任何解释):

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。如果原因是可重用性和可扩展性,我认为其他应该在这两种情况下使用。

最佳答案
正如在另一个答案中提到的,这是从MISRA-C编码指南。目的是防御性编程,这是一个经常用于关键任务编程的概念。

也就是说,每个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 simple if
statement.

转载注明原文:如果… else if结构带有else子句,结束的好处是什么? - 代码日志