gpt4 book ai didi

c - C中关于局部变量作用域的查询

转载 作者:行者123 更新时间:2023-12-02 06:10:50 27 4
gpt4 key购买 nike

全部,

考虑以下代码:

void func(void)
{
int a;
printf ("%d", a);
}

int main(int argc, char **argv)
{
int a = 3;
func();
printf("%d", a);
}

按照我的理解,输出应该是:

<junk value><3>

谁能证实我的理解?我的基本查询是,编译器是否引用已声明但 undefined variable 的外部作用域?

问候,小黑

最佳答案

你的理解是正确的。 funca 使用堆栈垃圾初始化。

每次你说 int a; 时,它都会创建一个新变量,与来自封闭范围的类似命名变量或来自调用堆栈更高层的其他函数的变量无关。

在你的理由中,你混淆了 Scope and Extent . c 使用 lexical scoping ,因此虽然 main 的“范围”(或 liftime)通过 func 的执行而存在,但它是一个完全不同的范围,因此它指的是一个完全不同的变量。

请注意,“外部作用域”通常是您外部的大括号,最外层作用域是文件级别。

int a; // global
void func(int a) { // parameter
int a; // function local
while (0) {
int a; // scoped in the 'while'
if (true) {
int a; // scoped in the 'if'
}
}
}

这些“a”变量中的每一个 shadows另一个 'a 在它上面。

异常(可能是您混淆的根源)是声明为 extern int a; 的变量。这个变量特指来自其他地方(不同的翻译单元)的变量。一个external declaration可用于获得您未预料到的行为:

An external variable may also be declared inside a function. In this case you must use the extern keyword, otherwise the compiler will consider it a definition of a local variable, which has a different scope, lifetime and initial value. This declaration will only be visible inside the function.

“堆栈垃圾”规则的异常(exception)是 static 和堆分配的变量是零初始化的(如果我没记错的话,这是由标准强制执行的)。

还要注意“垃圾值”可能是 3。

关于c - C中关于局部变量作用域的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3037816/

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