存储数组中的临时值与多个变量

时间:2012-07-02 19:09:05

标签: c coding-style

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

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值实际上是计算字符串中的中间值,因为所有函数都将其结果返回到引用传递的输入变量之一。对我来说将它们组合在一起是有意义的,但是看到迄今为止的反应一直反对它,我没有反对使用单独的变量。

3 个答案:

答案 0 :(得分:4)

这会干扰代码的可读性。变量名称应提供有关其用法的一些信息。

虽然使用tmp作为变量名称偶尔有用且合理,但以这种方式使用tmp数组并未表明变量的使用方式:您隐藏了计算的详细信息在一个不透明的名称/结构后面。此外,我需要跟踪索引,以确定代码中发生了什么,这是令人困惑的,并且容易出现程序员错误。

选择特定变量名称不需要花费太多精力,如果变量确实没有比tmpX更好的名称,那么更喜欢常见的约定,例如xyz作为迭代器,indexidx作为索引等。

答案 1 :(得分:0)

这是非常主观的,但我肯定会反对第二个片段中的风格。我认为,除非你需要数组的功能(即连续存储+数组指针衰减),你应该使所有变量标量并明确命名,因此它不是tmp1tmp2和{{ 1}}。我发现你的第二个片段更难以打字并且更难阅读(并且有更多的错误可能性)。

答案 2 :(得分: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));
}

使用返回值存在逻辑“性能”原因:在被调用函数结束时,就在返回之前,编译器将在寄存器中的某处准备好结果。在大多数情况下,调用函数需要通过子函数使用 all 通用寄存器(以及它们的内容被破坏)。但不是返回值,在大多数体系结构中,作为一个约定返回寄存器中的返回值(AX或x86上的DX + AX)这对于调用者和被调用者来说是一个很好的廉价rendez-vous点...