gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:50:50 25 4
gpt4 key购买 nike

考虑以下代码片段:

#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
}

我不明白为什么在使用 extern 说明符声明 a 时显示 5?当我们使用 static 修饰符声明 a 时,a 具有 linkage 并且 a 可以是表示来自另一个范围的实体。

最佳答案

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

static int aint a 是定义并引入了一个名为 a 的新变量,因此全局变量的值 a 不再相关。

static int aint a的区别在于它们的存储方式不同。 int a 具有自动存储功能,并且使用具有自动存储功能的未初始化变量会调用未定义的行为,这就是为什么在您的情况下会得到一个“随机”值。另一方面,具有静态或外部链接的变量会自动初始化为 0,因此这就是静态变量为 0 的原因。

关于c++ - 为什么用 static,extern 和没有它声明的变量包含不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23637893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com