C语言提供了关键字来修改变量的定义。 由关键字修饰的变量称为静态变量。 关键字修饰的变量定义格式如下:
数据类型名变量名;
因此,定义变量时,在数据类型名前添加关键字,定义的变量就是静态变量。 然后,您可以包含“静态局部变量”和“静态全局变量”。 我们先总结一下静态局部变量和静态全局变量的特点,然后写一个测试例子来证明一下。 总结如下:
(1)静态局部变量与局部变量具有相同的作用域; 它们位于定义变量的代码块内; 它们的生命周期与全局变量相同,是在整个程序运行期间。
此外,静态局部变量仅初始化一次。 第一次初始化后,第二次遇到局部变量将不会被重新定义。
(2)静态全局变量与全局变量具有相同的生命周期,即在整个程序运行期间; 范围仅限于定义静态全局变量的源文件。 例如,如果在test.c源文件中定义了静态全局变量,则该静态全局变量只能在test.c源文件中使用。
(3)静态局部变量和静态全局变量的初始值默认设置为0。
下面我们通过例子来说明静态局部变量的使用。 程序测试示例如下:
程序运行结果如下:
可以看到,第一次调用func函数时,会进入func函数体,定义静态局部变量a,然后给静态局部变量a赋值,并对变量的值进行累加。 使用静态局部变量a的值为15个数值。
然后,当第二次调用func函数时,又进入func函数。 这时候就遇到了局部变量a的定义语句。 那么,由于静态局部变量a已经被定义了,所以静态局部变量a将不再被执行。 跳过静态局部变量a的定义语句。 然后对静态局部变量a进行累加,使得变量a的值为25。
当第三次调用func函数时,与第二次调用func函数一样,由于静态局部变量a已经被定义,所以不再执行静态局部变量a的定义语句。 然后对静态局部变量a进行累加,使得变量a的值为35。
通过这个测试例子可以看出,静态局部变量的定义语句只执行一次,因此定义静态局部变量时的初始化值也只执行一次。
对于静态全局变量,它们的“范围”仅限于定义全局静态变量的源文件。 静态全局变量不能通过关键字在其他源文件中使用。 首先,我们创建一个新的test.c源文件,并在源文件中定义一个全局变量:
然后,新建一个test1.c源文件,其中通过关键字引用全局变量。 test1.c源文件的代码如下:
程序运行结果如下:
可以看到,对于test.c源文件中定义的全局变量value,可以使用test1.c源文件中的关键字来声明value关键字是其他模块中定义的变量。 然后,可以在 test1.c 源文件中使用 value 变量。
这时我们用关键字修改test.c源文件中定义的全局变量,定义为静态全局变量,如下:
然后,重新编译程序,编译结果如下:
可以看到,编译提示错误! test1.c 源文件中使用的 value 变量未定义。 由于test.c中定义的value变量是静态全局变量,因此静态全局变量的作用域仅限于定义该变量的test.c源文件。 那么,test1.c源文件中就不能使用test.c了。 源文件中定义的静态全局变量。
由于静态全局变量的作用域仅限于定义该变量的源文件,因此可以在不同的源文件中定义同名的静态全局变量。