这些 for 循环有啥区别?

Posted

技术标签:

【中文标题】这些 for 循环有啥区别?【英文标题】:What's the difference between these for loops?这些 for 循环有什么区别? 【发布时间】:2013-11-14 06:29:12 【问题描述】:

这两个 for 循环有什么区别?我被告知不要在我的代码中使用第二个示例。我对此感到困惑,因为这在其他语言中不是问题。

那么这有什么区别/问题还是只是一种偏好?

//ex1
int i;
for(i = 0; i<whatever; i++)...code

//ex2
for(int i=0; i<whatever;i++)...code

【问题讨论】:

This 可能至少部分回答了您的问题:第二个不是有效的 C89。 出于好奇,谁告诉你不要使用第二个构造?这是一个非常糟糕的建议。 【参考方案1】:

区别在于i的作用域。

在第一个示例中,i 在循环之后的 AND 内具有范围。

在第二个示例中,i 在循环内具有范围。

第二个例子是 C99 和更高版本。

尽可能使用第二个示例,第一个示例在循环后需要 i 或编译器不支持 C99 时使用。

【讨论】:

【参考方案2】:

C99 支持第二个,但 C89 不支持。区别在于范围和初始化点。范围由括号'确定。要理解我的意思:

int main()

    int i=0;//-------------------------------------------------
    //                                                       |
        int i=1;//------------------------------------------  |
        //                                                |  |
            for(int i=2; i < 1; i++)//-----------------    |  |
            //Declaring in loop works only in C99    |                                       |    |  |
                 //-----------------                 |    |  |
                      int i=3;//    |                 |    |  |
                 //-----------------                 |    |  |
            //----------------------------------------    |  | 
        //                                                |  |   
    //-----------------------------------------------------  |
    //---------------------------------------------------------

虚线表示块中不同i 的范围。

【讨论】:

【参考方案3】:

i 变量的作用域不同。

在第二种情况下,变量范围是 for 循环本身。在第一种情况下,i 变量属于外部范围。

【讨论】:

【参考方案4】:

经验法则:变量应尽可能在最紧范围内声明。

为什么? 考虑一个错字,您在 for 循环后插入 ;

int i; 
for(i = 0; i<whatever; i++);
  

如果您在循环范围之外声明i,您将不会收到错误,这比前一种情况要好。

但是

for(int i = 0; i<whatever; i++);
  

您会收到错误消息,因为i 的范围内是未知的。因此,最好尽可能在最紧凑的范围内声明变量。

【讨论】:

【参考方案5】:

IIRC,第二个示例在 C89 和/或 C90 中无效,但在 C99 及更高版本中可用。除此之外的任何其他区别是 i 只能在第二个示例的循环内访问,其中第一个示例的 i 在外部范围内。

我总是使用第一个示例中的表格,因为程序变得更加一致和抗错误,无需我想太多。

【讨论】:

以上是关于这些 for 循环有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

在C#中for循环和foreach循环有啥区别?

for循环中的i++和++i有啥区别? [复制]

java的这三种for循环有啥区别?

java的这三种for循环有啥区别?

JavaScript - 在 for 循环中使用 let 和 var 关键字声明迭代变量有啥区别? [复制]

构造 v-for 循环时 :key 和 v-bind:key 有啥区别?