C / C ++条件返回语句

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

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

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

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

谢谢…

MISRA需要一份退货声明:

(MISRA,规则14.7:要求)“function在function结束时应有单点退出”

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

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

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

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

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

我不认为有一个经验法则,但如果function很长并且你有多个返回点,那么很难维护和理解。

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

例如,考虑阶乘:

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

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

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

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

在函数中具有多个return语句是完全可以接受的。 实际上,在像上面列出的函数中使用多个return语句可以提供性能和可读性改进。 例如,在上述函数中不需要else块,因为如果满足条件,则从函数返回。

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

 int foo (); 

然后你的所有return语句都必须返回整数,你应该在结尾返回一个整数,无论​​如何。 但是如果你的函数有一个返回类型的void,就像这样:

 void foo (); 

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