单步返回语句或多级返回语句
Single-Step Return Statement or Multi-Step Return Statement
示例1:
int length()
{
return strlen(random_string);
}
示例2:
int length()
{
int str_length = 0;
str_length = strlen(random_string);
return str_length;
}
问题:
我遇到过许多函数,其中一行代码可以满足该函数的必要条件,但我记得一些关于避免这种快捷方式的内容。
在某些情况下,一个比另一个更合适吗?或者我应该总是选择更简单的代码。
我永远不会选择第二个例子,因为初始化然后赋值只是毫无理由地占用空间。
我可能会做以下操作:
int length()
{
const int str_length = strlen(arbitrary_string);
return str_length;
}
这有两个原因:
- 您允许编译器执行命名返回值优化;以及
- 您的回报值现在是通过拥有一个名称来自我记录的
然而,对我来说,这更像是一个默认规则。
在这种特定的实际情况下:
- 您的返回类型只有微不足道的
int
,因此无论如何都不允许进行命名返回值优化,即使是这样,也基本上毫无意义;以及 - 该函数已经很琐碎,并且命名恰当
所以我将使用第一个例子:
int length()
{
return strlen(arbitrary_string);
}
采用多步骤方法的一个原因是,如果您决定添加一行来打印长度值,那么麻烦就小得多:
int length()
{
const int str_length = strlen(something);
printf("str_length = %dn", str_length);
return str_length;
}
或者,如果你想添加一些额外的断言:
int length()
{
const int str_length = strlen(something);
assert(str_length >= 0);
return str_length;
}
除此之外,这一切都是关于你觉得什么是最合适的[当然,除非你有严格的编码标准!]
我说永远使用示例1。它读起来更好看。如果中间变量名有助于可读性,或者如果表达式应该拆分为多个语句,那么我永远不会把表达式放在return语句中。
不过,我绝不会建议使用示例2——初始化为0是毫无意义的。中间地带更好:
int length()
{
int str_length = strlen(random_string);
return str_length;
}
但是,很明显,str_length
不会告诉您任何信息,就像函数名strlen
一样。
一般来说,代码应该易于阅读,并明确目的。在你的例子中,我更喜欢较短的版本。关于长版本的语义,没有获得任何额外的信息。
一如既往,可能会有例外。特别是当返回的值来自一个长且复杂的表达式时。然后,命名一些中间结果可能会有所帮助。
要回答这个问题,请始终选择更易于阅读的解决方案,这在每种编程语言中都很重要,但在C++中却极其重要。
对于您的特定问题,C++开发人员最容易阅读的是选项1,它既干净又简单。但如果碰巧你必须写的一行是这样的:
return (classA *)(function1(data1)->function2())->function3();
在这种情况下,所有人都会选择分开这条线,因为即使你现在了解它的作用,你也很难弄清楚未来会发生什么。
希望它能帮助
在大多数情况下,可读性总是胜过性能。如果您有性能关键的代码,那么就追求性能。然而,这是一个例外,而不是规则。
始终追求可读性。
- 返回语句后的代码,没有警告
- 三元运算符在返回语句中给出意外的结果
- 返回非 void 的函数中没有返回语句警告
- 如何使用单个返回语句返回对变量的引用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 获取上次执行的返回语句的行
- 返回语句中矢量初始化时出现编译错误
- 快速搜索链表未编译,需要返回语句
- 静态成员函数赋值而不带返回语句
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- 为什么返回语句和打印语句返回不同的答案?
- C++ 非 void 函数的崩溃没有返回语句
- 在返回语句中嵌套条件运算符
- 为什么结构化绑定禁用RVO和移动返回语句
- C - 程序返回值而无需返回语句
- 返回语句中的构造函数语法
- 编译器遇到返回语句时会做什么
- 是一个单一的返回语句清洁器
- C NRVO/复制Elision在括号中带有返回语句
- C 编译器 - 被遗忘的返回语句