这些 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 循环有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章