C# 什么';在循环外部声明循环索引变量的好处是什么?
我在很多游戏引擎代码中都看到了这一点。这应该比在for循环体中声明更快吗?接下来还有许多其他for循环,每个for循环使用相同的变量C# 什么';在循环外部声明循环索引变量的好处是什么?,c#,c++,performance,for-loop,C#,C++,Performance,For Loop,我在很多游戏引擎代码中都看到了这一点。这应该比在for循环体中声明更快吗?接下来还有许多其他for循环,每个for循环使用相同的变量 int i; for(i=0; i<count; ++i) { } inti; 对于(i=0;i第一种方式可能是C方式,旧的C方式,第二种版本无效。使用第二种方式,尽可能严格地确定变量的范围 在循环外部声明循环索引变量有什么好处 在前一种情况下,您可以访问循环外的i最后一个值。天真的开发人员说,该值将是count的值。但请举个例子 int i; for(i
int i;
for(i=0; i<count; ++i)
{
}
inti;
对于(i=0;i第一种方式可能是C方式,旧的C方式,第二种版本无效。使用第二种方式,尽可能严格地确定变量的范围
在循环外部声明循环索引变量有什么好处
在前一种情况下,您可以访问循环外的i
最后一个值。天真的开发人员说,该值将是count
的值。但请举个例子
int i;
for(i = 0; i < count; ++i)
{
if (i == 2)
break;
//Loop Logic
}
inti;
对于(i=0;i
在这种情况下,i
将是=2
或<2
,但如果计数是>2
呢
然而,在后一种情况下,只要循环结束,i
就超出了范围K&R C不接受第二种样式
第一种样式的一个优点是,您可以在循环之后访问“i”,这在搜索特定索引时可能很重要
第二种方法的优点是更严格的范围界定,这总是一件好事。你不能把你的“i”混淆起来。最初,在K&R C中,如果你有一个for
语句,例如
for (int i = 1; ...
您以后不能在相同的方法(或{}
范围)中再次说
for (int i = 1; ...
或者,您将得到一个“重复符号”错误
因此,如果想要重用相同的循环变量,那么他们会在循环之外声明它
C的“特性”早已消失,但如果希望从循环中断开并保留循环索引,则有必要在for
语句之外声明循环变量:
int i;
for (i = 1; ...
do stuff;
if (something) break;
}
x = y[i];
至少有一个编译器(MSVC的旧版本)泄漏了(int i=0;i
超出了循环的末尾。与此同时,该标准指出,它的范围仅限于for
循环本身。如果您在多个编译器中编译,其中一个编译器泄漏了定义,而另一个编译器没有,那么如果您稍后在同一代码体中重新声明变量,则很容易遇到问题
因此,我可以看到有人决定通过将变量声明放在循环之外,使代码在符合标准和不符合标准的编译器中都会出现相同的错误
现在,另一种理论是,程序员希望在循环结束后访问迭代变量的值。另一种可能性是,团队或编码人员认为将变量声明放在自己的行上是一种很好的风格。我高度怀疑程序集是否有任何不同。chris是对的。原因是一些编译人员选项不喜欢在循环体中声明它。这两个选项是相同的,只是编译器的首选项,等等。如果它的作用域在循环之外,您也可以稍后继续循环。类似于int i;for(i=0;i
。可能不是最好的设计。@chris:当然程序集可能不同,用其中一个替换另一个可能会产生一个具有不同含义的程序:@Mankarse,没错。我的意思是如果I
只在循环中使用,那么它很可能是相同的。Kernighan&Ritchie。Ritchie设计的C(和共同设计的Unix…)Kernighan编写了一系列Unix实用程序。他们一起编写了有史以来最好的计算机科学书籍之一,C编程语言。如果所有的计算书籍都像他们的一样,那该多好啊——易于阅读,最重要的是,简短。感谢我以前从未听过K&R参考资料,现在它有意义了:)在K&R C和C89中,(int i=1;…< /COD>)是语法错误。您必须指的是早期C++。@ USER(1451622442)-许多早期的C编译器具有相当松散的语法。您不能真正把K&R作为一个规范,例如,它留给您这么多的内容。
int i;
for (i = 1; ...
do stuff;
if (something) break;
}
x = y[i];