第2章VisualBasic.
NET语法基础通过第1章的学习可以看到,要建立一个简单的VB.
NET应用程序是非常容易的.
但要编写稍微复杂的程序,就会用到各种不同类型的数据、常量、变量、数组,以及由这些数据组成的各种表达式.
正确理解数据类型、常量、变量等概念对学习如何编写程序非常重要.
2.
1数据类型在VB.
NET中,每个数据都有一定的类型,如整型、实型、字符串型、日期型等.
数据类型不仅决定了数据的取值范围和所占内存的存储字节数,而且还决定了数据可执行的运算.
因此,正确区分和使用不同的数据类型,是确保程序的正确性和可靠性的前提,也是减少内存存储空间开销的基础.
2.
1.
1基本数据类型VB.
NET的基本数据类型如表2.
1所示.
表2.
1VB.
NET的基本数据类型类型名类型符占字节数取值范围Boolean4True或FalseByte10~255Char20~65535Date8January1,1~December31,9999Decimal@16+/-79228162514264337593543950335Double#8-1.
79769313486231E+308~+1.
79769313486231E+308Integer%4-2147483648~+2147483647Long&8-9223372036854775808~+9223372036854775807Object4任何一种数据类型的数据均可存储在Object数据类型中Short2-32768~+32767Single!
4-3.
402823E+38~+3.
402823E+38String$一个字符串可存储大约20亿个Unicode字符1.
数值数据类型数值数据类型用来处理能够区分大小的数值量,可分为整数类型和非整数类型两大类.
(1)整数类型有符号整数类型包括Short(16位)、Integer(32位)和Long(64位).
声明为有符号整数类型的变量只能存放整数.
无符号整数类型是Byte(8位),取值范围为0~255.
运算过程中,如果要给整数类型变量赋超出其表示范围的值,将导致出错.
但如果试图用一个整型变量存储一个带有小数部分的数值量,则系统对小数部分进行四舍五入处理,例如:DimXAsInteger'有效范围为-2147483648~+2147483647X=2147483648'超出X的取值范围而出错X=7.
8'X赋值为8对于整数类型,类型符号S表示Short,I表示Integer,L表示Long,Byte没有对应的类型符号.
(2)非整数类型非整数类型包括Decimal、Single和Double,这3种都是有符号类型,其中Decimal为定点数,Single和Double为浮点数.
Decimal数据类型主要适用于数据范围大且不允许舍入误差的数值计算.
在表示一个Decimal类型常量时,必须将值类型符号D添加到数字值的后面,例如:X=9223372036854775808D浮点数类型支持的有效数字位数比Decimal类型少,但比Decimal类型表示的数据范围更大,使用浮点数进行计算时可能会出现舍入误差.
浮点数值可以由mmmEeee的形式表示,其中mmm表示尾数的有效数字,eee表示以10为底的指数.
Single数据类型可表示的最大值为3.
402823E+38,而Double能代表的最大值为1.
79769313486231E+308.
对于非整数数据类型,类型符号D代表Decimal,F代表Single,R代表Double.
2.
字符数据类型VB.
NET提供了用来处理可显示和打印字符的专门数据类型.
根据处理的字符的个数不同,字符数据类型又可分为Char类型和String类型,Char类型中包含单个字符,而String类型中可包含多个字符.
例如:DimccAsChar,ssAsStringcc="A"ss="ab123"3.
布尔类型布尔类型又称为逻辑类型,类型名用Boolean表示,专门用来处理True和False这两个逻辑量.
如果变量只能包含真/假、是/否或者开/关等一对互斥信息,则应将其定义为Boolean类型.
Boolean类型的默认值为False.
下面是一个判断整型变量取值是否为奇数的例子:DimNasInteger,YYAsBooleanN=Val(InputBox("请输入一个正整数N:"))IfNMod20ThenYY=TrueEndIf4.
日期时间类型日期时间类型占8个字节,类型名为Date,表示从1年1月1日到9999年12月31日的日期以及从凌晨0:00:00到晚上11:59:59的时间.
Date类型的值必须用一对"#"来分隔,格式为mm/dd/yyyy,例如#8/31/2005#就是一个合法的日期时间值,表示2005年8月31日.
5.
对象类型对象数据类型为一个32位地址,类型名用Object表示,可用于指向应用程序中的任何一个对象.
例如:DimObjVarAsObjectObjvar=OpenDatebase("C:\VBNET\Biblio.
mdb")类型为Object的变量可接受任何数据类型的值.
当其中包含值类型时,Object将被作为值类型处理;当其中包含引用类型时,Object又可以被作为引用类型处理.
在上述两种情况下,Object变量都不存储值本身,而表示一个存储单元的地址,即指针.
需要说明的是,在声明一个变量时,最好指出其类型,而不要指定为Object.
2.
1.
2复合数据类型VB.
NET除了提供上述基本数据类型外,还可以创建复合数据类型,例如结构、数组和类.
复合数据类型可由基本数据类型创建,也可以由其他复合数据类型创建.
本节重点介绍结构,数组和类的有关内容将在后续章节中介绍.
结构可以包含多个不同类型的数据项.
例如需要保存一个学生的学号、姓名、年龄和成绩,一种方法是设置4个不同的变量来存放这4个数据,另一种方法是定义一个包含4个字段的结构,其中每个字段分别用来保存学生的学号、姓名、年龄和成绩信息.
1.
结构的声明结构的声明由Structure语句开始,由EndStructure语句结束.
例如:StructureStudentDimNumberAsLongDimNameAsStringDimAgeAsIntegerDimScoreAsSingleEndStructure其中,Student是结构名,以后可以用它来声明变量,Number、Name、Age和Score是该结构的组成字段,又称为成员或域.
一个结构类型中至少包含一个字段.
2.
结构成员的访问结构声明以后,就可以声明该结构的变量.
例如:DimS1AsStudent要访问结构变量的字段,必须使用".
"号.
例如:S1.
Number=980205S1.
Name="张明"S1.
Age=20S1.
Score=86.
53.
结构的嵌套结构中各字段既可以是基本数据类型,也可以是其他结构.
如果一个结构中包含其他结构类型的字段,则称为结构的嵌套.
例如:StructureScoreDimYuWenAsSingleDimShuXueAsSingleDimWuLiAsSingleDimYingYuAsSingleEndStructureStructureStudent2DimNumberAsLongDimNameAsStringDimAgeAsIntegerDimChengJiAsScoreEndStructure其中,ChengJi是结构Student2的一个字段,其类型是Score,而Score又是一个包含4个字段的结构.
对于嵌套的结构变量,需要使用多级".
"符号访问其各组成字段.
例如:DimS2AsStudent2S2.
Number=980206S2.
Name="李佳"S2.
Age=19S2.
ChengJi.
YuWen=82.
5S2.
ChengJi.
YingYu=65.
0在VB.
NET中,虽然没有对结构嵌套的次数做出限制,但在实际应用中一般嵌套到两级即可,嵌套层次太多容易引起混乱.
2.
1.
3枚举类型枚举类型为处理相关常量集和将常量值与名称相关联提供了非常方便的手段.
例如,可以将一组与星期相关的整数常量声明为枚举类型,并在代码中使用名称而不是使用它们的值.
枚举类型需要在应用程序的声明部分中用Enum语句创建.
在默认情况下,枚举类型中的第一个常量被初始化为0,其后的常量则依次被初始化为比前一个常数大1的数值.
例如,在下面的例子中,声明了一个枚举类型Days,常量Sunday的值为0,常量Monday的值为1,以此类推.
PublicEnumDaysSundayMondayTuesdayWednesdayThursdayFridaySaturdayEndEnum在枚举类型中,可以通过赋值语句为常量显式赋值,此值可以为包括负数在内的任意整数值,通常可以使用小于零的值代表错误.
例如,对上面的枚举类型可做出如下修改:PublicEnumDaysSunday…SaturdayInvalid=-1EndEnum在引用枚举类型成员时,一般必须使用枚举类型名来限定.
例如,引用Days枚举类型中的Sunday成员,可以使用如下方法:X=Days.
Sunday2.
1.
4类型转换将值从一种数据类型改变为另一种数据类型的过程被称为类型转换.
根据涉及的类型不同,类型转换可分为扩展转换和收缩转换;根据转换方式的不同,类型转换可分为显式转换和隐式转换.
1.
扩展转换和收缩转换扩展转换是指转换后的目标数据类型能容纳转换前的源数据类型.
扩展转换时,由于目标数据类型表示的范围和精度一般不低于源数据类型的范围和精度,因此不会导致信息损失.
标注扩展转换如表2.
2所示.
表2.
2标准扩展转换源数据类型目标数据类型ByteByte、Short、Long、Decimal、Single、DoubleShortShort、Long、Decimal、Single、DoubleLongLong、Decimal、Single、DoubleDecimalDecimal、Single、DoubleSingleSingle、DoubleDoubleDouble任意枚举类型源类型的基础整数类型,以及任意能扩展的类型CharChar、String任意类型Object任意派生类型源类型的基类型任意类型由源类型实现的任意接口Nothing任意数据类型或对象数据类型收缩转换是指转换后的目标数据类型无法容纳转换前的源数据类型.
由于收缩转换的目标数据类型表示的范围和精度比源数据类型小,转换时很可能会导致信息损失,甚至转换失败,例如数值转换可能导致溢出.
并且,编译器通常不允许隐式执行收缩转换.
2.
显式转换和隐式转换类型转换时需要使用类型转换关键字,称为显式转换.
显式转换时,系统将根据指定的关键字强制性地将对应的表达式的值转换为目标数据类型.
例如:X!
=25.
4'X为单精度浮点数,赋初值为25.
4Y=Cint(X+2)'Y的值为27执行时,Cint关键字先将表达式X+2的值转换为Integer类型,然后再将它赋值给变量Y.
VB.
NET提供的显式转换关键字如表2.
3所示.
表2.
3类型转换关键字类型转换关键字目标数据类型类型转换关键字目标数据类型CboolBooleanCintIntegerCbyteByteClngLongCcharCharCobjObjectCdateDateCshortShortCdblDoubleCSngSingleCdecDecimalCstrString几点说明:(1)在显式转换时,关键字改变的仅仅是表达式的值的类型,而不会影响到表达式中变量的值和类型.
如在上述例子中,执行后变量X的类型仍为Single,其值仍是25.
4.
(2)显示转换中的源值,必须能由目标数据类型表示,否则将会产生错误.
例如:Y=Cint(2147483648)'错误,因为2147483648超出了Integer类型所能表示的范围在给变量赋值时,若变量与赋值表达式的类型不一致,系统会先将表达式值的表达式转换为与变量相同的数据类型,然后再赋值给变量.
由于这种类型转换是系统自动完成的,而且不需要使用任何特殊的语法,因此称为隐式转换.
例如:DimXAsIntegerDimYAsSingleX=125Y=X'Y的值为125.
02.
2常量和变量根据数据在内存中存放和访问的方式,数据可以被分成常量和变量.
正确理解常量和变量的概念是程序设计的基础.
2.
2.
1常量在程序运行过程中其值保持不变的量称为常量.
表2.
4所示为一些常见的基本常量.
常量是用具有含义的名称代替不变的值的一种方式,编程时合理地使用常量可以提高程序代码的可读性.
表2.
4基本常量数据类型常量举例数据类型常量举例BooleanTrueShort4253Byte125Single-4543.
756DateDecember26、2005String"4ddd33ffg6344"Integer483112声明常量的语法形式如下:Const常量名[As类型]=表达式VB.
NET提供了一个管理常量类型的编译指令OptionStrict,当OptionStrict为On时,必须指出常量的数据类型;当OptionStrict为Off时,编译器将为常量分配数据类型,因此可以不必指定常量的类型.
下面是几个声明常量的例子:OptionStrictOnConstMinAgeAsInteger=16ConstPIASSingle=3.
14159或者OptionStrictOffConstDays=365ConstSalary=24502.
2.
2变量在程序运行过程中其值可以变化的量称为变量.
使用变量前,一般需要事先声明该变量.
变量的声明主要是给出变量的名称和数据类型,在VB.
NET中,可以用下面的语法形式声明变量:Dim变量名As类型其中,类型可以是表2.
1中所列出的数据类型或用户自定义数据类型.
例如:DimHeightAsIntegerDimScoreAsSingleDimNameAsString可以用一个语句声明多个同类型的变量.
例如,变量A和B的类型都是Single,声明语句如下:DimA,BAsSingle此外,在类和模块中还可以通过其他方法声明一个变量,具体方法将在后续章节介绍.
要声明一个合法的变量名称,必须遵守下列规则:(1)变量名必须以字母、汉字或下划线(_)开头.
(2)变量名仅能由字母、数字、下划线或汉字组成.
(3)不能使用VB.
NET的保留字.
(4)变量名在变量的作用范围内不能重名.
例如,MyAge、_1、ab_453都是合法的变量名,而21abc、My.
Name、_、Money$都是非法的变量名.
变量只能在从其声明语句开始到包含它的程序块结束之间的范围内有效,称为变量的有效范围.
变量的有效范围决定了变量的可访问性,即在有效范围内变量是可用的,在有效范围以外变量是无效的.
例如:PrivateSubButton1_Click()DimAAAsInteger…IfAA>0ThenDimCCAsSingle…EndIf…EndSub此程序代码段中,共声明了AA和CC两个变量,变量AA的有效范围是从其声明开始到该子过程结束,而变量CC的有效范围是从其声明开始到If语句结束.
2.
3数组在解决实际问题时,有时需要对一组相同类型的数据进行访问、统计、排序等处理,例如求一个班级中所有学生成绩的平均成绩或者进行成绩排名等;有时要保存程序运行中产生的具有相同类型的中间结果.
要解决这些问题,就需要使用数组.
在VB.
NET中,数组被看成是一种特殊的数据类型——复合数据类型,它还可以被看作是数组对象.
数组是内存中的一块连续存储区域,数组名是这块区域的起始地址.
利用数组名和其下标可以随机地访问数组中的每一个元素.
本节内容只涉及数组的基础知识,其中包括数组的定义、初始化、元素的引用和动态数组.
对数组元素的基本操作,如数组元素的输入、输出和查找等,由于都要用到循环语句,所以这些内容将在后续章节中介绍.
2.
3.
1数组的定义使用数组之前必须先定义数组,以便通知计算机为其开辟足够的存储空间.
该存储区域的每个单元都用数组名和下标来标识.
定义数组可以使用Dim、ReDim、Static、Public、Protected、Private等语句,用这些语句定义数组的格式都一样,只是它们的使用范围和作用不同.
Dim:用于模块或过程中.
ReDim:只用于过程中,定义动态数组.
Static:只用于过程中,定义静态数组.
Public:用于模块中,定义全局数组.
下面以Dim语句为例说明定义数组的语句格式.
1.
一维数组的定义格式:Dim数组名(下标上界)As类型名称例如:DimMyarray(5)AsInteger(说明:(1)"数组名"的命名规则与简单变量相同,可以是任何合法的VB.
NET变量名.
数组名应有一定的意义,做到"见名知义".
另外,在同一过程中,数组名不能与其他变量名同名.
(2)数组的数据可以是Short、Integer、Long、Single、Double、Decimal、String等基本类型,也可以是数组、结构等复合类型,还可以是Object类型.
如果省略"As类型名称",则定义的数组为Object类型.
(3)VB.
NET中定义数组时只指定数组下标的上界,数组下标的下界为0,而且不能改变.
所以,数组中第一个元素的下标是0,最后一个元素的下标是上界值,一个数组共有(上界值+1)个元素.
如在上面的例子中,数组Myarray共有Myarray(0)、Myarray(1)、Myarray(2)、Myarray(3)、Myarray(4)和Myarray(5)6个数组元素.
(4)数组必须先定义后使用.
定义数组时,系统会把数值型数组中的所有元素初始化为0,把字符类型的数组初始化为空字符串,把布尔型的数组初始化为False等.
(5)数组分为静态数组和动态数组.
静态数组用于处理那些数据个数已经确定的情形.
可见,定义静态数组时其下标上界必须是常数,而不能是变量或表达式.
静态数组一旦确定,就不能再扩大其存储空间,如果指定的数组下标值超过数组的下标上界,就会出错.
动态数组与静态数组不同,动态数组的元素个数可以在程序运行时发生改变,所以定义时,其下标上界要使用变量来确定.
(6)通常,数组各元素的类型是相同的,但是,当定义的数组是Object类型时,该数组中可以存放不同类型的数据.
这种数组常被称作"默认数组"或"混合数组",它一般应定义为静态数组.
2.
二维数组的定义格式:Dim数组名(第一维下标上界,第二维下标上界)As类型名称例如:DimArr(3,4)AsInteger该语句定义了一个二维数组,数组名为Arr,它有4行(0~3)5列(0~4),共20个整型数组元素,每个整型元素占4个字节空间,所以数组Arr占据了80个字节的存储空间.
定义二维数组与定义一维数组的基本要求一样,另外需要说明的是:(1)二维数组在内存中是"按行存放",即在内存中先顺序地存放第一行的元素,再存放第二行的元素,依此类推,只有存放完第n-1行的元素,才可以存放第n行的元素.
(2)数组元素的排列位置从1算起,因此,如果定义了一个二维数组a(m,n),其中第i行第j列的元素a(i,j)在数组中的排列位置可以用公式i*(n+1)+j+1来计算.
(3)一维数组和二维数组可以放在同一行中定义,数组和变量也可以放在同一行中定义.
但在同一定义体中定义的变量、一维数组和二维数组必须是同一类型的数据.
例如,Dimd,a(2),b(2,1)AsInteger.
(4)使用二维数组常用来解决矩阵、向量等数值计算问题.
另外,图形、图像的处理也常使用二维数组.
(5)多维数组的定义与二维数组定义一样,而且多维数组中的元素在内存中存放的顺序依然是"按行存放".
2.
3.
2数组的初始化建立数组的主要目的是存储数据,以便更加方便地处理这些数据.
因此,数组定义之后通常要给数组的各个元素赋值.
其中一种方法是像普通变量赋值那样给数组元素赋值.
另外一种方法是,如果数组要存放的元素已经确定,则在定义数组时指定初始值,这种方法称为数组的初始化.
1.
一维数组的初始化格式:Dim数组名()As类型={常量1,常量2,……,常量n}数组初始化时,不能指定数组下标的上界,数组的元素个数由花括号中列出的常量个数决定,其中各常量之间用逗号隔开.
常量的类型要与数组的类型一致或者可以自动进行类型转换.
例如,Dimnumbers()AsSingle={12,25,-6,2.
3,0}.
2.
二维数组的初始化格式:Dim数组名(,)As类型={{第1行值},{第2行值},……,{第n行值}}二维数组初始化与一维数组的初始化类似,但左边括号内多了一个逗号,这个逗号必不可少,它表明所定义的数组的维数.
二维数组是"按行存储",所以对二维数组初始化时,把每行的元素值放在一个花括号中,各花括号间用逗号隔开,而每行中常量的格式与一维数组相同.
这样,内层花括号的个数决定二维数组的行数和一维下标的上界,即第一维下标的上界就是内层花括号个数减1.
内层花括号中常量的个数决定二维数组的列数和第二维下标的上界.
例如,已知要处理的一个矩阵数据如下:则存放该矩阵数据的数组可初始化为:DimMatrices(,)AsInteger={{56,23,12},{9,-6,35},{0,2,45}}初始化二维数组时,要注意初始化的数据类型、每维数据的个数都要一致.
下面的这些初始化语句都是错误的,请思考一下这些语句错误的原因.
Dima()AsInteger={{2,3},{1,6},{5,4}}Dima(,)AsInteger={{2,,3},{1,6,2},{5,4}}Dima(,)AsInteger={{2,"af3"},{1,2},{"5",4}}3.
多维数组的初始化多维数组的初始化与二维数组的初始化类似.
对于一个n(n≥3)维数组来说,初始化时,等号左边括号中要用n-1个逗号指定数组维数,等号右边的花括号中的初值要放在n-1层嵌套的花括号中.
下面给出一个三维数组初始化的例子:Dima(,,)AsInteger={{{1,1,4},{5,2,1}},{{1,5,7},{4,3,7}},_{{0,5,3},{0,1,1}}}4.
UBound函数和LBound函数格式:UBound(数组名[,n])LBound(数组名[,n])UBound函数返回指定数组的第n维的下标上界值,LBound函数返回指定数组的第n维的下标下界值.
如果数组是一维数组,参数n可以省略.
例如:Dima(,)AsShort={{2,3},{1,2},{5,4}}DeBug.
WriteLine(UBound(a,1))DeBug.
WriteLine(LBound(a,2))执行上面的语句后,在"输出"窗口中输出2和0.
2.
3.
3数组元素的引用数组各元素的引用格式为:数组名(下标1[,下标2,……,下标n])这里的下标可以是整型常数、变量或整型表达式,但下标取值必须在指定范围之内,即0到下标上界.
在引用数组元素时,数组名和维数必须与定义数组时的一致.
例如:Dima()AsShort={3,2,4,9}Dimb(1,1)AsShortB(1,0)=a(2)+a(1)B(1,1)=a(0)-a(3)2.
3.
4动态数组如果要处理的一组数据,其个数未知或者要处理的数据个数在程序运行期间要发生改变,则需要把数组定义为动态数组.
例如,要统计一个班级的学生信息,由于每个班级的学生人数不一定相等,因此,编程时就要使用动态数组.
静态数组在编译时就开辟了内存空间,而动态数组只有在程序运行时才开辟内存空间.
定义动态数组时只需确定数据类型,其大小要在程序运行时用Redim语句来确定.
1.
动态数组的定义动态数组的定义分以下两个步骤:(1)用Dim、Public、Private等语句声明一个只有括号但没有下标的数组.
该语句可以声明数组的类型和维数.
如果是一维数组,只有括号;如果是二维数组,括号内多一个逗号;如果是三维数组,括号内有两个逗号,依此类推.
(2)在程序过程中用ReDim语句重新分配数组变量的存储空间,指定动态数组的下标上界.
使用ReDim语句的格式为:ReDim[Preserve]数组名(下标上界)其中,"数组名"是前面用Dim语句定义好的动态数组名,"下标上界"通常是已经被赋过值的变量.
选项Preserve是可选的,如果使用该选项,则会保留上一次数组各元素的值.
例如:PrivateSubForm1_Click(ByValsenderAsObject,ByValeAs_System.
EventArgs)HandlesMyBase.
ClickDimarr()AsInteger,nAsInteger'第1次定义带下标的数组n=1ReDimarr(n)arr(0)=56:arr(1)=3Debug.
WriteLine(arr(0)arr(1))'第2次定义带下标的数组n=2ReDimarr(n)arr(2)=23Debug.
WriteLine(arr(0)arr(1)arr(2))'第3次定义带下标的数组n=4ReDimPreservearr(n)arr(3)=-10:arr(4)=24Debug.
WriteLine(arr(0)arr(1)arr(2)arr(3)arr(4))EndSub运行结果:第1次定义的动态数组:563第2次定义的动态数组:0023第3次定义的动态数组:0023-1024该例题中,使用ReDim语句对动态数组arr()进行了3次存储空间分配,第1次分配了2个数组元素;第2次分配了3个数组元素,由于缺省了选项Preserve,所以数组元素arr(0)和arr(1)只能保持初始值0;第3次分配了5个数组元素,其中数组元素arr(0)、arr(1)、arr(2)保留了上一次的赋值.
使用ReDim语句不能改变数组的维数和类型.
2.
Erase语句使用Erase语句可以清除数组变量并释放数组元素占用的内存.
如果在Erase语句之后需要继续使用被清除的数组,必须用ReDim语句重新分配存储空间.
该语句只能用在过程中.
其格式为:Erase数组名2.
4运算符与表达式在程序设计中,可以把运算符和数据组合成表达式,完成数据运算.
其中,数据可以是各种类型的变量、常量、函数等;运算符可以是算术运算符、字符串运算符、关系运算符、逻辑运算符等.
不同运算的运算符之间有优先级的区分,同一种运算中的不同运算符之间也有优先级的区分.
本节将按照优先级从高到低的顺序介绍各种运算符.
2.
4.
1算术运算符表2.
5中列出了常用的算术运算符,举例中的变量a为整型数2.
表2.
5算术运算符运算符含义优先级例子结果^指数1a^532-取负2-a-2*乘33.
6*a7.
2/浮点除310.
3/a5.
15\整除410.
3\a5Mod取模513Moda1+加610+a12-减610-a81.
指数运算与取负运算指数运算中的指数可以是任意的实数,例如2.
5^0.
3.
一般来说,指数运算比取负运算的优先级别要高,但当指数运算符后面紧临着取负运算符时,先进行取负运算.
例如:2^-2求的是2-2,结果是0.
25.
(-2)^-2的计算结果是0.
25,而-2^-2的计算结果是-0.
25.
2.
浮点除与整除运算浮点除运算执行标准的除法运算,结果为浮点数.
整除运算执行整数除法运算,即运算符的操作数都要先四舍五入取整,其运算结果被截断为整型数或长整型数,并不进行四舍五入.
例如13.
49\2.
49结果为6.
3.
取模运算取模运算符Mod用来求余数,该运算是对两个操作数相除,并返回余数.
如果有一个数是浮点数,则余数也是浮点数.
例如,7Mod3的计算结果为1,而7.
5Mod3的计算结果为1.
5.
2.
4.
2字符串运算符字符串运算符有两个:"&"和"+",使用字符串运算符可以把两个字符串前后拼接起来.
在字符串变量后使用运算符"&"时,变量名与"&"之间应留有一个空格.
当两个操作数中有一个是数值型数据时,如果使用连接符"&",VB.
NET会把数值型数据转换为字符类型的数据,然后进行字符的连接运算;如果使用连接符"+",会把字符型数据转换为数值型数据执行加法运算,但如果字符型数据不能转换成数字,就会出现错误提示.
例如:12.
23+"asf"'出错12.
23&"asf"'结果为"12.
23asf"12.
23+"45"'结果为57.
232.
4.
3关系运算符表2.
6列出了常用的关系运算符,使用关系运算符可以进行两个操作数之间的比较,操作数可以是数值型、字符型数据.
已知表2.
6例子中的变量X=12.
3、Y=56,如果比较关系成立,则返回True,否则返回False.
表2.
6关系运算符运算符含义例子结果=相等X=YFalse>大于X>YFalse>=大于等于X>=YFalse或>YTrueLike字符串匹配"fdag"Like"*a*"TrueIs对象引用比较(1)如果两个操作数是数值,就按其大小进行比较.
(2)如果两个操作数是字符或字符串,则按字符的Unicode码值从左到右逐个字符进行比较,其Unicode码值大的字符串大,例如"abcdf">"abcf"比较结果为False.
(3)关系运算符之间的优先级相同.
(4)Like运算符主要用于数据库查询中字符型字段与字符串的比较.
Is运算符用来比较两个对象的引用变量,主要用于对象操作.
此外,Is运算符还可以在SelectCase语句中使用.
2.
4.
4逻辑运算符使用逻辑运算符可以连接两个或多个关系表达式或逻辑表达式.
表2.
7列出了常用的逻辑运算符,假设表中的变量X=12.
3、Y=56,如果逻辑关系成立则结果为True,否则结果为False.
表2.
7逻辑运算符运算符名称优先级说明例子结果Not非1由真变假或由假变真,进行"取反"运算Not(31)And(27)Or(43)False(1)要判断X是否在区间[a,b],数学中写成a≤X≤b,但在VB.
NET程序代码中应写成a关系运算符>逻辑运算符.
另外,对于多种运算符混合使用的表达式,通过增加圆括号,可以改变表达式的运算顺序.
(4)在算术运算中,如果表达式具有不同的数据精度,则运算结果的数据类型采用精度高的数据类型.
但是,当Long型数据与Single型数据运算时,结果为Single型数据.
2.
5常用内部函数VB.
NET提供的内部函数用于对数据进行计算或转换的内置过程或子例程.
用户可以在表达式中使用这些函数.
使用时,应给出函数名并提供函数所需要的参数.
本节介绍常用的几种内部函数,如转换函数、字符串操作函数、日期函数等.
2.
5.
1转换函数表2.
8列出了常用的转换函数,使用这些函数可以进行不同数据类型之间的转换.
表2.
8转换函数函数格式函数功能和参数说明例子结果Chr(x)返回与指定字符代码相关联的字符.
参数x是Integer型的数,表示字符的"代码数据点"或字符代码,其取值范围为-32768~65536Chr(65)Chr(-14130)"A""任"Asc(s)返回字符s的代码数据或字符代码.
对于单字节字符集,函数返回值范围为0~255;对于双字节字符集,函数返回值的范围为-32768~32768Asc("A")Asc("任")65-14130Str(x)把数字转换为字符串.
其中的x可以是任意的数值类型Str(12.
3)&"a""12.
3a"Format(x[,格式说明符])返回根据指定格式设置x的字符串.
其中x可以是Short、Integer等类型的数值数据;格式说明符是一个由预定义说明符组成的字符串Format(12.
3)Format(31.
5,"00.
00")12.
331.
50Hex(x)返回数值数据x的十六进制值的字符串.
其中参数x可以是任何有效的数值表达式或String表达式.
如果x不是整数,则将其舍入到最接近的整数;如果省略参数,则返回0Hex(459)1CBOct(x)返回数值数据x的八进制值的字符串.
对参数x的要求与Hex函数一致Oct(459)713续表函数格式函数功能和参数说明例子结果Val(s)把参数s转换为适当类型的数值.
参数s可以是String表达式、Object变量(其值必须可以转换为String类型)或Chr值Val("2457")Val("&HFFFF")2457-1Fix(x)不进行舍入,直接返回数值x的整数部分Fix(99.
8)Fix(-26.
2)Fix(-26.
8)99-26-26Int(x)如果x>=0,则不进行舍入,直接返回x的Int(99.
8)99整数部分;如果x0,则Rnd函数返回序列中的下一个数值;如果number=0,则Rnd函数返回最近生成的数值;如果缺省该参数,则返回序列中的下一个随机数.
随机函数是根据一个给定的初值,即种子数,按照某一种特定的运算来产生一个具有一定随机性的数值.
由于每一次后续调用Rnd函数都用序列中前一个生成的数作为下一个数的种子,所以,对于任何给定的初始种子都会生成相同的数字序列.
如果想改变这一情况,可以在使用Rnd函数之前,使用不带参数的Randomize语句初始化随机数生成器,将系统的时间作为随机数发生器的种子值,即得到不同的随机数序列.
spinservers是Majestic Hosting Solutions LLC旗下站点,商家提供国外服务器租用和Hybrid Dedicated等产品,数据中心包括美国达拉斯和圣何塞机房,机器默认10Gbps端口带宽,高配置硬件,支持使用PayPal、信用卡、支付宝或者微信等付款方式。农历春节之际,商家推出了几款特别促销配置,最低双路E5-2630Lv3机器每月149美元起,下面列出几款机器...
hostsailor怎么样?hostsailor成立多年,是一家罗马尼亚主机商家,机房就设在罗马尼亚,具说商家对内容管理的还是比较宽松的,商家提供虚拟主机、VPS及独立服务器,今天收到商家推送的八月优惠,针对所有的产品都有相应的优惠,商家的VPS产品分为KVM和OpenVZ两种架构,OVZ的比较便宜,有这方面需要的朋友可以看看。点击进入:hostsailor商家官方网站HostSailor优惠活动...
Virmach自上次推出了短租30天的VPS后,也就是月抛型vps,到期不能续费,直接终止服务。此次又推出为期6个月的月抛VPS,可选圣何塞和水牛城机房,适合短期有需求的用户,有兴趣的可以关注一下。VirMach是一家创办于2014年的美国商家,支持支付宝、PayPal等方式,是一家主营廉价便宜VPS服务器的品牌,隶属于Virtual Machine Solutions LLC旗下!在廉价便宜美国...