我在很多游戏引擎代码中看到了这一点。这应该比你在for循环体中声明它更快吗?此外,还有许多其他for循环,每个循环都使用相同的变量。
int i;
for(i=0; i<count; ++i)
{
}
VS
for(int i=0; i<count; ++i)
{
}
是的,我自己从不这样做,只是好奇它背后的想法,因为除了表演,我不知道为什么有人会这样做。
答案 0 :(得分:13)
第一种方式可能是C方式,即OLD OLD C方式,其中第二种方式无效。使用第二种方法,尽可能缩小变量的范围。
答案 1 :(得分:2)
在循环外声明循环索引变量有什么好处?
在前一种情况下,您可以在循环外访问i
最后一个值。天真的开发人员说,价值将是count
的价值。但是试试这个
int i;
for(i = 0; i < count; ++i)
{
if (i == 2)
break;
//Loop Logic
}
在这种情况下,i
将是= 2
或< 2
,但如果计数为> 2
则会怎样。
然而,在后一个i
中,一旦循环结束,{{1}}就会超出范围
答案 2 :(得分:2)
最初,在K&amp; 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];
答案 3 :(得分:1)
K&amp; R C不接受第二种风格。
第一种风格的一个优点是你可以在循环之后访问'i',如果你正在搜索特定的索引,这可能很重要。
第二种优势是更严格的范围,这总是一件好事。你不能让你'混淆了。
答案 4 :(得分:1)
至少有一个编译器(旧版本的MSVC)在循环结束后泄露了int i
中for(int i = 0; i < max; ++i) { ... }
的定义。同时,该标准表示其范围仅限于for
循环本身。如果您在多个编译器中进行编译,其中一个编译器泄露了定义,而另一个编译器没有编译,那么如果您稍后在同一代码体中重新声明该变量,则很容易遇到问题。
因此,我可以看到有人决定通过将变量声明放在循环之外来制作在符合标准和非标准兼容编译器中会产生相同错误的代码。
现在,另一个理论是程序员希望在循环结束后访问迭代变量的值。另一种可能性是团队或编码员认为将变量声明放在自己的行上是好的风格。