11

考虑以下两个涉及 VBScript 中按位比较的条件:

If     1 And 3  Then WScript.Echo "yes" Else WScript.Echo "no"
If Not(1 And 3) Then WScript.Echo "yes" Else WScript.Echo "no"

我认为输出应该是:

yes
no

但实际输出是:

yes
yes

等一下,运算Not符应该对表达式执行逻辑否定。据我所知, trueis的逻辑否定。false我必须断定它没有兑现承诺吗?这里发生了什么、为什么以及发生了什么?如果有的话,理由是什么?

4

2 回答 2

15

如果两个操作数都是布尔值(True、False) ,则VBScript AND 运算符执行逻辑AND 运算——有点像 C(风格)语言&&运算符。

如果两个操作数都是数字,它将改为执行按位与运算——有点像 C 语言&运算符。

如果操作数是混合类型,则布尔值被强制转换为数字 - False = 0,True = -1(惊喜!),然后是按位与运算。

因此,您的示例评估如下:

'   1 And 3
' = &h0001 And &h0003 <- bitwise AND
' = 1
If 1 Then WScript.Echo "yes" Else WScript.Echo "no" ' Yes

'   Not(1 And 3)
' = Not(1) <- see above
' = Not(&h0001) <- bitwise NOT
' = &hFFFE
If -2 Then WScript.Echo "yes" Else WScript.Echo "no" ' Yes

如果您想知道VBScript NOT 运算符是如何工作的,它会像 C 语言运算符一样对布尔操作数执行逻辑否定,对像 C 语言!运算符这样的数字操作数执行按位补码~

如果您想对操作数强制进行逻辑运算,请使用VBScript CBool​​ 函数来强制转换操作数:

If Not(CBool(1) And CBool(3)) Then WScript.Echo "yes" Else WScript.Echo "no" ' no

注意:与大多数 VBScript 运算符一样,Null操作数会导致运算符返回Null. 在构造Null中使用时以不寻常的方式表现。If

于 2012-06-03T20:16:38.083 回答
6

我在Eric Lippert 的博客上找到了我的问题的答案: Not Logical Is VBScript。事实证明,Not操作符和它的兄弟们一样,实际上并不是一个布尔操作符

And, Or,NotXor在 MSDN 上的逻辑运算符下归档。

但是 Eric Lippert 将它们标记为bitwise,这是一个比MSDN 上的逻辑更好的描述,因为逻辑并没有说明它们实际上是如何工作的,所以像我这样的人会误以为它们是布尔运算符,他们'不是。这是一个重大的陷阱。

为了让他们做我想做的事,我必须重写我的陈述如下:

If     (1 And 3) > 0  Then WScript.Echo "yes" Else WScript.Echo "no"
If Not((1 And 3) > 0) Then WScript.Echo "yes" Else WScript.Echo "no"

这会打印yes,然后no按应有的方式打印。

更新:虽然上述方法似乎适用于这种情况,但这绝对不是要走的路。问题在于理解我想要检查的是什么。上面的代码没有说清楚。对结果进行大于 0 的按位比较和数值比较不等同于布尔检查。

考虑下面的代码,它采用了 Salman A 的CBool建议作为这个问题的最终解决方案:

Option Explicit
Dim a, b
a = -3 : b = -2

If  a And b       Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If (a And b) > 0  Then WScript.Echo "ja" Else WScript.Echo "nein" ' bad
If CBool(a And b) Then WScript.Echo "ja" Else WScript.Echo "nein" ' good
于 2012-06-03T16:36:55.533 回答