FOR循环“起始值”的变量声明 - C标准允许什么?

时间:2013-07-07 09:28:39

标签: c

C语言

在哪个C Standard上,以下代码编译时没有错误 (C89,C99,C11)

for (int i = 0; i < 10; ++i) {

    DO SOMETHING...

}

我知道有些C编译器不接受上面的版本,变量“i”必须在括号外声明。像这样:

int i;
for (i = 0; i < 10; ++i) {

    DO SOMETHING...

}

3 个答案:

答案 0 :(得分:7)

自c99起允许这样做。所以c99和c11支持它。

在c89中,for语句的第一个子句只能是一个表达式。在c99和c11中,它可以是表达式或声明。只允许一个声明(虽然这可以声明几个变量)。

答案 1 :(得分:7)

它首次在C99中推出。引自C99 Rational V5.10§6.8.5.3 for语句

  

C99的一个新特性:for循环通常涉及一个或多个计数器变量,这些变量在循环开始时初始化,并且在循环之后从不再使用。在C89中,有必要在封闭区块的开头声明这些变量,随后有可能意外地将它们重新用于其他目的。现在允许将这些变量声明为forstatement本身的一部分。这样的循环变量在新的范围内,因此它不会影响具有相同名称的任何其他变量,并且在循环结束时被销毁,这可能导致可能的优化。

     

为简化语法,每个循环仅限于一个声明(虽然这可以声明几个变量),并且这些循环必须具有autoor registerstorage类。

示例:

int i = 42;  15 
for (int i = 5, j = 15; i < 10; i++, j--) 
printf("Loop %d %d\n", i, j); 
printf("I = %d\n", i); // there is no j in scope

将输出:

Loop 5 15  20 
Loop 6 14 
Loop 7 13 
Loop 8 12 
Loop 9 11 
I = 42  25 

请注意,语法允许循环,如:

for (struct s *p = list, **q; p != NULL; p = *q) 
q = &(p->next);

答案 2 :(得分:4)

C99是对此的支持首先成为标准的一部分。

基本上,for语句引入了一个额外的隐式块。所有其他区块范围规则保持不变。

您可以通过在for循环周围引入额外的块范围来模拟C99前实现中的相同内容:

{
    int i;
    for (i = 0; i < 10; ++i)
    { ... }
}
{
    int i;  // i here is not the same as i up there
}