3.3 常量和变量
前一节介绍了Visual Basic中使用的数据类型。在程序中,要用到各种数据类型的数据,有些类型的数据在程序运行期间,其值是不发生改变的,即以常量形式出现;而有些数据在程序运行期间,其值是可变的,即以变量的形式出现,它代表的则是内存中指定的存储单元。
3.3.1 常量
常量在程序运行的过程中,其值不变。常量也有数据类型,Visual Basic中的常量分为两种,一种是文字常量,一种是符号常量。
1. 文字常量
Visual Basic的文字常量分为两种,即字符串和数值。
(1)字符串常量
字符串常量由字符组成,可以是除双引号和回车符之外的任何ASCII字符,其长度不能超过65 535个字符(定长字符串)或231(约21亿)个字符(变长字符串)。例如:
"¥123.50"
"Hello the Word!"
(2)数值常量
数值常量共有4种表示方式,即整数、长整型数、货币型数和浮点数。
❑整型数:有3种形式,即十进制、十六进制和八进制。
➣十进制整型数:由一个或几个十进制数字(0~9)组成,可以带有正号或负号,其取值范围为-32 768~32 767,例如:123、-4567、+89等。
➣十六进制整型数:由一个或几个十六进制数字(0~9及A~F或a~f)组成,前缀必须是&H (或&h),其取值范围为&H0~&HFFFF。例如,&H21A、&h191等。
➣八进制整型数:由一个或几个八进制数字(0~7)组成,前缀必须是&(或&O),其取值范围为&O0~&O177777。例如,&127、&O213等。
❑长整型数:也有3种形式。其组成与整型数组成相同,数的尾部加“&”符号,取值范围见前一节数据类型的范围。例如,784&、&H123&、&O217&,分别表示十进制长整型数、十六进制长整型数和八进制长整型数。
❑货币型数:也称为定点数,其取值范围见前一节。例如,3200.5@。
❑浮点数:也称为实数,分为单精度浮点数和双精度浮点数,指数符号为E(单精度)或D(双精度)。例如,123.45E-6!、2345D3#。
2. 符号常量
在Visual Basic中,定义符号常量的格式如下。
[Public | Private] Const 常量名 [As 数据类型] =表达式[,常量名=表达式]⋯⋯
❑Public是全局常量关键字,全局常量要在模块中声明,不能用于过程。
❑Private是局部变量关键字,局部常量要在模块和窗体中声明,同样不能在过程中使用。
❑常量名用来表示常量的实际名字。
❑数据类型是常量的类型,可以是Byte、Boolean、Integer、Long、Currency、Single、Double、Date、String及Variant。
3.3.2 变量
在计算机中,变量名用标识符表示,所以变量名遵循标识符的命名规则。变量随程序调入内存,并被分配一定的存储空间,通过名字引用变量。Visual Basic语言中,提供了两种声明变量方法。
1. 用Dim和Static显式声明变量
❑使用Dim声明变量
格式:
Dim 变量名 As 数据类型
例如:
Dim Age As Integer Dim Name As String
❑使用Static声明变量
格式:
Static 变量名 As 数据类型
使用Static声明的变量为静态变量。它与Dim声明的变量不同之处在于执行一个过程结束时,过程中所用到的Static变量的值会保留,下次再调用此过程时,变量的初值是上次调用结束时被保留的值,而Dim声明的变量在过程结束时不保留,每次调用时需要重新初始化。
2. 隐式声明
使用变量时,Visual Basic不要求对所有变量事先声明,不加声明的变量系统会默认为变体类型。对应于强制显式声明,在程序中不经声明而使用变量称为变量的隐式声明。隐式声明使用起来比较随意,但也会带来一些麻烦。例如,误拼一个变量名就会被隐式声明为另一个新变量,由此会产生问题。因此,建议对所有变量作显式声明。
3.3.3 作用域
一个变量被定义后,并不是在任何地方都能使用,每一个变量都有它的作用范围。变量的有效范围就是变量的作用域。由于变量的有效范围不同,所以也就有了变量的不同级别。
1. 局部变量
在一个过程内部(例如Command1_Click)定义的变量称为局部变量。这个变量只能在定义它的过程内使用。一个窗体可以包括很多过程,在不同过程中定义的变量可以同名,因为它们互相独立、互不干扰。例如:
01 Private Sub Form1_Click( ) 02 Dim Num1 As Integer 03 ... 04 End Sub 05 Private Sub Command1_Click( ) 06 Dim Num1 As Integer 07 Static Sum1 As Single 08 ... 09 End Sub
在Form1_Click过程中定义了局部变量Num1,在Command1_Click过程中定义了Sum1和Num1,两个同名变量Num1没有任何关系。
2. 窗体和模块级变量
如果一个窗体中的不同过程要使用同一个变量,就需要在该窗体或模块内的过程外面定义一个变量,它在整个窗体或模块中有效,即其作用域为整个窗体或模块,本窗体或本模块内的所有过程都能访问它,这就是窗体或模块级的变量。
声明模块级变量要先进入程序代码窗口,单击左侧下拉框右端的向下箭头并选择“通用”,再单击右侧下拉框右端的向下箭头并选择“声明”,如图3.1所示(红色区域)。
图3.1 模块级变量的声明
现在就可以声明变量了。在窗体声明中的所有变量都属于这类变量。这一级的变量只在本窗体或本模块中有效,在其他窗体或模块中不能以该变量名来访问它。如果在窗体中以Private或Dim声明变量,其他窗体或模块不能引用这个变量,如果以Public声明这个变量,则允许在其他窗体和模块中引用它,但必须指出其所在的对象。例如,在窗体Form1中有如下的变量声明。
Public a As Integer
在另一窗体和模块中可以引用此变量,但必须用Form1.a,而不能直接用a。请注意,不能把a误认为全局变量(一个全局变量名在程序中全程有效,如果a是一个全局变量,那么在其他窗体和模块中引用它时只要写变量名a,而无须写Form1.a)。
在模块中以Private或Dim声明的变量是模块级的变量,只能在本模块中被引用。
3. 全局变量
全局变量可以被程序中任何一个模块和窗体访问。在窗体中不能定义全局变量,全局变量要在模块文件(.bas)中的声明部分用Global或Public关键字声明。它的一般格式如下。
Global 变量名 As 数据类型
或
Public 变量名 As 数据类型
例如:
Global Score As Integer Public Sum1 As Long
三种变量的作用域总结见表3.4。
表3.4 变量的作用域
3.3.4 Option Explicit 语句
使用Option Explicit语句对普通对象进行的变量声明,必须写在模块中所有过程之前。
如果模块中使用了Option Explicit,则必须使用Dim、Private、Public或Static来显式声明所有的变量。这时,如果使用了未声明的变量名,在编译时会出现错误。
如果所有模块都使用Option Explicit语句,除非使用Deftype语句指定了缺省类型,否则所有未声明的变量都是隐含为Variant类型的。
3.3.5 注释语句
在编写程序时,为了让其他人能够读懂自己的程序代码,在较难懂的地方应当加入注释语句。Visual Basic的注释语句以英文的单引号(')开始,在代码窗口中以绿色显示,如图3.2所示。
图3.2 带注释语句的代码段
注释语句不参加程序的执行,它们仅仅起到说明代码语句的作用。编程时,在代码中加入注释语句是一种非常好的习惯。不仅是要让别人看懂程序,对于写程序的人也会起到提示作用。