关于static的用法详解

本文通过两个示例程序,详细解析了C语言中static关键字的作用,包括static全局变量与普通全局变量的区别、static局部变量与普通局部变量的区别,以及static函数与普通函数的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来看一段程序代码:
程序1:
#include"stdio.h"
#include <string.h>


int fun(int a)
{
int b = 0;
static int c = 3;//首次赋值,第二次执行到此处,c为存储的值4,而不是再被重新赋值
b++;
c++;
return (a + b +c);
}
int main(void)
{
int a = 2;
for (int i = 0; i < 3;i++)
{
printf("%d\n",fun(a));
}
return 0;
}
这个程序我知道,结果为7 8 9


我想说的是下面这个程序,有点问题:
程序2:
#include"stdio.h"
#include <string.h>
static int c;//默认赋值为0,相当于static int c = 0;
int fun(int a)
{
int b = 0;
        c = 3;//赋值语句,每次需要执行,和c++需要执行一样
b++;
c++;
return (a + b +c);
}
int main(void)
{
int a = 2;
for (int i = 0; i < 3;i++)
{
printf("%d\n",fun(a));
}
return 0;
}
为啥把static int c定义在函数外面,每次运行时,c都被重新赋值,而不是累加?

感觉还不错的一个解答:
全局变量,加不加static 对变量的存储是没影响的。加static表示它只能在本文件中使用,在全局变量上,static的意思和extern刚好相反。所以定义后分配内存(注意,不是声明之后再赋值),和普通的全局变量没区别。static的复杂之处,在于成员变量和函数内局部变量。
成员变量时,变量归类所有,所有对象公用一个。
局部变量时,该变量的赋值操作只执行一次。
void fun(){
static int a = 100 ;//无论你调用多少次fun,这句代码只有在第一次调用时执行。
}
注意下面这个程序,如果static int c = 3;//被赋值的全局变量,结果会如何呢?
#include"stdio.h"
#include <string.h>
static int c = 3;
int fun(int a)
{
int b = 0;
b++;
c++;
return (a + b +c);
}
int main(void)
{
int a = 2;
for (int i = 0; i < 3;i++)
{
printf("%d\n",fun(a));
}
return 0;
}
运行结果为:7 8 9
和程序1结果一样
自己总结:
1.static int c作为全局变量时,赋值和不赋值是有区别的,如果没有被赋值,比如程序2,static int c;相当于全局变量,默认赋值为0;等价于static int c = 0;这个0只是首次赋值,每次当执行到c = 3时,和c++一样,都是一个语句,对c变量进行操作,值都被重新赋值为3。
2.当static int c在一个函数内部定义(注意,是定义,不是声明后再赋值)并作为一个局部变量使用时,它对本文件中的其他函数是不可见的。
如果静态局部变量如下:
int fun(int a)
{
int b = 0;
static int c;//相当于static int c = 0;首次执行赋值为0,下次执行时不再重新赋值为0;
c = 3;//但是紧接着c又被重新赋值为3,这和下面c++语句一样,是不受static关键字限制,需要对c进行操作,该是什么操作就进行什么操作
b++;
c++;
return (a + b +c);
}
是不是很有意思,这些就清楚很多了。
关于static关键字的总结如下:
1. static函数与普通函数作用域不同。static函数仅在本文件中使用。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件;
2. static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
3. static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
4. static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值