一个简单的static类型的初始化问题
2012-12-10 11:34
351 查看
都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。
因此每次访问该地址所指向的变量,都会有上次的值。
但是会出现一个问题:
先看看下边的这个程序:
在每次调用add()函数时,都会首先执行add()中的第一句话,此时,是否每次都会对num进行初始化呢?答案当然是NO;
大神的话:只是在第一次调用add()时,对num进行一次初始化,下次再执行到这句话时,系统会发现已经定义过num这个变量了,就不会对这个变量再进行初始化了。
而下边的这个函数又会是另一种做法:
这个函数在执行过程中,到add()函数中的第一句话时,会定义一个num,并且初始化num,每次调用到add()都会进行同样的过程,定义、初始化。
因为num是一个局部变量,在add()函数结束时,定义的num这个变量会被释放,因此下次再执行到这一步时,发现没有num这个变量,所以会再定义一次,并初始化。
因此每次访问该地址所指向的变量,都会有上次的值。
但是会出现一个问题:
先看看下边的这个程序:
int add(){ static int num=1; num++; return num; } void main(){ int i; for(i=0;i<3;i++){ printf("%d: %d\n",i,add()); } }
在每次调用add()函数时,都会首先执行add()中的第一句话,此时,是否每次都会对num进行初始化呢?答案当然是NO;
大神的话:只是在第一次调用add()时,对num进行一次初始化,下次再执行到这句话时,系统会发现已经定义过num这个变量了,就不会对这个变量再进行初始化了。
而下边的这个函数又会是另一种做法:
int add(){ int num=1; num++; return num; } void main(){ int i; for(i=0;i<3;i++){ printf("%d: %d\n",i,add()); } }
这个函数在执行过程中,到add()函数中的第一句话时,会定义一个num,并且初始化num,每次调用到add()都会进行同样的过程,定义、初始化。
因为num是一个局部变量,在add()函数结束时,定义的num这个变量会被释放,因此下次再执行到这一步时,发现没有num这个变量,所以会再定义一次,并初始化。
相关文章推荐
- 一个简单的初始化问题
- 一个简单的初始化问题
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- (集合和引用类型、基本数据类型赋值不一样)一个简单的java问题 先后的赋值问题
- 创建一个public static final 类型的map 并能赋初值,并且只能在初始化的时间赋值,而不能中途修改它的值
- MYSQL一个简单的问题 error: Failed dependencies: MySQL-server conflicts with mysql-server
- 关于 Maya Python API 中的简单类型的一些问题
- 一个简单行列转化问题的简单解决方法。
- 一个简单但不明白的问题
- 关于全局、static对象/变量的初始化问题
- uestc 一个简单的迷宫问题
- Access下“是/否”数据类型在使用NHibernate中的一个问题
- 使用flume问题总结3——一个使用flume拦截器和选择器的简单实例
- 一个简单问题引起的对话
- 模式识别与机器学习基础之1-一个简单的回归问题(regression problem)
- leetcode 455. Assign Cookies 饼干满足问题 + 一个简单的归并过程
- 对象初始化时发现的一个问题
- 一个简单的方法解决Android Studio打开旧项目、其他项目各种报错问题
- static 变量初始化问题
- 一个简单的排序问题