C/C++条件返回语句

use*_*541 8 c c++ misra

我正在研究嵌入式程序,在某些情况下如果没有条件,我想尽快从函数返回.如果我有以下代码,我正在进行嵌入式编程:

foo() {
   if (a < b) {
       return 0;  // bail, since condition is met
   } else {
       // lots of calculations in this block
   }
   return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,有多个return语句是不是很糟糕?这是不好的做法吗?有更好的方法吗?MISRA是否对此有所说明?

注意:这个问题特别针对嵌入式系统,与MISRA有关,而不仅仅是C/C++

谢谢...

oua*_*uah 15

MISRA需要一份退货声明:

(MISRA,规则14.7:要求)"功能在功能结束时应有单点退出"

现在,我个人认为这不是一个好规则.最小化返回语句的数量,但在增强代码的可读性时使用return语句.

例如,guard子句可以使您的代码更清晰,更易读.

我建议你阅读这篇关于duffing的文章(从上到下编写代码):

  • MISRA规则是一个糟糕的**规则.特别是在C++中,你可以"返回"并依赖RAII. (14认同)
  • @Massa MISRA没有使用他们自己的大脑,他们只是引用了IEC 61508,错误地认为它是由理智的人写的标准.请参阅我对来源问题的评论.我甚至在对MISRA-C12进行公开审查期间向委员会指出了这一点,但他们仍然倾向于避免其规则背后的任何理由. (4认同)
  • MISRA C:2012已将规则修订为咨询 - 我坚持认为规则在大多数情况下是正确的*.但是,在某些情况下,遵守此规则会使不符合要求的可读性/可维护性降低. (2认同)
  • @Andrew 到底哪个欧盟指令将 IEC 61508 列为规范标准?关于这背后的实际_科学来源_,你可以去MISRA-C,它引用了IEC61508,它引用了(IEC 61508:7 C.2.9)这一信念的一个完全过时的来源:[一本34年前的编程书](http: //www.amazon.com/Structured-Design-Fundamentals-Discipline-Computer/dp/0138544719/ref=sr_1_5?ie=UTF8&amp;qid=1375778891&amp;sr=8-5&amp;keywords=E.+Yourdon)。不管你喜欢与否,计算机科学的遗迹是 61508 的唯一理由,因此 MISRA 提供了这一点。所以我坚持不使用自己的大脑发表评论。 (2认同)

dcp*_*dcp 5

我会这样写,因为这else是多余的:

   if (a < b) {
       return 0;  // bail, since condition is met
   }
   // lots of calculations in this block
   return 1;
Run Code Online (Sandbox Code Playgroud)

我不认为有经验法则,但如果函数真的很长并且有多个返回点,则可能很难维护和理解。

然而,例如,在递归函数中,将“基本情况”作为返回语句放在函数的开头非常方便。

例如,考虑阶乘:

int fact(int x) {
  // base cases
  if (x == 0 || x == 1)
    return 1;

  // recursive call
  return x * fact(x-1);
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样写:

int fact(int x) {
  int ret = 0;
  if (x == 0 || x == 1)
    ret = 1;
  else
    ret = x * fact(x-1);
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

我只是更喜欢第一种方式,但这并不意味着任何一种方式都比另一种更好。

这实际上取决于您必须遵循的标准和个人喜好。