在 C99 的 for 循环体之外声明计数器有什么好处吗?

Tog*_*ith 1 c for-loop c99 c89

我熟悉 C++,最近决定学习 C。我所关注的教程经常写这样的 for 循环:

int i;

for (i = 0; i < 5; i++)
{
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

您可以看到计数器 (i) 是在 for 循环体之外声明的。在用 C(和 C++)编写时,我写:

for (int i = 0; i < 5; i++)
{
    printf("%d", i);
}
Run Code Online (Sandbox Code Playgroud)

我对此进行了一些研究,似乎后者在 C89 中是非法的,并且仅在 C99 中引入。但是,我使用的教程是基于 C99 的,而且我还看到了很多现代 C 代码,其中计数器仍然在 for 循环体之外声明。

因此,我要问的问题是:在 C99 中在 for 循环体之外声明计数器有什么实际好处吗?换句话说,我应该怎么写?

注意:我已经看到有“类似的问题”,但他们中的大多数人都在问为什么在某些代码中在 for 循环体之外声明计数器,而不是是否有任何好处。话虽如此,有一个类似的问题正在询问好处,但它是在 C++ 中,我不确定这两种语言在这方面是否存在差异。

chq*_*lie 6

for语句之前声明循环计数器的主要好处是:

  • 可移植到 C99 之前的编译器,
  • 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

缺点是您不能在以后在同一范围内使用不同类型为另一个循环重用相同的标识符。

如果不需要在for语句后访问循环计数器,在语句的第一个子句中声明它for可以提高可读性和可维护性。

相反,如果您需要可移植到 C99 之前的编译器,您应该避免 C99 特定的功能,例如这个。