1

我已经使用 VB6 多年了,但我遇到了一些相当奇怪的事情,我自己无法确认这个结果。所以我想知道以下代码的输出是否会是

7

7

或者

7

6

这是代码:

Option Explicit

Private Sub cmdOk_Click()
Dim V As Integer
V = 6
Call AddV(V)
Print V

End Sub

Sub AddV(ByRef P As Integer)
P = P + 1
Print P

End Sub

在我的系统(Windows XP + VB6)上,这可以按预期工作。所以我得到了第一个输出。但是,我在 Windows 7 + VB6 上看到过相同的程序,并且输出不一样。

有人可以解释为什么会这样吗?但是,同样的事情在 VB 2008 + Windows 7 上运行得很好。我认为按值调用和按引用调用是任何语言/操作系统中的标准参数传递技术。

谢谢!

编辑: cmdOK 是一个命令按钮。

4

1 回答 1

4
V = 6
Call AddV(V)

您不会使用此代码观察到这种行为。这也与 Windows 版本无关,它与 VB6 代码执行无关。但是,对于您的观察,有一个简单的解释。您的代码可能如下所示:

V = 6
AddV (V)

换句话说,没有Call关键字。现在在 VB6 中发生了一些非常可怕的事情。括号不再意味着同样的事情。只有在调用函数时才使用括号来调用 Sub。相反,它们成为表达式的一部分,就像你在写作时使用的括号一样Print 4 * (5 + 6)。它生成V 值的副本。被调用的过程更新该副本,它不再影响 V 变量的值。

虽然这是故意的,但该功能是一个主要的错误工厂,并没有被带到 VB.NET 中。现在,括号在过程调用中的含义始终相同,无论被调用的过程是 Sub 还是 Function,都可以使用括号。

于 2013-07-03T18:20:16.353 回答