![]() ![]() |
|
C语言函数的作用域规则 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 13:57:59 文章录入:杜斌 责任编辑:杜斌 | |
|
|
“语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则。
4.2.2全局变量 与局部变量不同,全局变量贯穿整个程序,并且可被任何一个模块使用。它们在整个程序执行期间保持有效。全局变量定义在所有函数之外,可由函数内的任何表达式访问。在下面的程序中可以看到,变量count定义在所有函数之外,函数main()之前。但其实它可以放置在任何第一次被使用之前的地方,只要不在函数内就可以。实践表明,定义全局变量的最佳位置是在程序的顶部。 ![]() 仔细研究此程序后,可见变量count既不是main()也不是func1()定义的,但两者都可以使用它。函数func2()也定义了一个局部变量count。当func2访问count时,它仅访问自己定义的局部变量count,而不是那个全局变量count。切记,全局变量和某一函数的局部变量同名时,该函数对该名的所有访问仅针对局部变量,对全局变量无影响,这是很方便的。然而,如果忘记了这点,即使程序看起来是正确的,也可能导致运行时的奇异行为。 全局变量由C编译程序在动态区之外的固定存储区域中存储。当程序中多个函数都使用同一数据时,全局变量将是很有效的。然而,由于三种原因,应避免使用不必要的全局变量: ①不论是否需要,它们在整个程序执行期间均占有存储空间。②由于全局变量必须依靠外部定义,所以在使用局部变量就可以达到其功能时使用了全局变量,将降低函数的通用性,这是因为它要依赖其本身之外的东西。③大量使用全局变量时,不可知的和不需要的副作用将 可能导致程序错误。如在编制大型程序时有一个重要的问题:变量值都有可能在程序其它地点偶然改变。来源:www.examda.com 结构化语言的原则之一是代码和数据的分离。C语言是通过局部变量和函数的使用来实现这一分离的。下面用两种方法编制计算两个整数乘积的简单函数mul()。 通用的专用的 mul(x,y) intx,y; intx,y; mul() {{ return(x*y);return(x*y); }} 两个函数都是返回变量x和y的积,可通用的或称为参数化版本可用于任意两整数之积,而专用的版本仅能计算全局变量x和y的乘积。
4.2.3动态存储变量 从变量的作用域原则出发,我们可以将变量分为全局变量和局部变量;换一个方式,从变量的生存期来分,可将变量分为动态存储变量及静态存储变量。 动态存储变量可以是函数的形式参数、局部变量、函数调用时的现场保护和返回地址。 这些动态存储变量在函数调用时分配存储空间,函数结束时释放存储空间。动态存储变量的定义形式为在变量定义的前面加上关键字“auto”,例如: auto int a,b,c; “auto”也可以省略不写。事实上,我们已经使用的变量均为省略了关键字“auto”的动态存储变量。有时我们甚至为了提高速度,将局部的动态存储变量定义为寄存器型的变量,定义的形式为在变量的前面加关键字“register”,例如: register int x,y,z; 这样一来的好处是:将变量的值无需存入内存,而只需保存在CPU内的寄存器中,以使速度大大提高。由于CPU内的寄存器数量是有限的,不可能为某个变量长期占用。因此,一些操作系统对寄存器的使用做了数量的限制。或多或少,或根本不提供,用自动变量来替代。 4.2.4静态存储变量 在编译时分配存储空间的变量称为静态存储变量,其定义形式为在变量定义的前面加上关键字“static”,例如: static int a=8; 定义的静态存储变量无论是做全程量或是局部变量,其定义和初始化在程序编译时进行。 作为局部变量,调用函数结束时,静态存储变量不消失并且保留原值。 ![]() 从上述程序看,函数f()被三次调用,由于局部变量x是静态存储变量,它是在编译时分配存储空间,故每次调用函数f()时,变量x不再重新初始化,保留加1后的值,得到上面的输出。 |
|
![]() ![]() |