【问题标题】:What's the benefit of declaring for the loop index variable outside the loop?在循环外声明循环索引变量有什么好处?
【发布时间】:2012-10-20 10:36:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我非常怀疑这个程序集有什么不同。
  • 克里斯是对的。这样做的原因是因为某些编译选项不喜欢在循环体中声明它。两者是一样的,只是编译器偏好等等。
  • 如果它在循环之外,您也可以稍后继续循环。像int i; for(i = 0; i &lt; count; i++) { /* do stuff */ if(arr[i].group == 2) break; } /*do stuff */ for(; i &lt; count; i++) { /* do stuff with group 2 */ } 这样的东西。不过可能不是最好的设计。
  • @chris:当然,程序集可能不同,将其中一个替换为另一个可能会导致程序具有不同的含义:liveworkspace.org/code/a67b2d82aafe2bd413bef5a744478510
  • @Mankarse,真的。我的意思是,如果 i 仅在循环中使用,则很可能是相同的。

标签: c# c++ performance for-loop


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    最初,在 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];
    

    【讨论】:

    • 在 K&R C 和 C89 中,for (int i = 1; ... 是一个语法错误。您一定指的是早期的 C++。
    • @user4815162342 - 许多早期的 C 编译器的语法都很松散。例如,您不能真正将 K&R 视为规范,因为它有很多内容需要您填写。
    【解决方案3】:

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

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

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

    在这种情况下,i 将是 = 2&lt; 2,但如果 count 是 &gt; 2

    但是在后一个中,i 会在循环结束后立即超出范围

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • Kernighan & Ritchie。 Ritchie 设计了 ​​C(并共同设计了 Unix..!) Kernighan 编写了一堆 Unix 实用程序。他们一起编写了有史以来最好的计算机科学书籍之一,《C 编程语言》。如果所有的计算机书籍都像他们的那样——容易拿起和阅读,而且,最重要的是,简短。
      • 谢谢我以前从未听说过 K&R 参考,现在它很有意义:)
      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2018-04-07
        • 1970-01-01
        • 2014-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2012-02-01
        • 2020-07-23
        相关资源
        最近更新 更多