| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 772 人关注过本帖
标题:关于static的理解?
只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:8 
关于static的理解?
程序代码:
#include <stdio.h>
static int j;
void fun1(void)
{
    static int i =0;
    i++;
}
void fun2(void)
{
    j=0;
    j++;
}
int main()
{
    int k;
    for(k=0;k<10;k++)
    {
        fun1();
        fun2();
    }
    return 0;
}
i 和 j的值分别是什么,为什么?
搜索更多相关主题的帖子: static 
2010-08-20 10:21
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:10 
C语言深度剖析里的问题吧:
其实很简单,做个测试就是了,i=10,j=1
i是静态局部变量,那么只是在第一次进入函数体的时候会初始化,
静态互不变量的值不会随着函数的结束而消亡,而是继续保存原有值的内存中的,
第二次进入的时候,在原有值的基础之上做加1操作。
j是静态全局变量,定义的时候默认初始值是0,但每次进入函数体之后都会被赋0值,
然后做加1操作。
2010-08-20 10:27
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:2 
静态变量就是全局的,只是能直接访问它的只有声明它的地方
所以没有静态全局变量这种说法,全局的地方加static,表示的只是这个变量只在本文件内可以直接访问
其它文件即使加extern也不能访问,御坂御坂解释

[ 本帖最后由 御坂美琴 于 2010-8-20 10:38 编辑 ]

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-08-20 10:35
peace1221
Rank: 2
等 级:论坛游民
帖 子:32
专家分:35
注 册:2010-7-9
收藏
得分:10 
i=10,j=1;
就静态变量而言,如果定义是没有赋初值,系统自动赋为0,并且赋初值只在函数第一次调用时起作用,以后调用都按前一次调用保留的值使用。这是因为静态局部变量的生命周期始于函数的第一次调用,贯穿于整个程序。当函数第一次调用时,静态局部变量的内存单元得以分配,赋以初值,而函数被再次调用时,此静态局部变量的单元已经存在,计算机不会再次为它分配单元,也不再为其赋初值。但静态局部变量受变量作用范围所限制,不能作用于其他函数,包括main函数。
所以如果将static int i=0;后再加一句i=0;,那么i的值为1。
2010-08-20 10:47
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:4 
看一下执行程序内存布局 一下就明白了
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS test.c
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3
     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4
     5: 0000000000000000     4 OBJECT  LOCAL  DEFAULT    4 i.2127 //这里i说明是一个自从程序运行之处就一直存在,并不是动态分配的
     6: 0000000000000004     4 OBJECT  LOCAL  DEFAULT    4 j      //j同上面一样,从程序开始运行时就一直存在,直到程序终止
     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    5
     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    8
     9: 0000000000000000     0 SECTION LOCAL  DEFAULT    7
    10: 0000000000000000    21 FUNC    GLOBAL DEFAULT    1 fun1
    11: 0000000000000015    31 FUNC    GLOBAL DEFAULT    1 fun2
    12: 0000000000000034    44 FUNC    GLOBAL DEFAULT    1 main
2010-08-20 11:04
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 3楼 御坂美琴
哈哈, 。。

[ 本帖最后由 BlueGuy 于 2010-8-20 12:38 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-08-20 11:41
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
道不清...
变量的类型有很多种, 组合一下又会有很多种可能。
想区分清楚挺麻烦的,看看 变量的作用域、链接性、存储时期吧。
反正就是一个变量,一块内存, 看你怎么用了。

[ 本帖最后由 BlueGuy 于 2010-8-20 12:43 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-08-20 11:49
ggyy4k
Rank: 5Rank: 5
等 级:职业侠客
帖 子:111
专家分:334
注 册:2010-6-28
收藏
得分:4 
以下是引用御坂美琴在2010-8-20 10:35:30的发言:

静态变量就是全局的,只是能直接访问它的只有声明它的地方
所以没有静态全局变量这种说法,全局的地方加static,表示的只是这个变量只在本文件内可以直接访问
其它文件即使加extern也不能访问,御坂御坂解释

御坂妹说的有问题吧,应该是
全局变量是静态存储方式,但并不是静态变量。全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
2010-08-20 11:49
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
谢谢大家!
2010-08-22 14:30
快速回复:关于static的理解?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028991 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved