vba中的隐式类型转换规则是什么?

vba中的隐式类型转换规则是什么?,vba,type-conversion,coercion,type-coercion,Vba,Type Conversion,Coercion,Type Coercion,我知道在vba中可以实现以下功能: If Len(str) Then Len(str)如果Len(str)为0,true则将计算为false vba的确切转换规则是什么?如果可能的话,请提供一个官方文档链接。 < P>我在最近阅读的C++教程中遇到了这个问题,我会在结尾添加一个链接。虽然语言不同,但两者在某种程度上有相似之处。这些相似之处之一就是所谓的“隐式类型转换”,或者更严格地说是类型转换 对于编译VBA项目(调试>编译VBA项目)时项目中的任何布尔表达式,任何非零值都将被视为值true,

我知道在vba中可以实现以下功能:

If Len(str) Then
Len(str)
如果
Len(str)
0
true
则将计算为
false


vba的确切转换规则是什么?如果可能的话,请提供一个官方文档链接。

< P>我在最近阅读的C++教程中遇到了这个问题,我会在结尾添加一个链接。虽然语言不同,但两者在某种程度上有相似之处。这些相似之处之一就是所谓的“隐式类型转换”,或者更严格地说是类型转换

对于编译VBA项目(调试>编译VBA项目)时项目中的任何布尔表达式,任何非零值都将被视为值
true
,并将值0视为
false
。本质上,这取决于编译器如何处理这些状态项,以及运算符优先级规则和布尔表达式规则

如需进一步阅读,请参阅以下链接:

  • 在C++中(据我所知),这个术语叫做复制初始化,在这里你可以读到更多:

  • 最近引起这种深刻思考的书:


    我知道这不一定能回答你的问题,但希望一些参考资料能有所帮助。

    布尔变量只能有两种状态,
    True
    False
    。这在所有编程语言中都是正确的(除非存在可为null的数据类型,例如C语言中的
    bool?
    ,其中变量也可以有值
    null
    表示未定义)

    在VBA中,布尔值存储为16位整数
    False
    定义为0,而
    True
    定义为-1。这在其他语言中是类似的,只是因为0的所有位都设置为0,-1的所有位都设置为1。但这是一个实现细节,您的编程不应该关心它。使用
    而不是
    处理
    True
    False
    以及布尔代数

    隐式转换规则是直截了当的:如果数值数据类型为0,则将其转换为布尔值
    False
    ,在所有其他情况下(即,如果该值的任何位设置为1),则将其转换为
    True
    。将布尔值转换为数字将导致0 resp-一,

    Dim i As Integer
    Dim b As Boolean    
    i = 3
    b = i   ' Implicit conversion from 3 to TRUE
    i = b   ' Implicit conversion from TRUE to -1
    
    首先将字符串转换为数字,如果转换失败,则会出现运行时错误。在VBA中,日期被实现为数字(双精度),因此每个日期/时间都是
    True
    ,除了表示为0的日期+时间(即1899年12月30日00:00)

    但从我的观点(以及>30年的编程经验)来看,隐式转换是邪恶的,应该避免。它们是许多错误的根源,它们导致代码更难阅读——而且根本没有理由依赖于隐式对话。没有理由写
    如果len(str)那么
    。如果要检查字符串的长度是否大于0,请将其写入:
    如果len(str)>0,则
    。总是

    看看下面的例子:显然,VBA运行时需要执行隐式转换,但是您能告诉结果吗

    Dim i As Integer
    Dim b As Boolean  
    i = 3
    b = i
    If b = i Then Debug.Print "B=I"
    


    您可以在这里找到Microsoft的官方文档:

    Len()
    返回整数值,而不是布尔值。是的,
    False
    在VBA中是零,但以这种方式编码并不好。请小心,您的链接指向的是VB.Net,而不是VBA@FunThomas谢谢你指出这点。@Dean没有人对我的“赏金”给出很好的回答。FunThomas和GSerg将title的主题缩小到了最简单、有充分记录的案例。就连《问题》的作者罗兰也写道,“问题涉及任何两种类型”。但我必须选择奖励的答案。你的答案也不太好,但你链接了一些非常有趣的非主题链接,赏金是你的。布尔变量只能有两种状态。。。实现细节和您的编程不应该关心它,除非您。@GSerg:Good catch-不知道它。坦率地说,这似乎是VBA中的一个错误(我通常不会那么快地说出这样的语句),因为该示例中的结果会将
    1
    写入布尔变量,这与它的定义相反。如果取消,InputBox将返回False:。那么,从点击InputBox上的Cancel返回“Falsch”字符串的途径是什么呢?区域设置是如何参与这一荒谬的结果或/和铸造的?BoolLong强制转换在这里非常明显,但是像False=“False”这样的Bool字符串和给定的“Falsch”大小写呢?InputBox返回布尔值(False)或包含输入内容的字符串时出现问题。将结果读入变量并检查VarType(请参阅接受的答案),以便您可以区分取消和输入类似“0”的内容。这避免了从布尔值到字符串的隐式转换。我知道这种情况下的解决方案。我只是在问,怎么会被假铸成串“Falsch”,这对我来说很奇怪。。。Bool->字符串转换是否记录在案?顺便说一句,谢谢你的努力。