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

时间:2017-10-04 12:37:57

标签: vba type-conversion coercion type-coercion

我知道在vba中可以使用以下内容:

If Len(str) Then
如果Len(str)false

Len(str)将评估为0,否则为true

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

2 个答案:

答案 0 :(得分:2)

一个 boolean 变量只能有两种状态,TrueFalse。在所有编程语言中都是如此(除非存在可以为 null 的数据类型,例如 C# 中的 bool?,其中变量也可以具有值 null,表示它未定义)。

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

隐式转换规则很简单:数字数据类型如果为 0 则转换为布尔值 False,在所有其他情况下转换为 True(即,如果值具有 any< /em> 位设置为 1)。将布尔值转换为数字会导致 0 resp。 -1.

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 年的编程经验)来看,隐式转换是邪恶的,应该避免。它们是无数错误的根源,它们导致代码更难阅读——而且根本没有理由依赖隐式对话。没有理由写If len(str) Then。你想检查一个字符串的长度是否大于 0,所以写它:If len(str) > 0 Then。总是。

看看下面的例子:显然,VBA运行时需要执行一个隐式转换,但你能说出结果吗?

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

您可以在此处找到 Microsoft 的官方文档:https://docs.microsoft.com/en-US/office/vba/language/reference/user-interface-help/boolean-data-type

答案 1 :(得分:-2)

我在最近阅读的一本关于 C++ 的教科书中遇到了这个问题——我会在最后添加一个链接。虽然是不同的语言,但两者在某种程度上有相似之处。这些相似之处之一就是您所说的“隐式类型转换”,或者更确切地说,是类型转换。

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

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

  1. Operator precedence
  2. Boolean data type

在 C++ 中(据我所知)这个术语称为复制初始化,您可以在这里阅读更多内容:

  1. Copy initialization

最近带来这种深刻思考的书:

Problem Solving with C++: The Object of Programming

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