【问题标题】: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。
  • 出于好奇,谁告诉你不要使用第二个构造?这是一个非常糟糕的建议。

标签: c for-loop variable-assignment


【解决方案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 在外部范围内。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-06-10
            • 2011-04-01
            • 1970-01-01
            • 2019-10-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多