我gcc prog.c -Wall -Wextra -std=gnu11 -pedantic在GCC编译器上使用命令编译了以下程序 .我想知道,它没有任何警告或错误,工作正常.
#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错误?
在C语言中,范围statement嵌套在for循环的范围内init-statement.
根据Cppreference:
而在C++中,init语句的范围和语句的范围是同一个,在C中,范围
statement嵌套在范围内init-statement.
根据stmt:
for语句
Run Code Online (Sandbox Code Playgroud)for ( for-init-statement conditionopt ; expressionopt ) statement相当于
Run Code Online (Sandbox Code Playgroud){ for-init-statement while ( condition ) { statement expression ; } }除了在for-init-statement中声明的名称与条件中声明的名称在同一声明区域中,并且continue语句(未包含在另一个迭代语句中)将在重新评估条件之前执行表达式.