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...
}
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...
}
从 c99 开始允许这样做。所以c99和c11都支持。
在 c89 中,语句的第一个子句for
只能是表达式。在 c99 和 c11 中,它可以是表达式或声明。只允许一个声明(尽管这可以声明多个变量)。
它首先在 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);
C99 是对这一点的支持首次成为标准的一部分。
基本上,该for
语句引入了一个额外的隐式块。所有其他块范围规则保持不变。
for
您可以通过自己在循环周围引入额外的块范围来在 C99 之前的实现中模拟相同的事情:
{
int i;
for (i = 0; i < 10; ++i)
{ ... }
}
{
int i; // i here is not the same as i up there
}