C/ c++条件返回语句
C/C++ conditional return statements
我正在研究嵌入式程序,在某些情况下,如果条件不意味着,我想尽快从函数返回。如果我有以下代码,我正在做嵌入式编程:
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需要一个单独的返回语句:
现在,我个人认为这不是一个好规则。尽量减少return语句的数量,但在增强代码可读性的情况下使用return语句。(MISRA,规则14.7:required)"函数在函数结束时应有一个单出口点"
例如,保护子句可以使你的代码更清晰,更易读。
我建议您阅读这篇关于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
关键字,函数将自动返回
- 返回语句后的代码,没有警告
- 三元运算符在返回语句中给出意外的结果
- 返回非 void 的函数中没有返回语句警告
- 如何使用单个返回语句返回对变量的引用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 获取上次执行的返回语句的行
- 返回语句中矢量初始化时出现编译错误
- 快速搜索链表未编译,需要返回语句
- 静态成员函数赋值而不带返回语句
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- 为什么返回语句和打印语句返回不同的答案?
- C++ 非 void 函数的崩溃没有返回语句
- 在返回语句中嵌套条件运算符
- 为什么结构化绑定禁用RVO和移动返回语句
- C - 程序返回值而无需返回语句
- 返回语句中的构造函数语法
- 编译器遇到返回语句时会做什么
- 是一个单一的返回语句清洁器
- C NRVO/复制Elision在括号中带有返回语句
- C 编译器 - 被遗忘的返回语句