在main之后声明的变量是否可能具有文件范围?

运行此代码后:

#include  int x; int main(void) { printf("%d\n",x); return 0; } int x=5; 

我预计输出应为0 。 由于程序int x;序列控制结构 int x; 应首先执行,然后打印0 ,最后int x=5; 应该执行。 但是它给出了输出5

如何在printfx访问5

第一个用作前向声明,后者用作实际定义。

在main运行之前,在函数外部声明的变量默认值将被设置。 所以你所看到的是正确的行为。 对于在其他源文件中声明的变量也是如此。

全局变量在main()运行之前初始化。 这意味着函数完全可以访问文件中出现的内容,只要它是可见的(即向前声明)。

话虽如此,你不应该在一个文件中对同一个变量进行多次声明。 它可能导致(实际上对于程序员)关于它实际初始化的内容和位置的混淆。

编辑:澄清一下,全局范围内的函数/变量不像函数内的一系列语句那样执行。 函数声明/定义的位置与其他任何代码相关的调用完全没有关系。 它仅确定周围范围的哪些部分对其可见。 在您的情况下,这意味着不会在两个int行之间调用main() 。 当它完成所有其他初始化时,它将被运行时调用。