Office中国论坛/Access中国论坛

标题: 帮忙看下这个题 [打印本页]

作者: jnne    时间: 2015-9-26 20:24
标题: 帮忙看下这个题
'主程序
sub ab(a,b)
public a
dim b,c
a=5 : b=5 : c=5
do sub1(a,b)
msgbox a,b
end if

'子程序
sub sub1(x,y)
do while y<x
y=y+1
x=x+y
loop
end sub

完。
这个是我老师给我出的题目,把我难倒了。
用高中生的语言跟我解释一下,,,谢谢!


作者: 风中漫步    时间: 2015-9-27 09:25
这个有点难,有请大神闪亮登场

作者: todaynew    时间: 2015-9-27 12:16
存在二义性吧?
作者: jnne    时间: 2015-9-28 12:13
todaynew 发表于 2015-9-27 12:16
存在二义性吧?

什么是二义性?
作者: jnne    时间: 2015-9-28 12:13
解决不了

作者: jnne    时间: 2015-9-29 00:48
'主程序
sub ab(a,b)                  
public a
dim b,c
a=5 : b=5 : c=5
do sub1(a,b)
msgbox a,b
end if

'子程序
sub sub1(x,y)
do while y<x
y=y+1
x=x+y
loop
end sub

老师在今天讲了。
跟大家分享一下
a.b.c各赋一个值5
由主程序将a,b给x,y并在程序运行DO循环,直到b(y)小于a(x),
最后输出a,b

作者: roych    时间: 2015-9-29 17:11
先修正一下。
  1. Sub ab(a, b)
  2. Dim c
  3. a = 5: b = 5: c = 5
  4. Call sub1(a, b)
  5. MsgBox a, b
  6. End Sub

  7. '子程序
  8. Sub sub1(x, y)
  9. Do While y < x
  10. y = y + 1
  11. x = x + y
  12. Loop
  13. End Sub

  14. Sub test()
  15. Call ab(1, 2)
  16. End Sub
复制代码

然后请参考传值过程和传址过程:
http://www.office-cn.net/forum.p ... hlight=%B4%AB%D6%B5
作者: jnne    时间: 2015-9-30 12:29
roych 发表于 2015-9-29 17:11
先修正一下。

然后请参考传值过程和传址过程:

请问:
sub test ()
call ab(1,2)
end sub
什么作用?
Sub ab(a, b)
Dim c
a = 5: b = 5: c = 5
Call sub1(a, b)
MsgBox a, b
End Sub

这个不是已经输出了吗?

作者: roych    时间: 2015-10-1 14:38
jnne 发表于 2015-9-30 12:29
请问:
sub test ()
call ab(1,2)

其实,在这里有几次传递过程的。请结合我的语句来理解:
1、在test里,a,b分别赋值为1和2。
2、然后执行过程ab。这时候a,b重新被赋值为5,5。
3、然后执行子程序sub1(5,5)
4、由于没有符合5<5的情况,因此,这时候会跳出sub1的循环【最好加上语句避免死循环】。
5、执行a,b……这时候的a,b其实已经是x,y了。
默认情况下,VBA是传址过程。如果改为byval来传值的话,a,b传递过去之后,a和b还是不会变的【5,5】。这一点,你可以运行test测试。
  1. Sub ab(ByVal a, ByVal b)
  2. Dim c
  3. a = 5: b = 3: c = 5
  4. Call sub1(a, b)
  5. MsgBox a & ":" & b
  6. End Sub

  7. '子程序
  8. Sub sub1(ByVal x, ByVal y)
  9. Do While y < x
  10. y = y + 1
  11. x = x + y
  12. If x >= 20 Then Exit Do
  13. Loop
  14. MsgBox x & ":" & y
  15. End Sub

  16. Sub test()
  17. Call ab(1, 2)
  18. End Sub
复制代码
对比代码:

  1. Sub ab(ByRef a, ByRef b)
  2. Dim c
  3. a = 5: b = 3: c = 5
  4. Call sub1(a, b)
  5. MsgBox a & ":" & b
  6. End Sub

  7. '子程序
  8. Sub sub1(ByRef x, ByRef y)
  9. Do While y < x
  10. y = y + 1
  11. x = x + y
  12. If x >= 20 Then Exit Do
  13. Loop
  14. MsgBox x & ":" & y
  15. End Sub

  16. Sub test()
  17. Call ab(1, 2)
  18. End Sub
复制代码



作者: jnne    时间: 2015-10-2 13:50
roych 发表于 2015-10-1 14:38
其实,在这里有几次传递过程的。请结合我的语句来理解:
1、在test里,a,b分别赋值为1和2。
2、然后执 ...

谢谢,懂了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3