【问题标题】:C/C++ conditional return statements [duplicate]C/C++ 条件返回语句 [重复]
【发布时间】:2013-06-18 19:29:58
【问题描述】:

我正在研究嵌入式程序,在某些情况下,如果某个条件并不意味着,我想尽快从函数中返回。如果我有以下代码并且我正在做嵌入式编程:

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

我的问题是,有多个返回语句是不是很糟糕?这是不好的做法吗?有没有更好的方法? MISRA 对此有什么说法吗?

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

谢谢...

【问题讨论】:

  • 不,这绝对不是坏习惯。
  • 我还想删除else。没必要。
  • 感觉这样在programmers.SE上会更好。
  • @Lundin:但是lots of calculations in this block 不会发生。
  • @Lundin:您提出了一种改变函数语义的转换。如果a &gt;= b 做很多事情,然后返回,你只需return

标签: c++ c misra


【解决方案1】:

MISRA 需要一个返回语句:

(MISRA,规则 14.7:必需)“函数应在函数末尾有一个退出点”

现在,我个人认为这不是一个好规则。尽量减少 return 语句的数量,但在增强代码的可读性时使用 return 语句。

例如guard clauses 可以使您的代码更简洁、更具可读性。

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

【讨论】:

  • MISRA 规则是一个可怕的规则。尤其是在 C++ 中,您只需 return 并依赖 RAII。
  • 为“令人惊讶的好”文章+1
  • @Massa MISRA 没有使用自己的大脑,他们只是引用了 IEC 61508,错误地假设它是由理智的人编写的标准。请参阅我对来源问题的评论。我什至在 MISRA-C12 的公开审查期间向委员会指出了这一点,但他们仍宁愿避免其规则背后的任何理由。
  • MISRA C:2012 已将规则修改为咨询 - 我坚持认为该规则在大多数情况下是正确的。但是,在某些情况下,遵守此规则会使事情变得比不遵守规则的可读性/可维护性更差。
  • @Andrew 究竟哪个欧盟指令将 IEC 61508 列为规范标准?关于这背后的实际 科学来源,您可以参考 MISRA-C,它引用了 IEC61508,它引用了 (IEC 61508:7 C.2.9) 一个单一的、完全过时的来源:a 34 year old programming book。不管你喜不喜欢,计算机科学的遗物是唯一的理由 61508,因此 MISRA 提供了。所以我支持不使用自己的大脑的评论。
【解决方案2】:

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

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

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

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

例如,考虑阶乘:

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

  // recursive call
  return x * fact(x-1);
}

你也可以这样写:

int fact(int x) {
  int ret = 0;
  if (x == 0 || x == 1)
    ret = 1;
  else
    ret = x * fact(x-1);
  return ret;
}

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

这真的归结为您必须遵循的任何标准和个人喜好。

【讨论】:

    【解决方案3】:

    有些人认为这是不好的做法,我个人认为它可以使代码看起来更干净。你也可以这样做:

    foo() {
       int results = 0;  // good practice to initialize
       if (a < b) {
           results = 0;  // redundant, likely optimized out
       } else {
           // lots of calculations in this block
           results = 1;
       }
       return results;
    }
    

    【讨论】:

      【解决方案4】:

      多个 return 语句在 C/C++ 中完全有效。但请确保始终执行至少一个返回语句。以下函数不正确,

      int foo(int x)
      {
        if(x>0)
        {
          return 1;
        }
        else if(x==0)
        {
          return 0;
        }
        else
        {
          // No return in this block
        }
      }
      

      在 C/C++ 中应该避免这种情况。

      【讨论】:

        【解决方案5】:

        在一个函数中有多个返回语句是完全可以接受的。事实上,在上面列出的函数中包含多个 return 语句可以提高性能和可读性。例如,您不需要上述函数中的else 块,因为如果满足条件,您将从函数中返回。

        只要确保如果你的函数没有void 的返回类型,那么你最后有一个return 语句,并且所有的return 语句都返回该类型。例如,如果你的函数是这样声明的:

        int foo ();
        

        那么你所有的 return 语句都必须返回整数,并且无论如何你都应该在最后返回一个整数。但是如果你的函数的返回类型是 void,像这样:

        void foo ();
        

        那么如果你到达函数的末尾并且没有return关键字,函数会自动返回。

        【讨论】:

        • 哇,非常有趣的见解
        猜你喜欢
        • 2013-12-17
        • 1970-01-01
        • 2018-03-30
        • 2021-05-10
        • 2016-12-08
        • 2014-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多