加载中…
个人资料
我的温柔喂过谁_q
我的温柔喂过谁_q
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,784
  • 关注人气:37
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C程序中全局变量的作用范围

(2012-05-02 09:27:36)
标签:

杂谈

分类: C

程序的编译单位是源程序文件,一个源文件可以包含一个或若干个函数。在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。如:

  http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F1.jpg

  p、q、c1、c2都是全局变量,但它们的作用范围不同,在main函数和f2函数中可以使用全局变量p、q、c1、c2,但在函数f1中只能使用全局变量p、q,而不能使用c1和c2。

  在一个函数中既可以使用本函数中的局部变量,又可以使用有效的全局变量。

  说明:

  (1)设全局变量的作用是增加了函数间数据联系的渠道。由于同一文件中的所有函数都能引用全局变量的值,因此如果在一个函数中改变了全局变量的值,就能影响到其他函数,相当于各个函数间有直接的传递通道。由于函数的调用只能带回一个返回值,因此有时可以利用全局变量增加与函数联系的渠道,从函数得到一个以上的返回值。

  为了便于区别全局变量和局部变量,在C程序设计人员中有一个不成文的约定(但非规定),将全局变量名的第一个字母用大写表示。

  例1 有一个一维数组,内放10个学生成绩,写一个函数,求出平均分,最高分和最低分。

  显然希望从函数得到3个结果值,除了可得到一个函数的返回值以外,还可以利用全局变量。

  1. float Max=0,Min=0;    
  2.   
  3.   
  4. float average(float array[],int n){  
  5.    int i;  
  6.    float aver,sum=array[0];  
  7.    Max=Min=array[0];  
  8.    for(i=1;i<n;i++){  
  9.       if(array[i]>Max) Max=array[i];  
  10.       else if(array[i]<Min) Min=array[i];  
  11.       sum=sum+array[i];  
  12.     
  13.    aver=sum/n;  
  14.    return(aver);  
  15.  
  16.   
  17. void main(){  
  18.    float ave,score[10];  
  19.    int i;  
  20.    for(i=0;i<10;i++) scanf("%f",&score[i]);  
  21.    ave=average(score,10);  
  22.    printf("max=%.2f\nmin=%.2f\naverage=%.2f\n",Max,Min,ave);  
  23.    getch();  
  24.  

  运行情况如下:

  99 45 78 97 100 67.5 89 92 66 43
  max=100.00
  min=43.00
  average=77.65

  http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F2.jpg函数average中与外界有联系的变量与外界的联系如右图所示。可以看出形参array和n的值由main函数传递给形参,函数average中aver的值通过return语句带回main函数。Max和Min是全局变量,是公用的,它们的值可以供各函数使用,如果在一个函数中,改变了它们的值,在其他函数中也可以使用这个已改变的值。

  由此看出,可以利用全局变量以减少函数实参与形参的个数,从而减少内存空间以及传递数据时的时间消耗。

  (2)建议不在必要时不要使用全局变量,因为:

  ① 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。

  ② 它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。在程序设计中,在划分模块时要求模块的“内聚性”强、与其他模块的“耦合性”弱。即模块的功能要单一(不要把许多互不相干的功能放到一个模块中),与其他模块的相互影响要尽量少,而用全局变量是不符合这个原则的。一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。这样的程序移植性好,可读性强。

  ③ 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。

  (3)如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。如:

  例2 外部变量与局部变量同名。

  http://c.longziyong.cn/images/2011/%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F3.jpg

  运行结果为

  8

  程序中第1行定义了外部变量a、b,并使之初始化。第3行开始定义函数max,a和b是形参,形参也是局部变量。函数max中的a、b不是外部变量a、b,它们的值是由实参传给形参的,外部变量a、b在max函数范围内不起作用。最后4行是main函数,它定义了一个局部变量a,因此全局变量a在main函数范围内不起作用,而全局变量b在此范围内有效。因此printf函数中的max(a,b)相当于max(8,5),程序运行后得到结果为8。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有