五、运算符
运算符是表示实现某种运算的符号。Visual Basic 2008提供了丰富的运算符,包括算术运算符、串联运算符、比较运算符、逻辑运算符和位运算符等。
根据运算符所作用的操作数的个数,可以分为单目运算符和双目运算符,单目运算符只有一个操作数,双目运算符有两个操作数。在运算时,不同运算的运算符之间存在优先级的区分,同一类运算中的不同运算符之间也有优先级的区分。
1.算术运算符
算术运算符是常用的运算符,其操作对象是数值类型的数据。在算术运算符中,除了“-”(负号)运算符是单目运算符外,其余都是双目运算符。算术运算符见表2-3,假设x为整型变量,值为5。
表2-3 算术运算符
指数运算中的指数可以是任意的实数,例如2.5^0.2。通常,指数运算比取负值运算的优先级高,但当指数运算符后面紧接着取负值运算符时,先进行取负值运算,然后求指数。例如,4^-2是求4-2,计算结果为0.0625;(-4)^-2的计算结果为0.0625,而-4^-2的计算结果为-0.0625。
非整数数据进行除法运算,其结果为非整数。在进行整除运算时,先将操作数四舍五入取整,再做整除运算,其运算结果直接被截断为整数。例如,12.56\2.48的运算结果为6。
Mod运算是对两个操作数相除取余数。如果有一个是非整数,则余数也为非整数。例如,7 Mod 3的运算结果为1,而7.5 Mod 3的运算结果为1.5,7 Mod 3.5的运算结果为0.0。
2.串联运算符
串联运算符有两个:+和&,其作用都是将两个字符串连接起来,它们都是双目运算符。这两个运算符的区别如下。
+运算符既可作为字符串运算符,又可作为算术运算符。当+运算符两边操作数都是字符串时,进行串联运算,将两个字符串连接起来,并作为结果。当+运算符两边操作数都是数值时,进行加法运算。当+运算符一边的操作数是数值,另一边是数字字符串时,如果Option Strict为On,则限制数据类型转换,将产生编译器错误。如果Option Strict为Off,则会将数字字符串隐式转换为Double类型,并执行加法运算,其结果为一个数值。当+运算符一边的操作数是数值,另一边不是数字字符串时,则产生转换无效的错误。Visual Basic中Option Strict默认为Off。
&运算符不管两边操作数的数据类型如何,直接进行连接操作。要注意的是:由于&符号既可作为字符串运算符,又可作为Long类型类型符,当&与变量或常量连在一起时,被视为类型符。因此,&运算符前后必须加空格。
例如,表2-4是当Option Strict为Off时的具体实例。
表2-4 &和+运算符实例
对于字符串串联操作,建议使用&运算符,原因是它专门定义用于字符串,可以降低产生意外转换的可能性。
3.关系运算符
关系运算符用于比较两个表达式,并返回表示两个值之间关系的Boolean值。有用于比较数值的运算符、用于比较字符串的运算符以及用于比较对象的运算符。
关系运算符都是双目运算符,其作用是对两个操作数进行比较,其结果是一个逻辑值。如果比较关系成立,则返回True,否则返回False。表2-5列出了VB中的关系运算符。
表2-5 关系运算符
在比较时应注意以下原则:
(1)如果两个操作数都是数值型,则按数值的大小比较。
(2)避免对非整数做相等或不等的判断,例如,
1.0/3.0 * 3.0 = 1
这在数学上是成立的,但在计算机上执行时,可能会得到假值(False),应改写为:
Abs(1.0/3.0 * 3.0-1.0)<= 1E-6(Abs是求绝对值的函数)
当两个值的差值小于一个很小的数时,即认为这两个值相等。
(3)如果两个操作数都是字符型,则从左到右逐个字符比较,以其ASCII码值大小比较。即首先比较两个字符串的第一个字符,其ASCII码值大的字符串大。如果第一个字符相同,则比较第二个字符,依此类推,直到遇到不同字符。
(4)汉字字符大于西文字符。
(5)比较运算符的优先级相同。
(6)Like运算符与通配符:?、*、#、[字符列表]、[!字符列表]结合使用。其中,?表示任何一个字符,*表示任意多个字符,#表示任何一个数字(0~9),[字符列表]表示字符列表中任意一个字符,[!字符列表]表示不是字符列表中的任意一个字符。举例如下。
判断文本框TextBox1中输入的姓名的第二个字是否为“中”字的表达式为:
TextBox1.Text Like "?中*"
判断文本框TextBox2中输入的是否为Office的一个版本名称的表达式为:
判断变量Letter中存储的单个字母是否是元音字母的表达式为:
TextBox2.Text Like "Office####"
Letter Like "[aeiou]" '这里的中括号不能省略
(7)在Visual Basic中,True在系统内部存储为-1,False存储为0。实际上,任何非零数据都可以代表True,只是在Visual Basic中存储为-1。但在数值型数据转换为布尔型数据进行运算时,Visual Basic将0转换为False,将其他非零值转换为True。
4.逻辑和按位运算符
逻辑运算符的功能是对操作数(Boolean表达式)进行逻辑运算(又称布尔运算),其运算结果是逻辑值True或False。逻辑运算符除了Not是单目运算符外,其他都是双目运算符。逻辑运算符及实例见表2-6和表2-7。
表2-6 逻辑运算符
表2-7 逻辑运算实例
例如,判断变量x的值是否在[10,100]区间中的表达式为:
x >= 10 And x <= 100
这里不能写成:
10 <= x <= 100
因为表达式是从左往右计算的,无论x的值是什么,10<=x的值都只能是True或者False两个逻辑量,转换为数值型则为-1和0,均不超过100,因此整个表达式的值永远为True。
又如,在TextBox1文本框中输入性别,TextBox2文本框中输入年龄。判断是否达到退休年龄的表达式是:
TextBox1.Text = "男" And Val(TextBox2.Text)>= 60 Or TextBox1.Text = "女" And Val(TextBox2.Text)>= 55
也可以使用以下表达式:
Val(TextBox2.Text)>= 60 OrElse TextBox1.Text = "女" And Val(TextBox2.Text) >= 55
提示:当AndAlso运算的第一个操作数为Flase,OrElse运算的第一个操作数为True时,不会计算第二个操作数的值,短路可以提高运算效率。
但是,如果第二个操作数的运算中包含附加操作,短路将会跳过这些操作。例如,如果表达式包含对Function过程的调用,那么,如果表达式已短路,则不会调用该过程,并且Function中包含的任何附加代码都不会运行。如果程序逻辑依赖于任何这些附加代码,则应该避免使用短路运算符。
如果Not、And、Or和Xor运算的操作数都是数值,则以数值的二进制逐位进行逻辑运算,称为按位运算。
例如,x变量的值为13、y变量的值为6,表达式x And y表示将13和6的二进制1101和110进行And运算,得到结果为4。如图2-3所示。
图2-3 按位运算符And对数值运算
通常,利用按位运算对某些二进制位进行屏蔽和设置。And运算常用于屏蔽某些位,Or运算则用于设置某些位为1。
例如,s1是Short类型的变量,要将其高8位二进制设置为全1,可以使用表达式s1 Or&HFF00。假设s1变量值的二进制为a15 a14 a13 a12 a11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0,其运算如图2-4所示。
图2-4 按位运算符Or对数值运算
注意:AndAlso和OrElse运算符不支持按位运算。