我知道这在C中是允许的,但我习惯不更新由值传递的变量的值。
在我的编码风格"中,不会更改按值传递的参数。 我的意思是我更喜欢这个:
void func(int var)
{
int locVar = var;
if(something)
{
locVar = locVar/2;
}
// [some stuff using locVar]
}
对此:
void func(int var)
{
if(something)
{
var = var/2;
}
// [some stuff using var]
}
我认为如果启用了寄存器优化,编译器将不会产生不同的汇编,但是,是否有任何理由偏好这两个代码段之一?
答案 0 :(得分:1)
没有
通常在函数中需要多次初始参数值,因此更常见的样式不是覆盖参数。在catch子句中使用可用于调试,记录消息(“写入n字节”)的值非常方便。由于这或多或少是常见的风格,维护人员很容易错过你的不成熟 - 过早优化。这种优化在非优化C编译器时代很常见,现在它们只是“因为我可以”的东西。请记住,我们编写的代码可供人类阅读。编译器无论如何都可以做到这一点。
答案 1 :(得分:1)
有没有什么理由可以选择两个代码段之一?
1)编译器不是平等的。 int locVar = var;
可以创建更快的代码。 (我很惊讶在给定的应用程序中发现这是真的。)这是本地或微优化,仅在特定情况下有用,当然,当使用其他选项或在另一台机器上编译时,可能会产生不同的性能。
2)越少越好。在int locVar = var;
中引入同义词是需要理解和维护的更多代码和更多变量。 通常这不太有帮助。
3)两个代码段都生成有效代码。所以这也是一个风格问题。如果您的编码组有关于此的编码指南,那么最好遵循这一指导原则,而不是因为微不足道的原因而不同。
选择理由优先选择其中一个:是的。有充分理由:一般没有。如果对哪种方式有疑问,那么容易维持的就是胜利(IMO)。
答案 2 :(得分:0)
一般来说,引入的变量越多,代码的可读性就越低,也就越复杂。
有时甚至很难为一个实体创建两个名称,从语义上看它们看起来完全相同。
例如,功能列表可以占用多个屏幕。在这种情况下,如果您遇到类似locVar
的名称,则需要向后滚动功能列表以确定此名称的含义。
此外,一个函数可以有几个参数。你打算为每个参数引入新的别名吗?
对于您的代码的读者,您不会清楚为了支持您的编码风格而引入了新的局部变量。例如,他们可以认为您更改了函数并忘记删除不再需要的变量。:)
例如,考虑一个计算数字位数之和的递归函数。
unsigned int sum( unsigned int x )
{
const unsigned int Base = 10;
unsigned int digit = x % Base;
return digit + ( ( x /= Base ) == 0 ? 0 : sum( x ) );
^^^^^^^^^^^^^
}
或者可以写成
unsigned int sum( unsigned int x )
{
const unsigned int Base = 10;
return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
}
在此函数中引入新的局部变量作为x
的别名的目的是什么?
unsigned int sum( unsigned int x )
{
const unsigned int Base = 10;
unsigned int y = x;
unsigned int digit = y % Base;
return digit + ( ( y /= Base ) == 0 ? 0 : sum( y ) );
}
对于我来说,没有中间变量y
的第一个函数实现更清楚。当使用相同的变量x
时,函数的递归性质更加明显。
如果要指出函数中没有更改参数,可以使用具有限定符const的参数声明或定义函数。
例如
unsigned int sum( const unsigned int x )
{
const unsigned int Base = 10;
return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
}
在C ++中,函数调用看起来像
#include <iostream>
constexpr unsigned int sum( const unsigned int x )
{
const unsigned int Base = 10;
return x % Base + ( x / Base == 0 ? 0 : sum( x / Base ) );
}
int main()
{
std::cout << sum( 123456789 ) << std::endl;
int a[sum( 123456789 )];
std::cout << sizeof( a ) << std::endl;
}
程序输出
45
180