这两个for循环有什么区别?有人告诉我不要在我的代码中使用第二个例子。我很困惑,因为这不是其他语言的问题。
那么与此有什么区别/问题,还是只是偏好?
//ex1
int i;
for(i = 0; i<whatever; i++){...code}
//ex2
for(int i=0; i<whatever;i++){...code}
答案 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
位于外部范围内。
我总是在第一个例子中使用这个表单,因为程序变得更加一致和错误,而我没有太多思考。