在C中重新声明for循环中的变量

msc*_*msc 6 c gcc declaration

gcc prog.c -Wall -Wextra -std=gnu11 -pedanticGCC编译器上使用命令编译了以下程序 .我想知道,它没有任何警告或错误,工作正常.

#include <stdio.h>

int main(void)
{
    for (int i = 0; i == 0;  i++) 
    {        
        printf("%d\n", i);
        long int i = 1; // Why doesn't redeclaration error?
        printf("%ld\n", i);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器不会生成重新声明变量i错误?

msc*_*msc 6

在C语言中,范围statement嵌套在for循环的范围内init-statement.

根据Cppreference:

而在C++中,init语句的范围和语句的范围是同一个,在C中,范围statement嵌套在范围内init-statement.

根据stmt:

for语句

for ( for-init-statement conditionopt ; expressionopt ) statement
Run Code Online (Sandbox Code Playgroud)

相当于

{
    for-init-statement
    while ( condition ) {
            statement
            expression ;
      }
} 
Run Code Online (Sandbox Code Playgroud)

除了在for-init-statement中声明的名称与条件中声明的名称在同一声明区域中,并且continue语句(未包含在另一个迭代语句中)将在重新评估条件之前执行表达式.


use*_*738 6

从标准§6.8.5.5(N1570)

迭代语句是一个块,其范围是其封闭块范围的严格子集.循环体也是一个块,其范围是迭代语句范围的严格子集.

强调补充说