关于范围的变量的最佳声明

我问这个问题主要是关于C编程,但欢迎任何语言的见解。

说到C,我知道它只允许变量声明在代码块的最开始发生。 我一直认为应该在函数的最开始声明要在函数内使用的所有变量。 但是在很多情况下我会有一个仅在循环(或类似的块)中使用的变量。

一个例子是一些返回值的临时变量:

while ( whatever ) { int ret; ret = getSomeValue(); } 

或者某些州可能需要举行的地方:

 while ( whatever ) { static int count=0; count++; } 

我想知道它是否被认为是不合适的,或者,如果在控制流程块中声明变量有任何负面影响,例如if-else,for循环,while循环等。

变量是否应始终以最严格的范围声明? 静态声明怎么样?

编辑 :好的,我可能应该说我知道C99在你声明变量的地方更自由,但是从我看到的很多C代码中,它们仍然通常被声明在顶部。 另外,我使用的VS2K8仍然抱怨声明。

另外,看到我已经有2票可以关闭这个thead,我会明确表示我更关注性能和编译器方面,而不是任何风格。

根据经验,变量应始终尽可能为局部变量。 如果你可以使它成为const奖励积分。

好吧,关于块顶部的声明的事情是C89和K&R,但是从C99开始,你可以混合声明和语句。 这种风格持续存在,可能有充分的理由,但并不是必需的。

曾经有一段时间,如果你在使用它们的地方声明了很多局部变量,那么一些编译器会做得更好,因为它使寄存器分配更好。 在C99之前,您必须在块的顶部声明它们或使用供应商扩展,但您仍然可以决定仅在本地代码区域中实际使用每个变量。

通过更灵活的声明放置直接支持这一点似乎很重要,但我怀疑这些天优化器不需要那种帮助。

一些编码标准要求在函数顶部进行声明。 我不知道这是否是如此,你可以找到它们,或者它是否只是在没有这样做可能会限制向后移植性的日子里遗留下来的。

通常,标准越正式,它就越不喜欢交错语句和声明,除了循环控制变量。 就个人而言,我没有看到它的问题。

混合声明的优点 :局部性。 对编译器有好处,对读者有好处。 通过在函数顶部声明循环变量可以产生哪些可能的好处? 在可能不需要的交互方面,为了不相关的目的而在页面中重用变量似乎令人困惑和不明智。

分组声明的优点 :代码在主观方面看起来更干净,你知道在哪里找到每个声明,如果你的函数的顶部离变量的使用太远,也许这告诉你需要从明显过大的函数中提取第二个或第三个函数。

声明变量的地方不会影响代码生成。 在第一行代码执行之前,所有函数变量放在堆栈上(至少这是观察到的行为)。 正如您已经知道的那样,关于变量声明的规则已经很久了。 在顶部声明变量具有这些优点

  • 当所有变量都可以在同一个地方找到时,更容易阅读
  • 如果你需要在声明变量之前突然访问变量,你不必担心重新排列代码(当然,除非你故意想要阻止它)。

是的,我会尽可能地将变量作为本地变量。 如果变量仅在循环或控制流中使用,或者甚至是无意义的{}对(我曾用它来防止名称冲突),那么在那里声明它们。 以for循环中的着名n或i变量为例。 如果你有多个,那么每个for循环都需要一个唯一的var名称,这会很烦人。