首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(而不是1)由于某种原因而评估为-2。

(而不是1)由于某种原因而评估为-2。
EN

Stack Overflow用户
提问于 2019-03-07 17:14:24
回答 3查看 68关注 0票数 3

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-07 17:40:25

VBA/VBScript没有真正的逻辑运算符(和,OR,NOT)。你看到的逻辑运算符实际上是位运算符,这就是你所得到的全部。VBA会玩一些TrueFalse值的游戏,所以大部分时间都是这样的,但偶尔你会发现“抓到了”。

在这种情况下,您必须编写If Not InStr() Then而不是If InStr() <= 0 Then

而不是If InStr() Then,您必须编写If InStr() > 0 Then

换句话说:InStr()返回一个数字。不要把它当作布尔人来对待。

票数 3
EN

Stack Overflow用户

发布于 2019-03-07 17:40:58

1不是True的整数表示,-1是。

代码语言:javascript
运行
复制
Debug.Print CInt(True) 'prints -1
Debug.Print CInt(False) 'prints 0

布尔运算符(NotAndOrXOr)在操作数为布尔值时表现为“逻辑运算符”。当他们不是,他们表现为“位运算符”,但事实是,他们总是按位。

整数值1转换为布尔值True,因为True被定义为Not False,这意味着任何非零值都是布尔True。但是,只有在将-1用于True时才会得到正确/预期的逻辑行为。

Integer由16位表示,所以1是这样的:

代码语言:javascript
运行
复制
0000 0000 0000 0001

这使得Not 1这样:

代码语言:javascript
运行
复制
1111 1111 1111 1110

符号位是开的,所以值是负值-修剪不重要的数字,然后得到:

代码语言:javascript
运行
复制
10

这是2的二进制表示。因此,Not 1-2

相反,-1将是:

代码语言:javascript
运行
复制
1111 1111 1111 1111

因此,Not -1是:

代码语言:javascript
运行
复制
0000 0000 0000 0000
票数 5
EN

Stack Overflow用户

发布于 2019-03-07 18:01:49

由于其他的答案已经解释了为什么,我想集中于编码实践。

正如您所发现的,Not x并不一定是您想要的。实际上,您需要更多类似Not CBool(x)的内容。但是,CBool()可以抛出错误-例如,CBool(Null)会产生错误91 (无效使用null)。

可以说,您可以通过强键入变量来避免这种情况,但即使不使用Variant也不能保证表达式中的Boolean将保持Boolean。示例:

代码语言:javascript
运行
复制
?typename(true and 0)
Integer

实际上,不小心允许VBA为您进行巫毒隐式转换太容易了,因此,由于这个原因,改变编码习惯可能更适合您。

为了测试真实值,您需要如下表达式:

If x Then

对于虚假的值,您需要的表达式如下:

If x = False Then

不管x的类型如何,无论它是一个表达式还是非表达式,这些都可以工作,因此,与If x = True ThenIf Not x Then相比,它的行为更一致/更可预测。通过采用这种代码习惯,您可以帮助避免创建因意外转换而产生的细微错误,而不是从Boolean类型中获得按位操作,而不是逻辑操作。

对于赋值,使用Boolean变量可以确保它始终被强迫进入TrueFalse,而不是一些随机数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55049440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档