示例1:
int length()
{
return strlen(random_string);
}
示例2:
int length()
{
int str_length = 0;
str_length = strlen(random_string);
return str_length;
}
问题:
我遇到过许多函数,其中一行代码可以满足该函数的必要条件,但我记得有一些关于避免这种捷径的事情。
在某些情况下,哪一个比另一个更合适,或者我应该总是选择更简单的代码。
答案 0 :(得分:2)
我永远不会选择你的第二个例子,因为初始化然后分配只是无缘无故地占用空间。
我可能做的事情如下:
int length()
{
const int str_length = strlen(arbitrary_string);
return str_length;
}
这有两个原因:
但是,对我来说,这更像是一个默认规则。
在这个具体的实际案例中:
int
,因此无论如何都不允许使用命名的返回值优化,即使它是无意义的,也将是毫无意义的。和所以我将使用第一个例子:
int length()
{
return strlen(arbitrary_string);
}
答案 1 :(得分:1)
我说总是以示例1为例。它读得更好。如果中间变量名称辅助可读性或者表达式应该拆分成多个语句,我只会将表达式放在return语句中。
我绝不会建议示例2,但初始化为0是没有意义的。中间地带更好:
int length()
{
int str_length = strlen(random_string);
return str_length;
}
但是,str_length
显然不会告诉您任何功能名称strlen
。
答案 2 :(得分:1)
采用多步骤方法的一个原因是,如果您决定添加一行来打印长度值,那就不那么麻烦了:
int length()
{
const int str_length = strlen(something);
printf("str_length = %d\n", str_length);
return str_length;
}
或者如果你想添加一些额外的断言:
int length()
{
const int str_length = strlen(something);
assert(str_length >= 0);
return str_length;
}
除此之外,所有关于你认为最合适的事情[当然,除非你有严格的编码标准!]
答案 3 :(得分:0)
一般来说,代码应易于阅读并明确目的。在您的示例中,我更喜欢较短的版本。使用长版本没有关于语义的额外信息。
一如既往可能有例外。特别是当返回的值来自长而复杂的表达式时。然后命名一些中间结果可能会有所帮助。
答案 4 :(得分:0)
要回答这个问题总是选择更容易阅读的解决方案,这在每种编程语言中都很重要,但在C ++中它非常重要。
对于您的特定问题,C ++开发人员最容易阅读的是选项编号1,它简洁明了。但如果碰巧你必须写的单行是:
return (classA *)(function1(data1)->function2())->function3();
在这种情况下,总是选择分割线,因为即使你明白它现在做了什么,你也很难弄清楚将来会发生什么。
希望有所帮助
答案 5 :(得分:-1)
在大多数情况下,可读性总是胜过性能。如果您有性能关键代码,那就去追求性能。但是,这是一个例外,而不是规则。
始终追求可读性。