3

我在很多游戏引擎代码中都看到了这一点。这应该比在 for 循环体中声明它更快吗?紧随其后的是许多其他 for 循环,每个循环都使用相同的变量。

int i;
for(i=0; i<count; ++i)
{
}

对比

for(int i=0; i<count; ++i)
{
}

顺便说一句,我自己从不这样做,只是对它背后的想法感到好奇,因为除了性能之外,我不知道为什么有人会这样做。

4

5 回答 5

15

第一种方式可能是 C 方式,OLD OLD C 方式,其中第二个版本无效。使用第二种方法,尽可能缩小变量的范围。

于 2012-10-31T01:26:26.427 回答
3

最初,在 K&R C 中,如果您有for这样的声明

for (int i = 1; ...

你以后不能用同样的方法(或{}范围)再次说

for (int i = 1; ...

否则您会收到“重复符号”错误。

因此,如果想重用相同的循环变量,那么他们会在循环之外声明它。

C 的那个“特性”早已不复存在,但是,如果想break跳出循环并保留循环索引,则有必要在语句之外声明循环变量for

int i;
for (i = 1; ...
  do stuff;
  if (something) break;
}

x = y[i];
于 2012-10-31T01:31:07.977 回答
2

在循环外声明循环索引变量有什么好处?

在前一种情况下,您可以i在循环外访问最后一个值。天真的开发人员说,价值将是count. 但是采样这个

int i;
for(i = 0; i < count; ++i)
{
   if (i == 2)
       break;

   //Loop Logic
}

在这种情况下i,将是= 2,或者< 2如果 count 是> 2

但是,在后一种i中,一旦循环结束,就会超出范围

于 2012-10-31T01:26:45.613 回答
2

K&R C 不接受第二种样式。

第一种样式的一个优点是您可以在循环之后访问“i”,如果您正在搜索特定索引,这可能很重要。

第二个的优点是范围更窄,这总是一件好事。你不能把你的“我”弄混了。

于 2012-10-31T01:28:37.493 回答
1

至少有一个编译器(旧版本的 MSVC)在循环结束后泄露了int iin的定义。for(int i = 0; i < max; ++i) { ... }与此同时,该标准表示其范围仅限于for循环本身。如果您在多个编译器中进行编译,其中一个泄漏了定义,而另一个没有泄漏,如果您稍后在同一代码体中重新声明变量,您很容易遇到问题。

因此,我可以看到有人决定通过将变量声明放在循环之外来编写在符合标准和不符合标准的编译器中都会出现相同错误的代码。

现在,另一种理论是程序员希望在循环结束后访问迭代变量的值。另一种可能性是团队或编码人员认为将变量声明放在自己的行中是一种很好的风格。

于 2012-10-31T01:31:57.363 回答