Lum*_*umi 9 vbscript boolean bit-manipulation
考虑以下两个涉及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"
Run Code Online (Sandbox Code Playgroud)
我认为输出应该是:
yes
no
Run Code Online (Sandbox Code Playgroud)
但实际输出是:
yes
yes
Run Code Online (Sandbox Code Playgroud)
等待一秒钟,所述Not操作者应该在的表达式执行逻辑非.据我所知,逻辑否定true是false.我必须得出结论认为它不符合这一承诺吗?怎么样,为什么以及这里发生了什么?理由是什么,如果有的话?
Sal*_*n A 14
在VBScript和运营商进行逻辑与操作,如果两个操作数都是布尔(真,假) -有点像C(风格)的语言&&操作.
如果两个操作数都是数字,则它将执行按位 AND运算 - 有点像C语言&运算符.
如果操作数是混合类型,那么布尔值将转换为数字 - False = 0,True = -1(惊讶!),然后是按位AND运算.
所以你的例子评估如下:
' 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
Run Code Online (Sandbox Code Playgroud)
如果您想知道VBScript NOT运算符是如何工作的,它会对类似C语言!运算符的布尔操作数执行逻辑否定,对像C语言运算符这样的数字操作数执行按位补码~.
如果要强制对操作数进行逻辑运算,请使用VBScript CBool函数来转换操作数:
If Not(CBool(1) And CBool(3)) Then WScript.Echo "yes" Else WScript.Echo "no" ' no
Run Code Online (Sandbox Code Playgroud)
注意:与大多数VBScript运算符一样,Null操作数会导致运算符返回Null.Null在If构造中使用时以不寻常的方式运行.
我在Eric Lippert的博客上找到了我的问题的答案:Not Logical是VBScript.事实证明,Not运营商与其兄弟一样,实际上并不是一个布尔运算符.
And,Or,Not和Xor正在申请逻辑运算符 MSDN上.
但埃里克利珀标签他们为按位,而这不仅仅是一个更好的描述逻辑为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"
Run Code Online (Sandbox Code Playgroud)
这打印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
Run Code Online (Sandbox Code Playgroud)