自从我开始用C语言编码以来,我被教导说
for(int i=0;i<10;++i)
...
在C++中是可行的,但在C语言中,你必须在for循环之外声明变量,比如这样。
int i;
for(i=0;i<10;++i)
...
I 具体 记得这是个问题,因为我开始用C语言编码时,习惯了C++的for循环。
但是今天我看了2010年12月的C11标准草案,它把for循环定义为
"for ( clause-1 ; expression-2 ; expression-3 ) statement"
并在它的语法描述中指出:
"如果clause-1是一个 声明它声明的任何标识符的范围是声明的剩余部分和整个循环"。
然后我做了一个测试,发现我的gcc (Debian 8.3.0)在-std=c99和-std=c11模式下编译C++风格的循环时,即使使用-Wall标志也没有任何警告。
这是gcc的扩展,还是C语言支持这种类型的循环已经有一段时间了,只是我没有注意到?
这在C99中被标准化了
从。https:/en.cppreference.comwclanguagefor。
(C99)如果它是一个声明,那么它在整个循环体的范围内,包括init_clause的剩余部分、整个cond_expression、整个iteration_expression和整个loop_statement。对于这个声明中声明的变量,只允许使用自动和寄存器存储类。