0

示例 1:

int length()  
{  
        return strlen(random_string);  
}

示例 2:

int length()  
{  
        int str_length = 0;  
        str_length = strlen(random_string);  
        return str_length;  
}  

问题:
我遇到过许多函数,其中一行代码就可以满足该函数的要求,但我记得一些关于避免这种快捷方式的事情。

在某些情况下,一个比另一个更合适,还是我应该总是选择更简单的代码。

4

6 回答 6

2

我永远不会去你的第二个例子,因为初始化然后分配只是无缘无故地占用空间。

可能会做以下事情:

int length()  
{  
    const int str_length = strlen(arbitrary_string);  
    return str_length;  
}

这有两个原因:

  1. 您允许您的编译器执行命名返回值优化;和
  2. 您的返回值现在可以通过名称进行自我记录。

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

在这个具体的实际案例中:

  1. 您的返回类型只是微不足道的 little int,因此无论如何都不允许命名返回值优化,即使是这样也基本上没有意义;和
  2. 该函数已经很简单并且命名适当。

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

int length()  
{  
    return strlen(arbitrary_string);
}
于 2013-02-05T18:52:28.857 回答
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;
}

除此之外,这完全取决于您认为最合适的内容[当然,除非您有严格的编码标准要遵循!]

于 2013-02-05T18:57:06.827 回答
1

我说总是使用示例 1。它读起来更好。如果中间变量名称有助于可读性或者表达式应该被拆分为多个语句,我永远不会将表达式放在 return 语句中。

不过,我绝不会建议示例 2 - 初始化为 0 是没有意义的。中间地带更好:

int length()  
{  
    int str_length = strlen(random_string);  
    return str_length;  
}

但是,很明显,它str_length并没有比函数名更能告诉你strlen

于 2013-02-05T18:52:32.883 回答
0

一般来说,代码应该易于阅读并明确目的。在您的示例中,我更喜欢较短的版本。长版本的语义没有额外的信息增益。

与往常一样,可能会有例外。特别是当返回值来自一个冗长而复杂的表达式时。然后命名一些中间结果可能会有所帮助。

于 2013-02-05T18:53:26.357 回答
0

要回答这个问题,请始终选择更易于阅读的解决方案,这在每种编程语言中都很重要,但在 C++ 中极为重要。

对于您的特定问题,C++ 开发人员最容易阅读的是选项 1,它简洁明了。但是如果碰巧你必须写的单行是这样的:

return (classA *)(function1(data1)->function2())->function3();

在这种情况下,总是选择拆分线路,因为即使您了解它现在的作用,您也很难弄清楚将来会发生什么。

希望能帮助到你

于 2013-02-05T18:58:28.533 回答
-1

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

始终追求可读性。

于 2013-02-05T18:52:40.870 回答