在VB6中,布尔值False和True的整数值分别为0和-1。

11

我正在处理一些旧的VB6代码,它是这样的...

Dim STATUS As Integer

STATUS = -1

If (Not STATUS) Then
' do something
Else
' do something else
End If

我自然而然地想知道这段代码的哪个分支被执行。所以,有人知道在VB6中True和False的数值是什么吗?


1
真正的问题是为什么原始代码一开始没有使用“布尔值”? - Cody Gray
@Cody Gray,这确实是一个好问题。 - Brian Hooper
1
@Cody,@Brian 如果代码非常老,可能早于语言中引入“Boolean”的时间。据我所知,“Boolean”是在VB4中引入的。 - MarkJ
@MarkJ 你所说的是正确的,但自VB1以来就有名为“True”和“False”的常量可用,因此我认为这只是糟糕的代码。 - Nate Cook
3个回答

13

任何非零值都被视为真 - 为什么 ? (55 = True) 返回 False - onedaywhen
好问题,我也想知道答案 - 有人知道吗? - Cidtek
5
我不完全确定,但在这种情况下,55并没有被转换为布尔值,可能是因为它将55和-1进行比较,结果返回false。如果你创建一个布尔变量并将55赋值给它,然后再进行比较,结果将会是true。 - Unmesh Kondolikar
5
任何非零值在转换为布尔类型(赋值、CBool等)时都会被视为真。 - wqw
@onedaywhen True 被存储为 -1,因此 55 = True 等同于 55 = -1,这是 False - Roland
@Roland:我认为我的原始评论意在表达,仅因为VB6允许人们编写松散类型的代码,并不意味着这样做是个好主意。 - onedaywhen

11
在VB 6中,True具有数值-1。False的数值为0。这是因为Boolean数据类型存储为16位带符号整数。因此,-1在二进制下相当于16个1(1111111111111111)。而False则对应16个0(0000000000000000)。自BASIC发展以来一直保持了这种关系:True = Not False。请注意,HTML标签已被保留。

3
值得注意的是,VB6中的Not始终是算术运算符,没有单独的逻辑Not运算符。由于类型强制转换,您可以像使用逻辑运算符一样在布尔型中使用Not - MarkJ
这些原因在这篇2001年的好文章中有更详细的解释。 - MarkJ

3

虽然不是一个确切的答案,但我尝试在立即窗口中输入了以下内容,并得到了以下结果:

For x = -5 To 5 : ? x, CBool(x), ( x = True ), ( x = False ) : Next x
-5            True          False         False
-4            True          False         False
-3            True          False         False
-2            True          False         False
-1            True          True          False
 0            False         False         True
 1            True          False         False
 2            True          False         False
 3            True          False         False
 4            True          False         False
 5            True          False         False

我测试了更多的值,但只有-1和0有一些“有趣”的结果。其他的结果都是True/False/False。

根据经验,我会说如果您不使用CBool进行类型转换,比较会被算术地执行。为什么?我无法给出确切的答案...


谢谢你。我不知道你可以在立即窗口做这样的事情。你的结果证实了其他两个发帖人所说的话。 - Brian Hooper
在VB.NET中,无法像VB6一样使用即时窗口仍然几乎每天都会让我感到恼火。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接