C/ c++条件返回语句

C/C++ conditional return statements

本文关键字:返回 语句 条件 c++      更新时间:2023-10-16

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

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

我的问题是,有多个返回语句不好吗?这是不好的练习吗?有更好的方法吗?MISRA有说什么吗?

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

谢谢…

MISRA需要一个单独的返回语句:

(MISRA,规则14.7:required)"函数在函数结束时应有一个单出口点"

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

例如,保护子句可以使你的代码更清晰,更易读。

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

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

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

这取决于你必须遵循的标准和个人喜好。

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

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;
}

多个返回语句在C/c++中是完全有效的。但是要确保至少执行一个return语句。下面的函数是不正确的

int foo(int x)
{
  if(x>0)
  {
    return 1;
  }
  else if(x==0)
  {
    return 0;
  }
  else
  {
    // No return in this block
  }
}
在C/c++中应该避免

这样的情况。

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

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

int foo ();

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

void foo ();

如果到达函数末尾,没有return关键字,函数将自动返回