哪些版本的 C 允许您在 for 循环中声明变量?

Wil*_*hey 1 c gcc for-loop c99 c11

自从我开始用 C 编码以来,我就被教导说

for(int i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)

在 C++ 中工作,但在 C 中,您必须在 for 循环之外声明变量,如下所示:

int i;
for(i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)

特别记得这是一个问题,因为当我开始用 C 编码时,我已经习惯了 C++ for 循环。

但是今天我正在阅读 2010 年 12 月的 C11 标准草案,它将 for 循环定义为

“for(子句1;表达式2;表达式3)语句”

在它的语法描述中,它指出:

“如果第 1 条是声明,则它声明的任何标识符的范围是声明的其余部分和整个循环”。

然后我做了一个测试并意识到我的 gcc(Debian 8.3.0)在 -std=c99 和 -std=c11 模式下以 C++ 风格编译 for 循环,即使使用 -Wall 标志也没有警告。

这是一个 gcc 扩展,还是 C 支持这种类型的循环有一段时间了,我只是没有注意到?

小智 9

它在 C99 中被标准化

来自:https : //en.cppreference.com/w/c/language/for

(C99) 如果是声明,则在整个循环体的作用域内,包括init_clause的剩余部分、整个cond_expression、整个iteration_expression和整个loop_statement。此声明中声明的变量仅允许使用 auto 和 register 存储类。