Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1248654
  • 博文数量: 160
  • 博客积分: 4132
  • 博客等级: 中校
  • 技术积分: 2086
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 21:56
文章分类

全部博文(160)

文章存档

2012年(25)

2011年(120)

2010年(15)

分类: C/C++

2011-06-02 21:05:03


这两天在学校改论文格式,格式要求变来变去 比较郁闷……

在图书馆好好看书时候少,能找出一大块时间来 写写博客 提升一下我这半吊子c语言的技术更少,是不是以后上了班就更少了呢……7月份之前 争取完成这个连载吧

书接上回,第三章后一半讲了代码的作用域、链接属性、和存储类型


 

一:作用域

编译器一共有4种作用域——1文件作用域,2函数作用域,3代码块作用域,4原型作用域

代码块作用域:就是内层函数中的标识符(花括号之间) 如果和外层标识符同名的话,内层的标识符就会屏蔽掉外层标识符,外层的标识符在内层将会不起作用。

比如:

  1. int f;//(1)
  2. int g(int h);//(2)

  3. {
  4.          int f,g//(3)
  5. }

内层的f和外层的f就相当于是不同的变量

文件作用域:就是全局变量,还包括#include

原型作用域:指的是原函数声明中的参数名。书上原话是:原型作用域防止这些参数名与程序其他部分的名字冲突。我查了半天,感觉意思就是,声明的函数比如上边(2)处的h,不能和其他函数的参数生命重名。

函数作用域:书上说就是goto的作用域,不过不推荐用 我就本着不用goto的原则 不研究下去了

 

 

 

二:链接属性

链接属性分为——1 external2 internal3 none

在缺省模式下,全局变量 函数名的链接属性都是external,其他均为none

这里的关键标志符是:enternstatic

  1. static int a;
  2. static int b(int c);
  3. {
  4. int d;//这里加static不改变作用域,只改存储类型
  5. }

能将变量a 或者函数b标记为源文件所有,和不被其他源文件调用

 

但是如果在上边int d那里加static 情况就不一样了,只会改变d的存储类型为静态,不改变作用域。对于动态函数的static 在后边存储类型那总结一下。

 




三:存储类型

2种存储类型——1 静态存储,2 动态存储

在代码块之外声明的,一般都是静态存储(static),在代码块内部声明的,一般都是动态存储的(auto)。

对于代码块外声明的,无法制定其他存储类型。对于代码块内部声明的便利那个,如果加上static,会把它的存储类型改编成静态,变量在整个函数执行过程都存在。

 

 




四:总结一下static的用法

Static用于代码块之外的变量声明时:用于修改标识符的链接属性(从external改为internal),存储类型和作用域不受影响。这种声明只能够在源文件中访问

Static用于代码块内的变量声明时:static用于修改变量的存储类型(由自动到静态变量)

 

 




五:有个习题示例

  1. int a=5;//external, 静态 
  2. extern int b; //ex,静态
  3. static int c; //interal,静态 

  4. int d( int e )//d:ex 静态 //e:none,动态
  5. {

  6.          int f=15; //none,动态
  7.          register int b; //none,动态
  8.          static int g=20; //none,静态
  9.          extern int a; //ex,动态
  10.          ...
  11.          {
  12.                    int e;//局部变量,none,动态
  13.                    int a;// 局部变量,none,动态
  14.                    extern int h; //ex,***全局变量 静态
  15.                    ...
  16.          }
  17.          ...

  18.          {
  19.                    int x; //局部变量,none,动态
  20.                    int e; //局部变量,none,动态,与上边e是并列的 使用相同的内存地址
  21.          ...
  22.          }
  23. ...
  24. }

  25.  

  26. static int i() //in,在函数外静态
  27. {
  28.         ...
  29. }
  30. ...

a,b,c的作用域分别是:
a 第1行到12行,第17到29行
b 第2行到6行,第25到29行
c 第3行到29行

























阅读(1739) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~