汗颜呀,static还能这样用。

2020-01-27 11:50发布

  1. void Init_system(void) REENTRANT
  2. {
  3.          unsigned char i;
  4.         P1=255;
  5.        if(i==0)
  6.             {
  7.                  static unsigned char b=25;
  8.                  b++;      //前后多次调用Init_system()函数,此处b的值会作累积。
  9.                  P1=b;
  10.             }
  11.        else
  12.            {
  13.                  P1=0;
  14.            }
  15.       TMOD &= 0xF0;
  16.       TMOD |= 0x01;
  17.       TH0 = TIMER_20MS_TH0;
  18.       TL0 = TIMER_20MS_TL0;
  19.       ET0 = 0;
  20.       EA=0;
  21.      TR0 = 0;
  22. }
复制代码且看上面的代码。
我一直以为static只是用来限制文件中函数和变量的作用域、函数体内变量的作用域,同时对变量还起到不消亡的作用。
我还真的想不到还能用在复合语句内对变量定义使之“不消亡”
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
41条回答
wctmdgcd
1楼-- · 2020-01-29 01:59
在if的复合语句内定义的变量跑到花括号外就不能调用了。
sco518
2楼-- · 2020-01-29 04:48
XIVN1987 发表于 2013-5-9 11:26
"即使这样写了,也和放在函数的最开始处定义的作用没什么区别,"

是吗???作用域也一样吗???在定义 ...

按我的理解,作用域的最小单位是按函数来划分的,把它限制在更小的范围里也没有意义,你还是要有那些空间被它占用掉。
XIVN1987
3楼-- · 2020-01-29 05:59
本帖最后由 XIVN1987 于 2013-5-9 11:59 编辑
sco518 发表于 2013-5-9 11:35

QQ截图20130509115941.png (7.3 KB, 下载次数: 0)

下载附件

2013-5-9 11:59 上传

twitter
4楼-- · 2020-01-29 11:01
sco518 发表于 2013-5-9 11:35
按我的理解,作用域的最小单位是按函数来划分的,把它限制在更小的范围里也没有意义,你还是要有那些空间 ...

对现在的C编译器来说,应该是按语句块来划分的,比如gcc下for循环就能这么写:

for (int i=0; i<10; i++) { ... }

此时 i 的作用域就仅限于这个for循环中。

但是对于静态变量来说,由于在链接时一般会和全局变量一样,都有分配独立的地址空间,所以它的作用域限制只是编译器编译时判断的,如果运行中试图以指针方式去操作那个地址的话,还是能在作用域外部修改静态变量的。
sco518
5楼-- · 2020-01-29 13:39
 精彩回答 2  元偷偷看……
benqme
6楼-- · 2020-01-29 19:12
不错了学习了

一周热门 更多>