1

在 C 中,在循环外声明所有变量与在范围内声明一些变量之间有什么区别吗?一种方式比另一种更快吗?例如:

int i;
for(i = 0; i < len; i++)
{
  int j;
  for(j = i; j < len; j++)
  {
    …

对比

int i, j;
for(i = 0; i < len; i++)
{
  for(j = i; j < len; j++)
  {
    …

在概念层面上我有一个问题,因为在第一个示例中,每次迭代都重新声明相同的变量,这不是效率低下吗?

4

4 回答 4

2

仅限制该循环内的变量范围是一种很好的做法。从分配的角度来看,在循环外和循环内声明变量没有区别。

当您看到反汇编代码时,您应该得到两种情况的相同代码。您将准确找出变量存储的分配位置。它是在循环外分配的。

于 2013-10-05T08:37:02.850 回答
1

在现代 C(AKA C99 或 C11)中有更好的选择

for(int i = 0; i < len; i++)
{
  for(int j = i; j < len; j++)
  {

也就是直接在for-statement里面声明循环变量。

在像您这样的简单情况下,任何级别都没有区别,这将全部编译为相同的二进制文件。

在更复杂的情况下,可能会有一个,因为您将“重复使用”相同的变量用于不同的目的。您可以轻松地混淆事物并将以前使用的旧值消耗到您不期望的地方。

次要离题:int在大多数情况下,对于说“长度”或类似内容的循环索引来说,它不是正确的类型。索引不应该是负数,并且类型的宽度应该是你可以捕获任何对象的大小。Modern C 就是size_t为了这个目的。

要使 gcc 具有该功能,您必须添加开关-std=c99或使用可执行文件名称c99。clang 和 POSIX 机器上的许多其他编译器默认遵守 C99。

于 2013-10-05T09:16:41.930 回答
0

当你限制范围时,你可以让编译器更容易优化你的代码(例如决定哪些变量应该在寄存器中使用)。一个好的编译器不应该浪费时间在优化条件下在循环开始时“重新声明”一个变量。

于 2013-10-05T12:41:53.547 回答
0

在循环(块)内声明的变量只能由该块访问,即它是该特定块的本地变量(它从其声明点到块的末尾都是可见的,您无法在此范围之外访问)。
在代码中

int i;
for(i = 0; i < len; i++)
{
   int j;
   for(j = i; j < len; j++)
   {
       …

j是一个局部变量,具有块作用域。结束后for(i = 0; i < len; i++)您将无法j在程序中进一步访问。所有修改都j将保持在此范围内。
如果您没有将变量的范围纳入帐户,那么在循环的情况下,在任何级别声明变量都没有区别(但这里的两个代码不同)。

于 2013-10-05T08:35:43.233 回答