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

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

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

VS

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

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

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

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

在前一种情况下,您可以访问循环外的最后一个值。 朴素的开发人员说价值将是count的价值。 但是要抽样

 int i; for(i = 0; i < count; ++i) { if (i == 2) break; //Loop Logic } 

在这种情况下, i= 2< 2但如果计数> 2则该怎么办。

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

最初,在K&R C中,如果你有一个声明如

 for (int i = 1; ... 

你不能再用同样的方法(或{}范围)再说一遍

 for (int i = 1; ... 

或者你会得到一个“重复符号”错误。

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

C的“特性”早已消失,但是,如果想要break循环并保留循环索引,则必须在for语句之外声明循环变量:

 int i; for (i = 1; ... do stuff; if (something) break; } x = y[i]; 

K&R C不接受第二种风格。

第一种风格的一个优点是你可以在循环之后访问’i’,如果你正在搜索特定的索引,这可能很重要。

第二个的优点是更严格的范围,这总是一件好事。 你不能让你的’混淆了。

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

因此,通过将变量声明置于循环之外,我可以看到有人决定在符合标准和非标准兼容的编译器中制作会产生相同错误的代码。

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