2012-07-02 86 views
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值实际上是一串计算中的中间值,因为所有函数都将其结果返回到通过引用传递的其中一个输入变量中。对我来说,将它们组合在一起是有道理的,但是鉴于迄今为止的回应反对它,我没有任何反对使用单独的变量。

+0

你为什么要这样做? – ouah

回答

4

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

虽然使用tmp作为变量名有时是有用和合理的,但是以这种方式使用tmp数组并没有提供如何使用变量的说明:您将计算的详细信息隐藏在不透明的名称/结构体。此外,我需要跟踪指数来弄清代码中发生了什么,这很容易让人感到困惑,并且容易出现程序员错误。

它不带任何更多的精力去挑选特定的变量名,如果变量真的没有更好的名字比tmpX,则宁愿共同约定,例如,xyz迭代器,indexidx为指数等..

0

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

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,或DX + AX在x86上)这对于调用者和被调用者来说是一个很好的便宜的rendez-vous点...

+0

我在OP中提到some_calculation函数全部返回它们的输入结果。显然,如果我可以改变他们的签名,我可以做你的建议,但我不能。 – cdk

+0

在这种情况下,你已经接地了。标识符无关紧要,无论如何,一旦函数返回,对象将超出范围。顺便说一句:*为什么*是函数int,当它们不返回任何明智的东西时?多尘的甲板? BTW2:对不起:哎呀,我一定读得太快了...... BTW3:好吧,至少我提出了一些很好的临时名称! – wildplasser