
3.1 数据类型
程序设计的主要作用就是进行各种数据的输入、处理和输出。数据可按照两种方式进行划分:
(1)根据数据种类的不同,可将数据划分为不同的数据类型,不同数据类型的处理方式也不同。Visual Basic提供了一些基本的数据类型,用户也可以根据需要,在此基础上定义新的数据类型。基本数据类型包括数值型、字符串型、布尔型、日期型、对象型和变体型。
(2)根据数据在程序运行期间是否改变,可将数据划分为常量和变量。常量就是程序运行期间其值保持不变的数据,变量就是程序运行期间其值发生变化的数据。
3.1.1 基本数据类型
Visual Basic提供的基本数据类型如表3-1所示。
表3-1 Visual Basic中的基本数据类型

3.1.2 标识符与保留字
1.标识符
像人的名字一样,标识符是程序员为常量、变量、数据类型等定义的标识,利用它可以引用相应的常量、变量、数据类型。Visual Basic中对合法的标识符有如下规定:
(1)必须以字母开头,后面可跟字母、数字、下画线“_”。
(2)长度不超过255个字符。
(3)自定义的标识符不能与系统中已定义的标识符(即保留字)同名。
例如,student_name和no1均是合法标识符。
2.保留字
保留字是Visual Basic预先定义的标识符,表示特定含义。
例如,保留字Integer表示数据类型是整型。
3.1.3 常量
Visual Basic程序中的常量分为直接常量与符号常量。直接常量是直接表示的数据,符号常量是用一个合法的符号(即标识符)来代表常量。
1.直接常量
直接常量按照数据类型可分为数值常量、字符串常量、布尔常量与日期常量,其中,数值常量又分为整型常量、长整型常量、单精度浮点型常量和双精度浮点型常量。
(1)整型常量。整型常量按照不同进位计数制的表示形式分为十进制、八进制、十六进制,如表3-2所示。
表3-2 整型常量

(2)长整型常量。长整型常量按照不同进制表示形式分为十进制、八进制、十六进制,如表3-3所示。
表3-3 Visual Basic中的长整型常量

(3)实型常量。分为单精度实数与双精度实数。实型常量由尾数、指数符号和指数3部分组成,其中:
①单精度实数的指数符号为E或e,双精度实数的指数符号为D或d,含义是“乘10的幂”。
②指数是整数,正、负均可。例如,3.5E+2!表示单精度实型常量2.5×102,-2.5d-2#表示双精度实型常量-2.5×10-2。
(4)货币型常量。货币型常量是特殊的实型常量,最多可精确到小数点后4位,例如,20@和300.1234@。
(5)字符串常量。字符型常量要用双引号括起来,字符串的内容是指双引号内的若干ASCII字符(除双引号与回车符)。例如,"Hello World",""。
(6)布尔常量。布尔常量只有True(真)和False(假)两种取值。
(7)日期常量。日期常量用“#”号括起,双“#”号内包含的合法的年、月、日、时、分、秒可作为日期常量。例如,#10/12/2015 10:10:10#,#10-10-2014#。
2.符号常量
符号常量是用一个标识符代表常量,可以由系统定义,也可以由用户定义。
例如,系统定义的表示对齐的符号常量vbAlignBottom表示底端对齐,vbAlignLeft表示左对齐,还有颜色常量vbRed表示红色等。查看系统定义的符号常量,可以打开菜单依次选择“视图”→“对象浏览器”命令,如图3-1所示。

