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

时间:2014-01-17 13:24:09

标签: c scope control-structure

运行此代码后:

#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

该程序如何访问5x的{​​{1}}?

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

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