在C中,多次声明变量是否有效?

我有下面的C代码,我希望它抛出一个错误,如“多个变量声明”,但它没有这样做。

#include  int i; int i; int main() { printf("%d",i); return 0; } 

现在输出为0 ,但为什么呢?

代码下面还有一件事会给出错误预期

 #include  int main() { int i; int i; printf("%d",i); return 0; } 

O / p是重新声明i的错误

i的第一个定义是暂定定义(第二个定义也是暂定定义)。 它们虽然是“事实上的”定义(定义也作为声明),但没有错误。

从标准引用:

6.9.2 / 2

具有文件范围而没有初始化程序且没有存储类说明符或存储类说明符为静态的对象的标识符声明构成暂定定义。 如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0。