ec网站域名网站建设方案书腾讯云
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
一般情况下,变量(包括静态存储方式和动态存储方式)的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。
如果有一些变量使用频繁(例如,在一个函数中执行10000次循环,每次内存数数循环中都要引用某局部变量),则为存取变量的值要花费不少时间。为提高执行效率,允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量,用关键字register作声明。如
register int f ;
由于现在的计算机的速度愈来愈快,性能愈来愈高,优化的编译系统能够识别使用频繁的变量,从而自动地将这些变量放在寄存器中,而不需要程序设计者指定。因此,现在实际上用register声明变量的必要性不大。注意:3种局部变量的存储位置是不同的:自动变量存储在动态存储区;静态局部变量存储在静态存储区;寄存器存储在CPU中的寄存器中。
全局变量的存储类别
全局变量都是存放在静态存储区中的。因此它们的生存期是固定的,存在于程序的整个运行过程。但是,对全局变量来说,还有一个问题尚待解决,就是它的作用域究竟从什么位置起,到什么位置止。作用域是包括整个文件范围还是文件中的一部分范围?是在一个文件中有效还是在程序的所有文件中都有效?这就需要指定不同的存储类别。
一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。但有时程序设计人员希望能扩展外部变量的作用域。有以下几种情况。
1.在一个文件内扩展外部变量的作用域
如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件结束。在定义点之前的函数不能引用该外部变量。如果由于某种考虑,在定义点之前的函数需要引用该外部变量,则应该在引用之前用关键字extern对该变量作“外部变量声明”,表示把该外部变量的作用域扩展到此位置。有了此声明,就可以从“声明”处起,合法地使用该外部变量。
例如:
调用函数,求3个整数中的大者。
解题思路:
用extern声明外部变量,扩展外部变量在程序文件中的作用域。
编写程序:
运行结果:
这个例子很简单,主要用来说明使用外部变量的方法。由于定义外部变量A,B,C的位置在函数main之后,本来在main函数中是不能引用外部变量A,B,C的。现在,在main函数的开头用extern对A,B,C进行“外部变量声明”,把A,B,C的作用域扩展到该位置。这样在main函数中就可以合法地使用全局变量A,B,C了,用scanf函数给外部变量A,B,C输入数据。如果不作extern声明,编译main函数时就会出错,系统无从知道A,B,C是后来定义的外部变量。
由于A,B,C是外部变量,所以在调用max函数时用不到参数传递。在max函数中可直接使用外部变量A,B,C的值。
注意:提倡将外部变量的定义放在引用它的所有函数之前,这样可以避免在函数中多加一个extern声明。
用extern声明外部变量时,类型名可以写也可以省写。例如,“extern int A,B,C;”也可以写成“extern A,B,C;”。因为它不是定义变量,可以不指定类型,只须写出外部变量名即可。