Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';在循环外部声明循环索引变量的好处是什么?_C#_C++_Performance_For Loop - Fatal编程技术网

C# 什么';在循环外部声明循环索引变量的好处是什么?

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

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

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];