购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.5 C51的变量作用域

变量作用域是变量在程序中起作用的范围。C51语言中,使用变量前需要首先声明该变量。由于C51程序中可以包含多个函数和程序文件,因此,使用变量时,需要注意变量有效作用范围的问题,即变量的作用域。

6.5.1 基本规则

在C51语言中规定,在块结构中进行定义的变量,其有效使用范围只在该块结构内。其中,块结构是任何以花括号括起来的一段程序,通常称为复合语句。在C51程序中,一些函数和语句是以一对花括号“{”和“}”来构成的,这也是块结构的一种,示例如下:

这段程序可在Keil μVision3集成开发环境中运行。其中,整型变量i定义在主函数的大括号内,其使用范围为整个主函数,因此,后面的打印输出语句正确。而变量j定义在复合语句if内,因此其只在该if块结构中使用,出了该块结构便无效了。因此,最后的打印输出语句是错误的,在编译程序时,会提示该变量未定义。

由于块结构内部的变量和块结构外部的变量作用域不同,因此,若块结构内定义的变量与块结构外定义的变量具有相同的变量名,它们之间不冲突,示例如下:

这段程序可在Keil μVision3集成开发环境中运行,程序输出结果如下:

in if block i=2

out if block i=23

该程序在主函数中定义了整型变量i,然后在if块结构中也定义了i,因为其作用域不同,因此,在if语句内部,其内部定义的变量起作用,外部定义的变量被屏蔽。在if语句外部,是主函数定义变量的有效范围。

变量作用域即变量的作用范围,其可以是一个函数、一个程序文件,甚至整个工程里的所有文件都可用。一般而言,按照存储类型,变量分为4种类型,即自动变量、外部变量、静态变量和寄存器变量。下面分别介绍其作用域的范围。

6.5.2 自动变量

自动变量是以关键字auto标识的变量类型。其声明格式为“[auto] 类型说明符 变量标识符,变量标识符…”。自动型变量可以在如下两种情况下使用。

●在函数的内部进行定义,其作用域的范围为该函数的内部,在该函数之外,变量无效。

●在程序块中声明,其作用域的范围为该程序块。

在编译C51程序时,自动型变量根据变量类型动态分配存储空间。动态分配的过程是,在程序执行到该函数时,为其自动分配存储空间,当该函数执行完毕后,立即结束该变量的存储空间,即该自动型变量消失。这便是为什么在函数内部定义的变量,不能在函数外引用的原因。

说明 :在C51程序中,函数或程序块内部定义的变量,一般都默认为自动型变量。因此,在声明自动型变量时,关键字auto可以省略。

使用自动变量的程序示例如下:

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

i=2,j=3

i=1,j=2

i=0,j=1

在该程序中,主函数声明了整型变量i和j,然后分别有两个块结构的复合语句,其中分别定义并初始化变量i和j。按照C51语言规定,各个变量默认为自动型变量,因此,其作用域仅限于函数内部和块结构内部,不会互相影响。

6.5.3 外部变量

外部变量一般定义在所有函数的外部,即整个程序文件的最前面,也称为全局变量。外部变量的作用域是整个程序文件,可以被该程序文件中的任何函数使用。

在编译C51程序时,外部变量根据变量类型被静态地分配适当的存储空间。在整个程序运行过程中,该变量一旦分配空间,便不会消失。这也是外部变量对整个程序文件有效的原因。

因为外部变量是永久性的,因此使用外部变量,可以作为不同函数间参数的传递和共享。示例如下:

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

the area is 12.560000

该程序在源文件的头部定义了两个外部变量PI和r,分别表示圆周率和半径。整型变量r在主函数中初始化,然后在circle函数中调用,用来计算面积。

如果一个C51工程项目由多个程序文件组成时,外部变量允许在一个程序文件中定义,而在另一个程序文件中使用。这样,在使用时,需要在文件的头部用关键字extern来显式地进行声明。这样C51在编译的时候,才能正确知道该外部变量的数据类型及值。

上面的程序可以采用下面这种方法来实现,将程序分为circle.c和main.c两个文件。其中,circle.c程序文件代码如下:

这段程序可在Keil μVision3集成开发环境中运行,执行结果如下:

the area is 12.560000

该程序实现的功能和前面程序是一样的,只不过分为两个文件来实现。在circle.c文件中定义了外部变量PI和r,在主文件main.c中使用它们之前,先用extern加以声明,这样便可以使用circle.c文件中定义的外部变量了。

6.5.4 静态变量

静态变量以关键字static声明,声明格式为“static 类型说明符 变量标识符,变量标识符…”。

在C51语言中,根据声明的位置不同,静态变量可以分为如下两种。

●内部静态变量,在函数内部定义;

●外部静态变量,在函数外部定义。

在编译C51程序时,根据数据类型静态地给静态变量分配合适的存储空间,并在程序运行过程中始终占有该存储空间。

另外,C51语言允许将函数定义为静态类型的。这样,只有同一文件中的其他函数才能调用这个静态型函数,同一工程项目中的其他文件不能调用访问,这样,既有利于程序的模块化设计,又可以防止和其他文件中的函数有重名的情况。

说明 :从变量作用域来看,内部静态变量和自动变量类似,作用域只是定义该变量的函数内部。从占用内存的角度,内部静态变量和全局变量类似,其始终占有内存空间。

6.5.5 寄存器变量

寄存器变量用关键字register声明,声明格式为“register 类型说明符 变量标识符,变量标识符…”。示例如下:

register char ch;

register double db;

寄存器变量常用于某一变量名频繁使用的情况,这样做可以提高系统的运算速度。因为普通的变量一般存储在内存中,而寄存器变量被存储在CPU的寄存器中。

在C51语言中,只允许同时定义两个寄存器变量,如果多于两个,程序在编译时会自动地将两个之外的寄存器变量当做非寄存器变量来处理。 RP1AFlGvkptqVOdB6X/BRP0ABXVI1uRSSczqJniuo8RfWpQa0Kk1lTfKIIcracVq

点击中间区域
呼出菜单
上一章
目录
下一章
×