在执行逻辑与运算的过程中,只有当两个操作数均为True的时候,返回结果才为True,如果有一个操作数为False,则返回结果为False。不过和一般的逻辑操作不同,在VBScript中,还有可能操作数为Null,在表2.5中列举了逻辑与运算的条件和结果:
表2.5 逻辑与运算的条件和结果
左操作数 |
右操作数 |
逻辑运算结果 |
True |
True |
True |
True |
False |
False |
False |
True |
False |
False |
False |
False |
True |
Null |
Null |
Null |
True |
Null |
False |
Null |
False |
Null |
False |
False |
Null |
Null |
Null |
例如,表达式 (3>2) And (3<4)的结果为True,表达式(3>2) And (3>4)的结果为False,而表达式(3>2) And Null的结果为Null,表达式(3>4) And Null的结果为False。
与运算符还可以对数值进行运算操作,如果两个操作数是数值的话,那么VBScript先将其转化为二进制,再从最低位开始,按位进行与运算,最后再将运算的结果以十进制的形式返回。运算的时候遵循以下规则:只有1 And 1的结果为1,否则,结果均为0。例如,4 And 3的结果是0,因为4的二进制形式是100,而3的二进制形式是011,按位与操作之后结果是000,所以返回结果是0。
在执行逻辑或运算的过程中,只有当两个操作数均为False的时候,返回结果才为False,如果有一个操作数为True,则返回结果为True。当然,也存在操作数为Null的情况,在表2.6中列举了逻辑或运算的条件和结果:
表2.6 逻辑或运算的条件和结果
左操作数 |
右操作数 |
逻辑运算结果 |
True |
True |
True |
True |
False |
True |
False |
True |
True |
False |
False |
False |
True |
Null |
True |
Null |
True |
True |
False |
Null |
Null |
Null |
False |
Null |
Null |
Null |
Null |
例如,表达式 (2>3) Or (3>4)的结果为False,表达式(2<3) Or (3>4)的结果为True,而表达式(3>4) Or Null的结果为Null,表达式(2<3) Or Null的结果为True。
当或运算符对数值进行运算的时候,对于二进制数的每一位进行或运算,运算的时候遵循以下规则:只有0 Or 0的结果为0,其他情况下结果均为1。例如,4 Or 3的结果是7,因为4的二进制形式是100,而3的二进制形式是011,按位与操作之后结果是111,所以返回结果是7。
非运算符只有一个操作数,在执行逻辑非运算的过程中,如果操作数为True,返回结果False;如果操作数为False,返回结果为True;如果操作数为Null,则返回结果也为Null,如表2.7所示:
表2.7 逻辑非运算的条件和结果
操作数 |
逻辑运算结果 |
True |
False |
False |
True |
Null |
Null |
例如,表达式 Not (2>3)的结果为True,表达式Not (2<3)的结果为False,而如果变量theNull = Null,那么Not theNull的结果仍然是Null。
当非运算符对数值进行运算的时候,对二进制的每一位进行非运算:Not 0的结果是1,而Not 1的结果是0。例如,Not 4的结果是-5,在运算的时候,4的二进制形式是00000000 00000100,由于前面的0在与运算、或运算中均为0,不影响运算结果,所以在前面的例子中,我们将这些0忽略了,而在进行非运算的时候,这些0必须保留,运算结果的二进制形式是11111111 11111011,十进制形式是-5。
异或运算符用于判断两个表达式的结果是否不同,在执行逻辑异或运算的过程中,如果两个操作数同为True或同为False,返回结果为False,否则返回结果为True。如果有操作数为Null,那么返回的结果为Null,在表2.8中列举了逻辑异或运算的条件和结果:
表2.8 逻辑异或运算的条件和结果
左操作数 |
右操作数 |
逻辑运算结果 |
True |
True |
False |
True |
False |
True |
False |
True |
True |
False |
False |
False |
True |
Null |
Null |
Null |
True |
Null |
False |
Null |
Null |
Null |
False |
Null |
Null |
Null |
Null |
例如,表达式 (2>3) Xor (3>4)的结果为False,表达式(2<3) Xor (3>4)的结果为True,而表达式(2>3) Xor Null的结果为Null。
当异或运算符对数值进行运算的时候,对于二进制数的每一位进行异或运算,运算的时候遵循以下规则:0 Xor 0的结果为0,1 Xor 1的结果为0,其他情况下,结果为1。例如,4 Xor 5的结果是1,因为4的二进制形式是100,而5的二进制形式是101,按位异或操作之后结果是001,所以返回结果是1。同样,在异或操作中,4和5的二进制形式前面的0异或运算之后仍然是0,并不影响结果。
等价运算符和异或运算符正好相反,在等价运算的过程中,如果两个操作数同为True或同为False,返回结果为True,否则返回结果为False。如果有操作数为Null,那么返回的结果为Null,在表2.9中列举了逻辑等价运算的条件和结果:
表2.9 逻辑等价运算的条件和结果
左操作数 |
右操作数 |
逻辑运算结果 |
True |
True |
True |
True |
False |
False |
False |
True |
False |
False |
False |
True |
True |
Null |
Null |
Null |
True |
Null |
False |
Null |
Null |
Null |
False |
Null |
Null |
Null |
Null |
例如,表达式 (2>3) Eqv (3>4)的结果为True,表达式(2<3) Eqv (3>4)的结果为False,而表达式(2>3) Eqv Null的结果为Null。
当等价运算符对数值进行运算的时候,对于二进制数的每一位进行等价运算,运算的时候遵循以下规则:0 Eqv 0的结果为1,1 Eqv 1的结果为1,其他情况下,结果为0。例如,4 Eqv 5的结果是-2,因为4的二进制形式是00000000 00000100,而5的二进制形式是00000000 00000101,按位异或操作之后结果是11111111 11111110,所以返回结果是-2。
蕴涵运算符实现了逻辑中的蕴涵运算,在蕴涵运算中,只有当前提为True并且结果为False的情况下结果为False,在其余的情况下结果均为True。再考虑操作数为Null的情况之后,逻辑蕴涵运算的条件和结果如表2.10所示:
表2.10 逻辑蕴涵运算的条件和结果
左操作数 |
右操作数 |
逻辑运算结果 |
True |
True |
True |
True |
False |
False |
False |
True |
True |
False |
False |
True |
True |
Null |
Null |
Null |
True |
True |
False |
Null |
True |
Null |
False |
Null |
Null |
Null |
Null |
例如,表达式 (2>3) Imp (3>4)的结果为True,表达式(2<3) Imp (3>4)的结果为False,而表达式Null Imp (2>3)的结果为Null。
当蕴涵运算符对数值进行运算的时候,对于二进制数的每一位进行蕴涵运算,运算的时候遵循以下规则:只有在1 Imp 0的情况下结果为0,其他情况下结果均为1。例如,4 Imp 3的结果是-5,因为4的二进制形式是00000000 00000100,而3的二进制形式是00000000 00000011,按位蕴涵操作之后结果是11111111 11111011,所以返回结果是-5。
VBScript中有两种连接运算符:&运算符和加法运算符。连接运算符可以将字符串相连,组合成为一个字符串。不过加法运算符也可以应用与数值运算,在某些情况下,很容易引起混淆,所以我们建议连接的时候使&运算符。由于我们已经介绍过了加法运算符,下面我们就来讨论一下&运算符:
&运算符的语法如下所示:
Result = Exp1 & Exp2
其中,Result是表达式运算结果,Exp1和Exp2则是表达式中的操作数。
&运算符的功能是将两个字符串相连,如果有操作数是非字符串类型,那么VBScript先将其转换为字符串类型,然后再进行字符串连接操作。如果操作数为Null或者Empty,那么将会被转换成为空字符串(“”),只有在两个操作数都为Null的情况下,不会进行字符串连接,而是返回Null。例如:
“ASP ” & “World” = “ASP World”
3 & “a” = “3a”
3 & 4 = “34”
在对于字符串操作的时候,加法运算符也能够进行字符串连接,不同的地方在于,加法运算符进行运算的时候,不会如同连接字符串一样将非字符串转换为字符串,特别是,如果一个操作数是字符串,另外一个操作数是数值的时候,VBScript会将字符串转换为数值,然后进行加法运算,例如:
3 + “4” = 7
在ASP页面中进行数据库编程的时候,我们常常需要建立复杂的SQL语句,在这时候,我们可以先将SQL语句的各个部分以相对独立而且较短小的字符串表示,然后再将这些字符串连接起来,组合成一条SQL语句。
在VBScript中,一个表达式中可以存在多个运算符,当表达式具有多个运算符的时候,VBScript将按照预定的顺序计算表达式的各个部分,这个预定顺序被称为运算符优先级。如果在表达式中有括号,那么首先将对括号内的表达式进行运算,在括号内表达式的运算过程中,仍然遵循运算符的优先级关系。
在优先级顺序中,算术运算符的优先级最高,然后是连接运算符,再往后是关系运算符,逻辑运算符的优先级最低,在表2.11中列举了运算符的优先级顺序,在表中自上至下是优先级从高到低的顺序:
表2.11 VBScript运算符优先级顺序(优先级从高到低顺序排列)
运算符类型 |
运算符符号 |
运算符说明 |
算术运算符 |
^ |
幂运算符 |
算术运算符 |
- |
被用作取负运算符的减法运算符 |
算术运算符 |
*和/ |
乘法运算符和除法运算符 |
算术运算符 |
\ |
整除运算符 |
算术运算符 |
Mod |
模运算符 |
算术运算符 |
+和- |
加法运算符和减法运算符 |
连接运算符 |
& |
|
关系运算符 |
=、<>、>、>=、<、<=、IS |
所有关系运算符优先级相同 |
逻辑运算符 |
Not |
非运算符 |
逻辑运算符 |
And |
与运算符 |
逻辑运算符 |
Or |
或运算符 |
逻辑运算符 |
Xor |
异或运算符 |
逻辑运算符 |
Eqv |
等价运算符 |
逻辑运算符 |
Imp |
蕴涵运算符 |
在表达式运算的过程中,括号内的表达式总是最先运算的,然后根据运算符的优先顺序从高到低开始运算,如果有几个运算符优先级一样高,那么则按照运算符从左到又的顺序进行计算。
例如,表达式7/3*2的结果是4.66666666666667,因为除法运算符和乘法运算符的优先级相同,在运算的时候从左到右,先执行除法运算,然后再进行乘法运算。而表达式7\3*2的结果是1,这则是因为整除运算符的优先级比乘法运算符的优先级要低,首先进行乘法运算2*3=6,再进行整除运算7\6=1。
不过在这中情况下,也容易引起歧义,因为对于表达式7\3*2而言,我们并不能判断开发人员的用意是希望先进行整除运算还是先进行乘法运算,VBScript会根据优先级设定作出自己的解释,可这种解释并不一定符合我们预先的设想,所以为了程序逻辑清晰起见,建议在容易引起歧义的部分加上合适的括号。例如对于表达式7\3*2,如果我们希望先进行整除运算,则改为(7\3)*2,这个括号是必需的;如果我们希望先进行乘法运算,则改为7\(3*2),在这里的括号则属于解释性的括号。对于优先级设定十分清楚的开发人员而言,完全可以不必加上解释性括号,但是我们还是建议加上解释性括号,这可以增强程序的可读性和易维护性,也是一种良好的编程风格。