1

假设我有一段这样的代码:

int foo(int a, int b, int c)
{
    int tmp1, tmp2, tmp3;
    ...
    some_calculation0(&tmp1, a, b); // stores the result in tmp1
    some_calculation1(&tmp2, b, c);
    some_calculation2(&tmp3, tmp1, tmp2);

    return tmp3;
}

最近我会这样写:

int foo(int a, int b, int c)
{
    int tmp[3];
    ...
    some_calculation0(&tmp[0], a, b); // stores the result in tmp[0]
    some_calculation1(&tmp[1], b, c);
    some_calculation2(&tmp[2], tmp[0], tmp[1]);

    return tmp[2];
}

有什么理由不做这样的事情吗?有人会认为这是不好的做法吗?

在这种情况下,这些tmp值实际上是计算字符串中的中间值,因为所有函数都在通过引用传递的输入变量之一中返回它们的结果。对我来说,将它们组合在一起是有意义的,但鉴于迄今为止的反应一直反对它,我不反对使用单独的变量。

4

3 回答 3

4

这会干扰代码的可读性。变量名应该提供一些关于它们使用的信息。

虽然tmp用作变量名有时有用且合理,但以这种方式使用 tmp 数组并不能说明变量的使用方式:您将计算的细节隐藏在不透明的名称/结构后面。此外,我需要跟踪索引以弄清楚代码中发生了什么,这很令人困惑,并且容易出现程序员错误。

选择特定的变量名称不需要更多的努力,如果变量确实没有比 更好的名称,那么更喜欢常见的约定,tmpX例如,x作为迭代器,或用于索引等。yzindexidx

于 2012-07-02T19:12:25.937 回答
0

这是非常主观的,但我肯定会反对第二个片段中的风格。我认为除非您需要数组的特性(即连续存储+数组指针衰减),否则您应该将所有变量设为标量并合理命名,所以它不是tmp1,tmp2tmp3. 我发现您的第二个片段既难以输入,也更难阅读(并且有更多错误的可能性)。

于 2012-07-02T19:15:13.410 回答
0

还有另一种变体:将返回值用于它的用途:

int foo(int a, int b, int c)
{
    int part_a, part_b, result;
    ...
    part_a = some_calculation0( a, b);
    part_b = some_calculation1( b, c);
    result = some_calculation2( part_a, part_b);

    return result;
}

还有另一个可能的相当神秘的版本(这相信 some_calculation[01] 是函数;没有副作用):

int foo(int a, int b, int c)
{
    int result;
    ...

    result = some_calculation2( some_calculation0( a, b)
                              , some_calculation1( b, c));

    return result;
}

甚至:

int foo(int a, int b, int c)
{
    ...
    return some_calculation2( some_calculation0( a, b)
                            , some_calculation1( b, c));
}

使用返回值有一个合乎逻辑的“性能”原因:在被调用函数的末尾,就在返回之前,编译器将在寄存器的某个地方准备好结果。在大多数情况下,调用函数期望子函数使用所有通用寄存器(及其内容被破坏)。但不是返回值,在大多数架构上,作为惯例,在寄存器中返回返回值(AX,或 x86 上的 DX+AX)对于调用者和被调用者来说,这是一个不错的廉价集合点......

于 2012-07-02T20:34:15.810 回答