在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
。
如何在printf
为x
访问5
?
第一个用作前向声明,后者用作实际定义。
在main运行之前,在函数外部声明的变量默认值将被设置。 所以你所看到的是正确的行为。 对于在其他源文件中声明的变量也是如此。
全局变量在main()
运行之前初始化。 这意味着函数完全可以访问文件中出现的内容,只要它是可见的(即向前声明)。
话虽如此,你不应该在一个文件中对同一个变量进行多次声明。 它可能导致(实际上对于程序员)关于它实际初始化的内容和位置的混淆。
编辑:澄清一下,全局范围内的函数/变量不像函数内的一系列语句那样执行。 函数声明/定义的位置与其他任何代码相关的调用完全没有关系。 它仅确定周围范围的哪些部分对其可见。 在您的情况下,这意味着不会在两个int
行之间调用main()
。 当它完成所有其他初始化时,它将被运行时调用。