请考虑以下代码段:
#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)
我不明白为什么a
用extern
说明符声明时显示5 ?当我们宣布a
与static
修改,然后a
有linkage
和a
可表示从另一个范围的实体.
在编写时extern int a;
,您将声明一个以a
extern链接命名的变量,但您没有定义它.相反,定义必须存在于其他地方 - 通常在不同的翻译单元中.在这种情况下,定义a
在同一个翻译单元中,并且声明完全是冗余的,因为a
它已经可见.这就是说冗余声明不是错误,所以它的行为与声明根本不存在的行为相同.如果定义在不同的翻译单元中,则需要声明,因此编译器知道变量存在.在任何一种情况下,extern声明都不会引入新变量,a
只是引用全局变量.
static int a
而int a
不过是定义并推出了一个名为新的变量a
,所以全局变量的值a
不再相关.
static int a
和之间的区别在于int a
它们具有不同的存储空间.int a
具有自动存储并使用带有自动存储的未初始化变量调用未定义的行为,这就是为什么在您的情况下获得"随机"值的原因.另一方面,具有静态或外部链接的变量会自动初始化为0,因此这就是静态变量为0的原因.