1

C语言

以下代码在哪个 C 标准上编译没有错误(C89、C99、C11)

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

    DO SOMETHING...

}

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

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

    DO SOMETHING...

}
4

3 回答 3

8

从 c99 开始允许这样做。所以c99和c11都支持。

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

于 2013-07-07T09:29:22.047 回答
7

它首先在 C99 中引入。引用C99 Rational V5.10 §6.8.5.3 for 语句

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

为了简化语法,每个循环仅限于一个声明(尽管这可以声明多个变量),并且这些必须具有 auto 或 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);
于 2013-07-07T09:39:39.823 回答
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
}
于 2013-07-07T09:30:42.670 回答