图3-1 查看系统定义的常量
用户根据需要也可以自己定义符号常量,格式为
Public|Private Const常量名As类型=值
(1)Public|Private表示符号常量的有效范围,详见变量定义部分。
(2)常量名按习惯通常全大写。
(3)一次可以定义多个符号常量,用逗号隔开。
(4)符号常量的数据类型可以在As关键字后说明,也可以在常量名后添加表3-1中的“类型说明符”来说明。例如:
Const PI As Double=3.1415926 '用符号PI代表常数3.1415926
Const PI#=3.1415926 '符号常量的类型为双精度
Const PI2#=PI*PI '可以使用已定义的符号常量定义新的符号常量
显然对于频繁使用或修改的常量来讲,符号常量比直接常量在程序设计和调试过程中更便于使用。例如,程序直接使用定义好的符号常量PI求半径为r的圆的周长和面积:
circ=2*PI*r
area=PI*r*r
3.1.4 变量
变量是内存区域的名字,它的内容在程序运行时可以发生变化。变量所属的数据类型不同,其占用的内存区域大小也就不同。
1.变量的定义
变量的定义格式如下:
Dim|Private|Static|Public变量名1 As类型1,变量名2 As类型2…
例如:
Dim a As Integer,b As Integer '定义两个整型变量a和b
(1)变量名应为合法的标识符。
(2)变量的数据类型在As后标明,如果省略这部分,则变量为Variant类型。例如:
Dim a,b As Integer '定义变量a为Variant类型,变量b为Integer类型
(3)定义变量后Visual Basic会赋给变量默认的初始值:数值类型的变量被定义后的初始默认值为0。String类型的变量被定义后的初始默认值为空串,即""。
(4)可以使用表3-1中的类型说明符默认定义变量。例如:
Dim a% '定义Integer型变量number
a=10
number%=6 '定义Integer型变量number,并赋值
average#=0 '定义Double型变量average,并赋值
(5)尽管Visual Basic不要求定义变量,但好的编程习惯是在使用变量前先定义变量。在每个窗体模块或标准模块的“通用|声明”部分添加如下语句:
Option Explicit
以便当使用一个未定义变量时,系统会自动给出“变量未定义”的提示,如图3-2所示。
例如:使用时,误将定义好的变量employee写成emplyee,系统将给出错误提示,提示emplyee未定义。

图3-2 变量未定义的错误提示
2.变量的作用域
定义变量时,Dim、Private、Static、Public表示所定义的变量是局部的、私有的、公共全局的或静态的。这几个关键字与声明变量的位置进行不同组合,决定变量的有效作用范围,即变量在程序中可以被正确引用的范围,如表3-4所示。
表3-4 变量的作用范围

(1)Dim和Static关键字。过程级变量用Dim和Static关键字进行定义时涉及“生存期”的问题,“生存期”是Visual Basic保存该变量值的时间。用Dim定义的过程级变量在它所在的过程运行时被初始化,过程结束时其值不再被保留;用Static定义的过程级变量生存期是整个程序,所以当过程首次运行时变量被初始化,若过程结束而整个程序未结束时其值继续被保留,但每次过程运行时它都不再被初始化。
【例3.1】在窗体单击事件中观察分别用Dim与Static关键字定义的变量的取值,程序运行界面如图3-3所示。

图3-3 程序运行界面
代码如下:

用Dim定义的过程级变量dimCount在每次执行Form_Click()事件过程时都重新被初始化,所以每次都打印出0+1的结果1;而用Static定义的过程级变量staticCount只被初始化一次,且总能保留上次运行结果。在程序设计中,Static变量有累加器的效果。
(2)Private关键字。使用Private关键字在窗体的“通用|声明”部分定义变量时,变量在当前窗体的代码中都有效。
【例3.2】在窗体单击事件中观察用Private关键字定义的变量的取值。代码如下:

运行程序,在窗体上打印输出结果为
2
这说明窗体级私有变量a在两个事件过程中都有效,它们使用的a变量是同一个变量。
(3)Public关键字
Public关键字在窗体的“通用|声明”部分定义变量时,变量在当前窗体的代码中和其他窗体中都有效,但在其他窗体中使用该变量时,前面须带有窗体的名称。
【例3.3】在窗体单击事件中观察用Public关键字定义的变量的取值,程序运行结果如图3-4所示。
代码如下:

图3-4 【例3.3】运行界面

在显示Form2后,单击窗体,其中引用窗体Form1中定义的公有变量a,使其增加1,然后输出结果。
3.1.5 用户自定义数据类型
如果在应用中基本数据类型不能满足需要,还可以利用Type语句,在基本数据类型的基础上定义新的数据类型。格式为

其中,Public|Private的含义见变量定义部分。成员名为合法标识符。例如:

可以使用已定义的数据类型定义新的数据类型:

可以通过“变量名.元素名”的方式使用自定义类型的变量,例如:
Dim info1 As Info '定义变量为Info类型
info1.name="LiMing" '对变量info1的成员name赋值
info1.add.country="China" '对变量info1的成员add的元素country赋值