gpt4 book ai didi

c - "static"变量的这个定义是错误的、误导性的还是两者都不是?

转载 作者:太空狗 更新时间:2023-10-29 15:25:27 25 4
gpt4 key购买 nike

根据 https://www.learn-c.org/en/Static :

By default, variables are local to the scope in which they are defined. Variables can be declared as static to increase their scope up to file containing them. As a result, these variables can be accessed anywhere inside a file.

提供了两个代码示例。
首先,一个局部变量 int count 在函数 runner() 返回后从内存中移除的例子:

#include<stdio.h>
int runner() {
int count = 0;
count++;
return count;
}

int main()
{
printf("%d ", runner());
printf("%d ", runner());
return 0;
}

输出是:1 1

下一个例子使 count 静态:

#include<stdio.h>
int runner()
{
static int count = 0;
count++;
return count;
}

int main()
{
printf("%d ", runner());
printf("%d ", runner());
return 0;
}

这次的输出是:1 2

count 在此示例中增加到 2,因为它没有在 runner() 返回时从内存中删除。
...但是,这似乎与页面开头关于在文件内的任何位置访问静态变量的声明无关。这两个示例仅表明 static 允许 count 在多次调用 runner() 时保留在内存中(并且它未设置为 0每次调用)。它们不显示 count 是否可以“文件内的任何地方”访问,因为 main() 只是打印任何 runner () 返回。

为了说明我的观点,我举了一个例子来说明 static 不会使 count() 可以在文件内的任何地方访问:

#include<stdio.h>
void runner()
{
static int count = 0;
count++;
return;
}

int main()
{
runner();
printf("%d ", count);
runner();
printf("%d ", count);
return 0;
}

输出是:

prog.c: In function 'main':
prog.c:12:23: error: 'count' undeclared (first use in this function)
printf("%d ", count);
^
prog.c:12:23: note: each undeclared identifier is reported only once for each function it appears in

这是我所期望的。

我举了另一个例子,这个例子使用了 x 可以被 runner()main() 访问:

#include<stdio.h>
int x = 0;
void runner()
{
static int count = 0;
count++;
x = count;
return;
}

int main()
{
runner();
printf("%d ", x);
runner();
printf("%d ", x);
return 0;
}

输出是:1 2

这个问题顶部的引用是不正确的、具有误导性的,还是两者都不是?我误解了语义问题吗?

最佳答案

你是对的,引用是错误的。在功能 block 中声明变量 static增加它的生命周期,而不是它的范围。 (范围是您可以使用名称的代码部分。)

我真的无法想象一种正确的方式来解释“在文件内的任何地方访问”。如果您有指向此类变量的指针,则在其他函数中取消引用该指针是有效的,但所有函数都是如此,而不仅仅是同一文件中的函数。

可能是时候停止使用那个网站了。

关于c - "static"变量的这个定义是错误的、误导性的还是两者都不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53339858/

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