单步返回语句或多级返回语句

Single-Step Return Statement or Multi-Step Return Statement

本文关键字:返回 语句 多级 单步      更新时间:2023-10-16

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

这有两个原因:

  1. 您允许编译器执行命名返回值优化;以及
  2. 您的回报值现在是通过拥有一个名称来自我记录的

然而,对我来说,这更像是一个默认规则。

在这种特定的实际情况下:

  1. 您的返回类型只有微不足道的int,因此无论如何都不允许进行命名返回值优化,即使是这样,也基本上毫无意义;以及
  2. 该函数已经很琐碎,并且命名恰当

所以我将使用第一个例子:

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();

在这种情况下,所有人都会选择分开这条线,因为即使你现在了解它的作用,你也很难弄清楚未来会发生什么。

希望它能帮助

在大多数情况下,可读性总是胜过性能。如果您有性能关键的代码,那么就追求性能。然而,这是一个例外,而不是规则。

始终追求可读性。