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...
}
答案 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
}