为了账号安全,请及时绑定邮箱和手机立即绑定

关于这道题

为什么设置静态局部变量和外部变量?

能讲解一下这道题吗

正在回答

3 回答

函数中变量前加上static,这个叫局部静态变量,这个变量在整个程序中只有一份,在多次函数调用中可以保留它的值。

你可以看到,在for循环中调用了5次fn函数,但每次x的值都不一样:第一次调用时x的值是1(就是定义的值),接着值被乘以2,成为2,打印了出来。在第二次调用时,前次的2被保留下来了,所以第二次输出了4。第三次输出了4*2=8......,因为实际上每次函数存取的x都是同一份,所以值才会被保留下来。

如果在fn函数定义x时没有加上static,那么每一次调用fn时x的值都是1,最后打印出来的都是2。实际上每次调用时使用的x都是自己的那一个,所以值不能共享。



而main函数中的那个并不是变量定义,那只是一句声明:声明了一个外部变量x。也就是告诉编译器“有一个变量叫x,但并没有定义在这里”,这样你就可以在代码中使用这个x(C要求所有符号在使用前必须声明)。随后编译器在这个代码中找到了x的定义(最后一行),所以前面那个x就当成是这个值为100的x了。

6 回复 有任何疑惑可以回复我~
#1

看不清0 提问者

非常感谢!
2015-08-23 回复 有任何疑惑可以回复我~
#2

看不清0 提问者

“在第二次调用时,前次的2被保留下来了”为什么?
2015-08-23 回复 有任何疑惑可以回复我~
#3

onemoo 回复 看不清0 提问者

因为多个函数调用中使用的x是同一个,或者说所有的函数调用都共享这一个x值。
2015-08-24 回复 有任何疑惑可以回复我~

顺便提醒一下,你那个 extern int x;定义放错位置了,应该放在int i;的前面定义,不然运行会出错的;

1 回复 有任何疑惑可以回复我~
#1

onemoo

这样写并没有错
2015-08-23 回复 有任何疑惑可以回复我~
#2

xiedukai 回复 onemoo

我用软件试了,只有把定义放前面,才可以正常运行,能帮我解释一下吗?
2015-08-23 回复 有任何疑惑可以回复我~
#3

onemoo 回复 xiedukai

不知道你用的是什么软件。 但是C标准允许extern变量声明出现在块作用域中,但不能作为变量定义,同时这个变量拥有previous linkage属性。所以题中的写法是合法的。
2015-08-24 回复 有任何疑惑可以回复我~
#4

xiedukai 回复 onemoo

但不管怎么样,还是感谢你了!
2015-08-25 回复 有任何疑惑可以回复我~
#5

大头不败

#include <stdio.h> void fn() { static int x = 1; //定义静态局部变量 x*=2; printf("x=%d\n",x); } int main() { int i; for(i=0;i<5;i++) { fn(); } {//这里少了大括号就运行不了; extern int x; //调用外部变量 printf("x=%d\n",x); return 0; } } int x=100;
2015-12-01 回复 有任何疑惑可以回复我~
查看2条回复

静态变量就是他只能获取本函数里面的值,比如static int x = 1; 动态变量能寻找到其他函数乃至函数外,如extern int x; 但最后面有int x=100;所以这个x的值可以是100.

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
C语言入门
  • 参与学习       926040    人
  • 解答问题       20793    个

C语言入门视频教程,带你进入编程世界的必修课-C语言

进入课程

关于这道题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信