为什么(而不是1)评估as -2?我希望它能被计算为0。

发布于 2019-03-07 17:40:25
VBA/VBScript没有真正的逻辑运算符(和,OR,NOT)。你看到的逻辑运算符实际上是位运算符,这就是你所得到的全部。VBA会玩一些True和False值的游戏,所以大部分时间都是这样的,但偶尔你会发现“抓到了”。
在这种情况下,您必须编写If Not InStr() Then而不是If InStr() <= 0 Then。
而不是If InStr() Then,您必须编写If InStr() > 0 Then
换句话说:InStr()返回一个数字。不要把它当作布尔人来对待。
发布于 2019-03-07 17:40:58
1不是True的整数表示,-1是。
Debug.Print CInt(True) 'prints -1
Debug.Print CInt(False) 'prints 0布尔运算符(Not、And、Or、XOr)在操作数为布尔值时表现为“逻辑运算符”。当他们不是,他们表现为“位运算符”,但事实是,他们总是按位。
整数值1转换为布尔值True,因为True被定义为Not False,这意味着任何非零值都是布尔True。但是,只有在将-1用于True时才会得到正确/预期的逻辑行为。
Integer由16位表示,所以1是这样的:
0000 0000 0000 0001这使得Not 1这样:
1111 1111 1111 1110符号位是开的,所以值是负值-修剪不重要的数字,然后得到:
10这是2的二进制表示。因此,Not 1是-2。
相反,-1将是:
1111 1111 1111 1111因此,Not -1是:
0000 0000 0000 0000发布于 2019-03-07 18:01:49
由于其他的答案已经解释了为什么,我想集中于编码实践。
正如您所发现的,Not x并不一定是您想要的。实际上,您需要更多类似Not CBool(x)的内容。但是,CBool()可以抛出错误-例如,CBool(Null)会产生错误91 (无效使用null)。
可以说,您可以通过强键入变量来避免这种情况,但即使不使用Variant也不能保证表达式中的Boolean将保持Boolean。示例:
?typename(true and 0)
Integer实际上,不小心允许VBA为您进行巫毒隐式转换太容易了,因此,由于这个原因,改变编码习惯可能更适合您。
为了测试真实值,您需要如下表达式:
If x Then
对于虚假的值,您需要的表达式如下:
If x = False Then
不管x的类型如何,无论它是一个表达式还是非表达式,这些都可以工作,因此,与If x = True Then或If Not x Then相比,它的行为更一致/更可预测。通过采用这种代码习惯,您可以帮助避免创建因意外转换而产生的细微错误,而不是从Boolean类型中获得按位操作,而不是逻辑操作。
对于赋值,使用Boolean变量可以确保它始终被强迫进入True或False,而不是一些随机数。
https://stackoverflow.com/questions/55049440
复制相似问题