这些for循环之间有什么区别?

时间:2013-11-03 14:43:55

标签: c for-loop variable-assignment

这两个for循环有什么区别?有人告诉我不要在我的代码中使用第二个例子。我很困惑,因为这不是其他语言的问题。

那么与此有什么区别/问题,还是只是偏好?

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

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

5 个答案:

答案 0 :(得分:17)

区别在于i的范围。

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

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

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

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

答案 1 :(得分: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的范围。

答案 2 :(得分:0)

i变量的范围不同。

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

答案 3 :(得分:0)

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

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

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

如果您在循环范围之外声明i并且这比前一种情况更好,则不会出现错误。

<强> BUT

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

您会收到错误,因为i的范围内不知道{ }。因此,在可能的情况下,最好在最严格的范围内声明变量。

答案 4 :(得分:0)

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

我总是在第一个例子中使用这个表单,因为程序变得更加一致和错误,而我没有太多思考。