假设我有一段这样的代码:
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 :(得分:4)
这会干扰代码的可读性。变量名称应提供有关其用法的一些信息。
虽然使用tmp
作为变量名称偶尔有用且合理,但以这种方式使用tmp数组并未表明变量的使用方式:您隐藏了计算的详细信息在一个不透明的名称/结构后面。此外,我需要跟踪索引,以确定代码中发生了什么,这是令人困惑的,并且容易出现程序员错误。
选择特定变量名称不需要花费太多精力,如果变量确实没有比tmpX
更好的名称,那么更喜欢常见的约定,例如x
,y
, z
作为迭代器,index
或idx
作为索引等。
答案 1 :(得分:0)
这是非常主观的,但我肯定会反对第二个片段中的风格。我认为,除非你需要数组的功能(即连续存储+数组指针衰减),你应该使所有变量标量并明确命名,因此它不是tmp1
,tmp2
和{{ 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点...