C语言中static修饰变量
<t1.c>中staticinta;setA(){a=100;}getA(){printf("%d",a);}<t2.c>中staticinta;setB(){a=200...
<t1.c>中
static int a;
setA()
{ a=100;}
getA()
{printf("%d",a);}
<t2.c>中
static int a;
setB()
{ a=200;}
getB()
{printf("%d",a);}
<main.c>中
main()
{ setA();
getA();
getB();}
程序运行的结果是a=100。即a变量同步。只在t1.c中进行赋值,但是两个不同的.c文件中获取的a值是相同的。
请问这该怎么解释啊? 展开
static int a;
setA()
{ a=100;}
getA()
{printf("%d",a);}
<t2.c>中
static int a;
setB()
{ a=200;}
getB()
{printf("%d",a);}
<main.c>中
main()
{ setA();
getA();
getB();}
程序运行的结果是a=100。即a变量同步。只在t1.c中进行赋值,但是两个不同的.c文件中获取的a值是相同的。
请问这该怎么解释啊? 展开
3个回答
展开全部
可以,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声明也不可以使用,这样可以有效避免不同文件全局变量的冲突。
希望能解决您的问题。
先说静态局部变量:通常情况下,在一个函数中定义一个变量,那么函数退出之后,这个变量就消失了,即使你第二次调用这个函数,里面的变量也会被重新赋初值。比如我们写一个函数:
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声明也不可以使用,这样可以有效避免不同文件全局变量的冲突。
希望能解决您的问题。
追问
问题里面写的是,两个不同的.c文件它们俩set函数操作的是同一个变量a吗?static修饰的变量,在t1.c中定义修饰,那么在t2.c中应该是不能操作的啊,怎么这个例子好像是在操作同一个变量a呢?请继续指教,谢谢。
展开全部
最主要有两点用途。
让一个变量长期有效,而不管其是在什么地方被申明。比如:
int fun1()
{
static int s_value = 0;
....
}
那么fun1不管在什么地方被调用,当函数退出后,s_value最后的值将一直会被系统保存(相当于一个全局变量),下次s_value再被用到时,也即当fun1()再次被调用时,s_value初始值将是最近被保存过的值(请注意s_value初始化操作只会被执行一次,即上述s_value =0 这个语句)。
2.避免多个文件使用了相同的变量名而导致冲突
比如有多个文件,分别由几个人独立开发的。假定他们在各自的文件中定义相同的“全局”变量名(仅仅指在他们独自的文件中全局),当系统集成时,由于他们使用了名字一样的“全局”变量,导致有难于遇见的问题。解决这个问题方便的做法就是在各自文件中,在相同的全局变量申明前加上static修饰符。这样系统就会为他们分配不同的内存,互不影响了。
让一个变量长期有效,而不管其是在什么地方被申明。比如:
int fun1()
{
static int s_value = 0;
....
}
那么fun1不管在什么地方被调用,当函数退出后,s_value最后的值将一直会被系统保存(相当于一个全局变量),下次s_value再被用到时,也即当fun1()再次被调用时,s_value初始值将是最近被保存过的值(请注意s_value初始化操作只会被执行一次,即上述s_value =0 这个语句)。
2.避免多个文件使用了相同的变量名而导致冲突
比如有多个文件,分别由几个人独立开发的。假定他们在各自的文件中定义相同的“全局”变量名(仅仅指在他们独自的文件中全局),当系统集成时,由于他们使用了名字一样的“全局”变量,导致有难于遇见的问题。解决这个问题方便的做法就是在各自文件中,在相同的全局变量申明前加上static修饰符。这样系统就会为他们分配不同的内存,互不影响了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你再仔细看看运行结果,应该不会这样的吧。
全局静态变量在声明它的文件之外是不可见的,它的作用域是从定义之处开始到文件结尾。在全局变量前加static修饰的目的是限制其作用域,即:只在定义该变量的源文件内有效。
你的t1.c中的全局静态变量a和t2.c中的全局静态变量a,应该是毫无关系的两个变量。
全局静态变量在声明它的文件之外是不可见的,它的作用域是从定义之处开始到文件结尾。在全局变量前加static修饰的目的是限制其作用域,即:只在定义该变量的源文件内有效。
你的t1.c中的全局静态变量a和t2.c中的全局静态变量a,应该是毫无关系的两个变量。
追问
这个问题运行结果我自己看过很久了,就是因为解释不了才拿来给大家看看。谢谢。理论的确解释不了。能解释的请帮忙给个想法也行。谢谢。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询