C语言中 在一个函数中用 static修饰的变量,还能给它赋上新值吗?
发布网友
发布时间:2022-04-23 19:12
我来回答
共5个回答
热心网友
时间:2023-10-14 09:44
可以,static在C语言中是表示一个变量为静态变量的,而不是常量,也不是不可变的变量。所谓的静态变量有两种情况,一种是静态全局变量,一种是静态局部变量。
像在VB,C#,C,C++,Java,PHP,Objective-C,JavaScript中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN、ALGOL、COBOL、BASIC、LISP、SNOBOL、PL/1、Pascal、PROLOG、Ada等语言中也是有出现的,只是有着不同的作用,对于其具体作用,读者有需要的时候是可以具体查阅的。
扩展资料:
静态全局变量有以下特点:
该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);
静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。
热心网友
时间:2023-10-14 09:45
可以,static在C语言中是表示一个变量为静态变量的,而不是常量,也不是不可变的变量。所谓的静态变量有两种情况,一种是静态全局变量,一种是静态局部变量。
先说静态局部变量:通常情况下,在一个函数中定义一个变量,那么函数退出之后,这个变量就消失了,即使你第二次调用这个函数,里面的变量也会被重新赋初值。比如我们写一个函数:
int fun(int a)
{int sum;
sum=sum+a;
return sum;}
这样无论你是第几次调用fun这个函数,sum都会重新被赋初值,也就是函数的返回值一直会是a;而不会出现多次调用累加的情况。
但如果你在一个函数中,用static来声明变量,那么这个变量虽然在函数外部不可用,但退出函数时,这个变量是不会消失的,下一次再调用这个函数,里面的值仍然存在。就说上面这个函数,如果你的第一句写成static int sum;那么你第一次调用fun(3);函数返回3,第二次再调用fun(5);函数返回值是8,因为第一次调用之后的sum=3的值不会消失。
另一种是静态全局变量。因为是全局变量,不存在退出函数消不消失的问题。所以静态全局变量和普通全局变量的区别是:普通全局变量在其他源文件中可以通过extern全局变量名的声明,来使用该变量,而静态全局变量只能在变量所在的文件中使用,即使你在其他文件中使用extern声明也不可以使用,这样可以有效避免不同文件全局变量的冲突。
热心网友
时间:2023-10-14 09:45
楼主:
可是C语言中说
有时希望函数中的局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”,用关键字static进行声明。
所谓的结束后不消失保留原值是指当前函数结束后该static变量所占的内存不释放。
函数内一般定义的变量(Auto 变量)在函数运行结束的时候自动释放掉。而static变量不被释放。
不过也有不能赋新值的情况,如下:
例如:
#include<stdio.h>
void main()
{
int f(int);
int a=2,i;
for(i=0;i<3;i++)
printf("%d",f(a));
}
int f(int a)
{
auto int b=0; //auto 是自动变量,可省略。
static int c=3;
b+=1;
c+=1;
return(a+b+c);
}
运行过程:
for有三次循环,第一次进入函数中运算后——a为2,b为1,c为4——返回a+b+c为7。
第二次循环进入函数时,b被再次被定义为0,而static变量c仍然保持为4,经过运算最后返回8。
第三次也同样,最后返回9。
第一次调用开始 b 0 c 3
第一次调用结束 b 1 c 4
第二次调用开始 b 0 c 4
第二次调用结束 b 1 c 5
第三次调用开始 b 0 c 5
第三次调用结束 b 1 c 6
参考资料:C程序设计 谭浩强
热心网友
时间:2023-10-14 09:46
当然可以啊,只是静态变量又不是常量,只是它会保留上次执行后的值,你还是可以给它赋值的
static int a = 2;
a += 2;
不久是重新赋值了吗?追问请问保留上次执行后的值,我有点不明白
追答就是上次函数调用的值
int fun()
{
static int a = 2;
a += 2;
}
每调用一次a就会加2
热心网友
时间:2023-10-14 09:46
可以赋值,只不过该值在函数执行完后不释放,其值会保留,直到重新赋值。