如果使用…子句进行构造,则终止OtherElse的好处是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我们的组织有所需编码规则(不作任何解释)是:

如果应该用子句终止Else Else if结构

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

提问于
用户回答回答于

正如在另一个答案中提到的,这是来自Misra-C编码指南。其目的是防御性编程,这是一个经常用于关键任务程序设计的概念.

也就是说,每一个if - else if必须以else,每一个switch must end with a default

这有两个原因:

  • 自记录代码。如果你写一个else但让它空空如也,意思是:“我肯定考虑过这种情况,但两者都没有。if也不else if都是真的“。 不写else意思是:“要么我考虑过这样的情况,要么if也不else if是真的,或者我完全忘了考虑它,而且我的代码中有一个潜在的错误“。
  • 停止失控代码。在关键任务软件中,您需要编写健壮的程序,这些程序即使在极不可能的情况下也是如此。这样你就可以看到代码 如果(mybool==true){}---如果(mybool==false){}---{//句柄错误} 这段代码对pc程序员和计算机科学家来说是完全陌生的,但在关键任务的软件中,它是完全合理的,因为它抓住了“mybool”因任何原因而腐败的情况。 从历史上看,可能会因为EMI/噪音而担心RAM内存的损坏。今天这不是什么大问题。更有可能的是,内存损坏是由于代码中其他地方的错误:指向错误位置的指针、数组超出范围的错误、堆栈溢出、失控代码等等。 因此,大多数情况下,当您在实现阶段编写错误时,这样的代码会再次出现。这意味着它也可以用作调试技术:正在编写的程序告诉何时编写了bug。

编辑

为什么else不是每个人都需要if

if-elseif-else if-else完全涵盖变量可以拥有的所有可能值。但平原if语句不一定包含所有可能的值,它有更广泛的用法。最常见的情况是,你只想检查某个特定的条件,如果没有满足,那就什么也不做。然后编写防御性编程来覆盖else案子。

此外,如果编写了一个空的代码,代码就会完全混乱。else在每一次之后if

米斯拉-C:2012 15.7没有给出理由else不需要,它只是声明:

注:决赛else语句对于简单的if声明。

用户回答回答于

规则14.10(必需):如果使用…子句终止结构,则为All if Else。 每当if语句后面跟着一个或多个if语句时,此规则就适用;if后面跟着一个else声明。在简单的情况下if语句之后,else声明不需要包括在内。对决赛的要求else声明是防御性编程。大else声明应采取适当的行动或对不采取行动的原因提出适当的评论。这与最后一次考试的要求是一致的。default从句switch声明。例如,此代码是一个简单的if语句: if(x<0){log_错误(3);x=0;}/*否则不需要*/ 而下面的代码演示了ifelse if构造 if(x<0){log_如果(y<0){x=3;}etc/*这个Other子句是必需的,即使*/{/*程序员希望这是永远不会达到的。*//*x值不变*/}

例1:在单个if语句中,程序员可能需要检查n个条件并执行单个操作。

if(condition_1 || condition_2 || ... condition_n)
{
   //operation_1
}

在正常使用中,在下列情况下执行操作并不总是需要的if被使用了。

例2:在这里,程序员检查n个条件并执行多个操作。经常使用if..else if就像switch您可能需要执行类似默认的操作。所以使用else按照Misra标准

if(condition_1 || condition_2 || ... condition_n)
{
   //operation_1
}
else if(condition_1 || condition_2 || ... condition_n)
{
  //operation_2
}
....
else
{
   //default cause
}

扫码关注云+社区