为什么用static,extern声明的变量和没有它的变量包含不同的值

St.*_*rio 1 c++ linkage

请考虑以下代码段:

#include <stdio.h>

int a=5;

int main ()
{
    extern int a;
    printf("%d\n",a); //5
}

//---------//

#include <stdio.h>

int a=5;

int main ()
{
    static int a;
    printf("%d\n",a); //0
}

//---------//

#include <stdio.h>

int a=5;

int main ()
{
    int a;
    printf("%d\n",a); //12497123435
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么aextern说明符声明时显示5 ?当我们宣布astatic修改,然后alinkagea可表示从另一个范围的实体.

sep*_*p2k 6

在编写时extern int a;,您将声明一个以aextern链接命名的变量,但您没有定义它.相反,定义必须存在于其他地方 - 通常在不同的翻译单元中.在这种情况下,定义a在同一个翻译单元中,并且声明完全是冗余的,因为a它已经可见.这就是说冗余声明不是错误,所以它的行为与声明根本不存在的行为相同.如果定义在不同的翻译单元中,则需要声明,因此编译器知道变量存在.在任何一种情况下,extern声明都不会引入新变量,a只是引用全局变量.

static int aint a不过是定义并推出了一个名为新的变量a,所以全局变量的值a不再相关.

static int a和之间的区别在于int a它们具有不同的存储空间.int a具有自动存储并使用带有自动存储的未初始化变量调用未定义的行为,这就是为什么在您的情况下获得"随机"值的原因.另一方面,具有静态或外部链接的变量会自动初始化为0,因此这就是静态变量为0的原因.