自从我开始用C编码以来,我就被教导
for(int i=0;i<10;++i)
...
在C ++中工作,但是在C中,您必须像下面这样在for循环之外声明变量:
int i;
for(i=0;i<10;++i)
...
我专门记住这是一个问题,因为当我开始使用C进行编码时,我习惯于使用C ++进行循环。
但是今天我正在阅读C11标准的2010年12月草案,它定义了for循环为
“ for(子句1;表达式2;表达式3)语句”
并在语法说明中指出:
“如果第1条是声明,则它声明的所有标识符的范围是声明的其余部分, 整个循环”。
当我进行测试时,意识到我的gcc(Debian 8.3.0)在-std = c99和-std = c11模式下以C ++样式编译循环,即使使用-Wall标志也没有警告。< / p>
这是gcc扩展,还是C暂时支持这种类型的循环,我只是没有注意到?
答案 0 :(得分:9)
它已在C99中标准化
来自:https://en.cppreference.com/w/c/language/for
(C99)如果它是一个声明,则它在整个循环体的范围内, 包括init_clause的其余部分,整个cond_expression, 整个迭代表达式和整个loop_statement。只要 变量允许使用auto和register存储类 在此声明中声明。