我主要就C编程问这个问题,但欢迎任何语言的见解。
说到C,我知道它只允许变量声明出现在代码块的最开头。我一直认为应该在函数的最开始声明要在函数内使用的所有变量。但是在很多情况下我会有一个仅在循环(或类似的块)中使用的变量。
示例将是某些返回值的临时变量:
while ( whatever ) {
int ret;
ret = getSomeValue();
}
或某些州可能需要举行的地方:
while ( whatever ) {
static int count=0;
count++;
}
我想知道它是否被认为是不合适的,或者,如果在控制流程块中声明变量有任何负面影响,例如if-else,for循环,while循环等等。
是否应始终以最严格的范围声明变量?静态声明怎么样?
修改: 好吧,我可能应该说我知道C99在声明变量的地方更自由,但是从我看到的很多C代码来看,它们通常仍然在顶部声明。另外,我使用的VS2K8仍抱怨声明。
另外,看到我已经有2票可以关闭这个thead,我会明确表示我更关注性能和编译器方面,而不是任何风格。
答案 0 :(得分:6)
根据经验,变量应始终尽可能为局部变量。奖励积分,如果你可以成功const
。
答案 1 :(得分:5)
好的,关于块顶部的声明的事情是C89和K& R,但是从C99开始,你可以混合声明和语句。风格仍然存在,可能有充分的理由,但并不是必需的。
有一段时间,如果你在使用它们的地方声明了很多局部变量,那么一些编译器会做得更好,因为它使寄存器分配更好。在C99之前,您必须在块的顶部声明它们或使用供应商扩展,但您仍然可以决定仅在本地代码区域中使用每个变量。
在某一点上,通过更灵活的声明放置直接支持这一点似乎很重要,但我怀疑这些天优化器不需要那种帮助。
某些编码标准要求在函数顶部声明。我不知道是不是这样你就可以找到它们,或者它是否只是在没有这样做可能会限制向后移植性的日子里遗留下来。
通常,标准越正式,它就越不喜欢交错语句和声明,除了循环控制变量。我个人认为没有问题。
混合声明的优点:locality。对编译器有好处,对读者有好处。通过在函数顶部声明循环变量可以获得哪些可能的好处?在可能不需要的交互方面,将页面中的变量重新用于不相关的目的似乎令人困惑和不明智。
分组声明的优点:代码在主观方面看起来更干净,你知道在哪里找到每个声明,如果你的函数的顶部离使用的距离太远变量,或许这告诉你需要从明显过大的函数中提取第二个或第三个函数。
答案 2 :(得分:2)
声明变量的位置不会影响代码生成。在第一行代码执行之前放入堆栈的所有函数变量(至少这是观察到的行为)。正如您已经知道的那样,关于变量声明的规则已经很久了。在顶部声明变量具有这些优点
是的,我会尽可能地将变量作为本地变量。如果变量仅在循环或控制流中使用,或者甚至是无意义的{}对(我曾用它来防止名称冲突),那么在那里声明它们。以for循环中的着名n或i变量为例。如果你有多个,那么每个for循环都需要一个唯一的var名称,这会很烦人。