运行此代码后:
#include <stdio.h>
int x;
int main(void)
{
printf("%d\n",x);
return 0;
}
int x=5;
我预计输出应为0
。由于程序int x;
的序列控制结构应首先执行,然后打印0
,最后应执行int x=5;
。但是它给出了输出5
。
该程序如何访问5
中x
的{{1}}?
答案 0 :(得分:7)
第一个用作前向声明,后者用作实际定义。
答案 1 :(得分:3)
在main运行之前设置在函数外部声明的变量默认值。所以你所看到的是正确的行为。对于在其他源文件中声明的变量也是如此。
答案 2 :(得分:3)
全局变量在main()
运行之前初始化。这意味着函数完全有可能访问文件中出现的内容,只要它是可见的(即向前声明)。
话虽如此,你不应该在一个文件中对同一个变量进行多次声明。它可能会导致混淆(主要是程序员)关于它实际初始化的内容和位置。
编辑:为了澄清,全局范围内的函数/变量不像函数内的一系列语句那样执行。函数声明/定义的位置与其他任何代码相关的调用完全没有关系。它仅确定周围范围的哪些部分对其可见。在您的情况下,这意味着在main()
行之间不会调用int
。它在完成所有其他初始化后由运行时调用。