vba中的隐式类型转换规则是什么?
我知道在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,
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->字符串转换是否记录在案?顺便说一句,谢谢你的努力。