静态变量(static-variable)听起来自相矛盾,像是一个不可变的变量,我来为大家讲解一下关于在c语言中关于变量的作用域?跟着小编一起来看一看吧!

在c语言中关于变量的作用域(C语言的块作用域的静态变量)

在c语言中关于变量的作用域

静态变量(static-variable)听起来自相矛盾,像是一个不可变的变量。

实际上,静态的意思是该变量在内存中原地不动,并不是说它的值不变。具有文件作用域的变量自动具有(也必须是)静态存储期。前面提到过,可以创建具有静态存储期、块作用域的局部变量。这些变量和自动变量一样,具有相同的作用域,但是程序离开它们所在的函数后,这些变量不会消失。也就是说,这种变量具有块作用域、无链接,但是具有静态存储期。计算机在多次函数调用之间会记录它们的值。在块中(提供块作用域和无链接)以存储类别说明符static(提供静态存储期)声明这种变量。程序清单12.3演示了一个这样的例子。

/* loc_stat.c -- using a local static variable */ #include <stdio.h> void trystat(void); int main(void) { int count; for (count = 1; count <= 3; count ) { printf("Here comes iteration %d:n", count); trystat(); } return 0; } void trystat(void) { int fade = 1; static int stay = 1; printf("fade = %d and stay = %dn", fade , stay ); }

注意,trystat()函数先打印再递增变量的值。该程序的输出如下:

Here comes iteration 1: fade = 1 and stay = 1 Here comes iteration 2: fade = 1 and stay = 2 Here comes iteration 3: fade = 1 and stay = 3

静态变量stay保存了它被递增1后的值,但是fade变量每次都是1。这表明了初始化的不同:每次调用trystat()都会初始化fade,但是stay只在编译trystat()时被初始化一次。如果未显式初始化静态变量,它们会被初始化为0。

下面两个声明很相似:

int fade = 1; static int stay = 1;

第1条声明确实是trystat()函数的一部分,每次调用该函数时都会执行这条声明。这是运行时行为。第2条声明实际上并不是trystat()函数的一部分。如果逐步调试该程序会发现,程序似乎跳过了这条声明。这是因为静态变量和外部变量在程序被载入内存时已执行完毕。把这条声明放在trystat()函数中是为了告诉编译器只有trystat()函数才能看到该变量。这条声明并未在运行时执行。

不能在函数的形参中使用static:

int wontwork(static int flu);// not allowed

“局部静态变量”是描述具有块作用域的静态变量的另一个术语。阅读一些老的C文献时会发现,这种存储类别被称为内部静态存储类别(internal static storage class)。这里的内部指的是函数内部,而非内部链接。

,