10

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

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

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

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

谢谢...

4

5 回答 5

17

MISRA 需要一个返回语句:

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

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

例如,保护子句可以使您的代码更清晰,更具可读性。

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

于 2013-06-18T19:32:05.033 回答
4

我会这样写,因为它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;
}

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

它实际上归结为您必须遵循的任何标准和个人喜好。

于 2013-06-18T19:33:41.487 回答
1

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

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;
}
于 2013-06-18T19:35:19.600 回答
0

Multiple return statements is perfectly valid in C/C++. But make sure that at least one of the return statements is always executed. The following function is incorrect,

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

such situations should be avoided in C/C++.

于 2013-06-18T19:36:08.517 回答
0

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

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

int foo ();

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

void foo ();

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

于 2013-06-18T19:38:03.113 回答