VB程序调用中的形参和实参问题

来源:百度知道 编辑:UC知道 时间:2024/06/13 22:35:13
private sub form_click()
for k=1 to 2
call suba(k,s)
s=s+k
next k
end sub
sub suba(k,s)
k=k*k+1
s=6
end sub

运行后结果等于8 3
怎么得出这个结果的?
请高手解答。

在讨论形参和实参之前,先了解下For的机制。

以下句为例,
For i = min to max step t
'...
Next i

对于循环变量i,每一次next i后,先执行一次i=i+t,接着判断i>=max,若为真则继续执行循环体,否则跳出。

好了,接下来说形参、实参的问题。

在sub suba(k,s) 过程,没有ByVal关键字,则默认为ByRef,即以传址的方式运行过程(过程中k和s值的改变会影响到窗体点击事件中的k和s的值)。

for k=1 to 2
call suba(k,s)
s=s+k
next k

循环开始:k=1,s=0
运行过程:k=1*1+1=2,s=6
退出过程:k=2,s=6+2=8
next k:k=2+1=3,s=8
判断:k=3>2,退出循环。

于是,最后k=3,s=8

过程中的k和s为形参,窗体点击事件中的k和s为实参。

以ByRef(传址)方式运行过程,形参的改变即为实参的改变。

1、suba(k,s)中的k,s是形参;

2、call suba(k,s) 时的参数k,s是实参

1、2中的k,s意义是不一样的。

3、现在我们看看运行过程

当k=1时,call suba(1,s)返回s=6,s=s+k后 s=7

当k=2时,call suba(2,s)返回s=6,s=s+k后 s=8

suba 被调用了一次,
默认是地址传递,所以值发生改变。
第一次K进去是1然后K编程了2,S变成了6结束调用,
这个时候事件过程里面的S=S+K
S就等于8
接着执行NEXT k 这个时候K变成了3
不循环。然后结束执行。

private sub form_click()
for k=1 to 2