【发布时间】:2019-05-27 09:20:21
【问题描述】:
我正在学习 C 并遇到了这个程序。
#include <stdio.h>
int a, b, c = 0;
void prtFun (void);
int main ()
{
static int a = 1; /* line 1 */
prtFun();
a += 1;
prtFun();
printf ( "n %d %d " , a, b) ;
}
void prtFun (void)
{
static int a = 2; /* line 2 */
int b = 1;
a += ++b;
printf (" n %d %d " , a, b);
}
输出如下:
4 2
6 2
2 0
给出如下解释
"'a' 和 'b' 是全局变量。prtFun() 也有 'a' 和 'b' 作为局部变量。局部变量隐藏了全局变量(参见 C 中的范围规则)。当 prtFun() 是第一次调用时,本地“b”变为 2,本地“a”变为 4。第二次调用 prtFun() 时,使用本地静态“a”的相同实例并创建“b”的新实例,因为“ a' 是静态的,而 'b' 是非静态的。所以 'b' 再次变为 2 而 'a' 变为 6. main() 也有自己的名为 'a' 的局部静态变量,它隐藏了 main 中的全局 'a' . main() 中的 printf() 语句访问本地 'a' 并打印其值。同样的 printf() 语句访问全局 'b',因为 main 中没有名为 'b' 的局部变量。此外,默认值静态和全局 int 变量的值为 0。这就是 main() 中的 printf 语句将 0 打印为 b 值的原因。
我的印象是 C 中的静态变量只声明一次并且具有全局范围,而且所有全局变量都是隐式静态的。那么,在给定全局变量的隐式声明或 main 中的显式声明的全局范围的情况下,如何在不同的范围内重新声明这些静态变量是正确的?如果静态变量在内存中只有一个位置,并且它具有全局范围,那么该程序中如何存在同名的块特定静态变量?
谢谢
【问题讨论】:
-
main和prtFun中的两个static int a变量是两个不同的 变量,它们恰好是同名的 -
请注意,对于全局定义
int a, b, c = 0;,您只需将c显式初始化为零,而不是其他的。但是,C 被指定为“零初始化”所有全局(但未初始化)变量,因此无论如何它们都变为零。 -
static是一个存储类说明符,它定义了对象的生命周期,但除了极少数例外,不会影响或改变本地或全局变量的标准作用域规则。跨度> -
没有“静态范围”这样的东西。范围是关于名称的可见性。
static是存储持续时间。这两个概念是正交的。 -
static变量的生命周期是整个程序,当你“第一次调用函数”时它不会“变成”什么东西。当你称它为 agfain 时,它肯定不会成为某种东西。
标签: c