我熟悉C ++,最近决定学习C。我所遵循的教程通常会像这样编写for循环:
int i;
for (i = 0; i < 5; i++)
{
printf("%d", i);
}
您可以看到计数器(i)在for循环主体之外声明。用C(和C ++)编写时,我写:
for (int i = 0; i < 5; i++)
{
printf("%d", i);
}
我对此进行了研究,似乎后者在C89中是非法的,仅在C99中引入。但是,我正在使用的教程基于C99,并且我还看到了许多现代C代码,其中仍在for循环主体之外声明了计数器。
因此,我要问的问题是:在C99中的for循环主体之外声明计数器是否有任何实际的好处?换句话说,我应该用哪种方式写?
注意:我已经看到了“相似的问题”,但是大多数问题都在问为什么在某些代码中在for循环主体之外声明计数器,而不是有什么好处。话虽这么说,还有一个类似的问题在问它的好处,但这是在C ++中,我不确定这两种语言之间是否有区别。
for
语句之前声明循环计数器的主要好处是:
for
循环结束后访问此变量。如果在for
语句之前定义,则此变量仍然有效,并且在循环之后的范围内,如果通过break
语句退出循环,则该变量可能非常有用:
void foo(void) {
int i;
for (i = 0; i < 100; i++) {
if (bar(i))
break;
}
...
if (i != 100) {
printf("loop was exited after %d calls\n", i);
}
}
缺点是,以后您无法在同一范围内使用不同类型的另一个循环重用相同的标识符。
如果不需要在for
语句之后访问循环计数器,则在for
语句的第一子句中声明它可以提高可读性和可维护性。
相反,它需要移植回C99之前的编译器,应避免使用C99特定的功能,例如这一功能。