中易网

一道VB题计算题

答案:4  悬赏:0  
解决时间 2021-03-09 02:22
Dim x As Integer, y As Integer
Private Sub Command1_Click()
Dim a As Integer, b As Integer
a = 5
b = 3
Call sub1(a, b)
Print a, b
Print x, y
End Sub
Private Sub sub1(ByVal m As Integer, n As Integer)
Dim y As Integer
x = m + n
y = m - n
m = fun1(x, y)
n = fun1(y, x)
End Sub
Private Function fun1(a As Integer, b As Integer) As Integer
x = a + b
y = a - b
Print x, y
fun1 = x + y
End Function
为什么打出来的是
10 8
12 -10
5 2
12 -10
能解释一下吗?
最佳答案
'其实你用F8逐行调试,然后随时看各个字母当时的值,就知道原因了。
'有一个很重要的原因,只要是函数内没有定义x和y的,都是用全局变量的值,只有sub1里自己有定义y,用的是函数内的值。
'另一个重要原因是Private Sub sub1(ByVal m As Integer, n As Integer)中的ByVal,ByVal 按值传递(a),意思是传入的形式参数改变了,但是不影响实际参数的数值,默认是地址传递
Dim x As Integer, y As Integer
Private Sub Command1_Click()
    Dim a As Integer, b As Integer
    a = 5
    b = 3
    Call sub1(a, b)'Call sub1(5, 3)
    Print a, b'a因为是ByVal按值传递的,所以没变,b是默认的,所以随着n=2
    Print x, y
End Sub
Private Sub sub1(ByVal m As Integer, n As Integer)‘m=5,n=3
    Dim y As Integer
    x = m + n'x=5+3=8
    y = m - n'y=5-3=2
    m = fun1(x, y)'fun1函数会用到两次,我们用A和B表示,A:fun1(8, 2) 得出:m=18
    n = fun1(y, x)'经过fun1函数后,x=10,y不变,还是用函数内的值y=2,那么B:fun1(2, 10) 得出:n=2
End Sub
Private Function fun1(a As Integer, b As Integer) As Integer'A:fun1(8, 2)  B:fun1(2, 10)
    x = a + b'A:x=8+2=10,这时候a因为代入的是x(全局变量)的值,所以也a=10,b不变,b=2     同理,B:x=2+10=12,b=12,a=2
    y = a - b'A:y=10-2=8  同理,B:y=2-12=-10
    Print x, y'A:打印10  8     B:打印12  -10
    fun1 = x + y'A:fun1=10+8=18     B:fun1=12+(-10)=2
End Function
全部回答
true
这个考核滴是vb滴函数参数是传值还是传地址滴问题以及变量滴有效范围问题。 请参考: 形参的完整的语法格式应该为: [[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>] ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个独立的存储空间,形参的存储空间是调用时才分配的。如果选择值参,则实参与过程体内的运算无关,它仍保留原值。因此,为了保护实参不受过程运算的影响,应选用数值参数。 ByRef表示该参数按地址传递,称为变量参数,简称变参。此时形参与实参共同占用同一个存储空间,而实参的存储空间是调用前就分配了的。如果选择变参,则实参与过程体内的运算有关,形参的改变会影响变参的值。因此,当被调过程需要向调用方传递两个及两个以上的值时,应选用地址传递。由于变参是VB默认的传值方式,所以在此之前,很多地方我们使用的都是变参。 值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。 地址传递:传递地址,形参与实参用的是同一个地址,形参的变化会直接带给实参,属于 “双向传递”。此时,形参、实参一般是变量或数组。
这主要考两个点:1)变量的作用范围,x,y是全局变量,各个函数都可用改变其值。2)参数传递方法:byval是传值参数,byref是传址参数,byval a as integer为传值参数,只是给子过程传递一个5的数值,n as integer为传址参数,给子过程传递的是b的地址,所以在子过程中改变b的内存地址数值后,command_click里的b的数值也改变了。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
美言涛专业烫染护这个地址在什么地方,我要处
离骚与诗经两首,二者有何异同
宝马x6涡轮增压电磁阀损坏一般报什么故障码
本人DNF号第4次被封,已经审核2天多了还没审核
黑的纹身时间长了会掉么
合鑫五金电器商行地址有知道的么?有点事想过
怎么看诺基亚8900e是正品的,还是台版的 ??
LoveFetish4游戏安装问题
恳志的意思是什么?恳志的释义是什么啊?
新福龙幼儿园我想知道这个在什么地方
亿嘉超市地址在什么地方,想过去办事
迎河一路/X302(路口)我想知道这个在什么地方
苹果螺怎么区分雌雄? 网上说有是同体的 也有
你好,请问你知道言情小说吧编辑的Q号吗?知
浙江嵊州哪有夹胶玻璃加工
推荐资讯
现在有什么牌子的女士香烟?
西安雁塔区白沙路从西郊客运站乘几路车
那里有字画装饰广场
什么是器官的“实质”、“间质”?
怎么快速打开win7电脑的计算器
文章从那两个方面写闻一多先生的说和做?把两
一年出两次险,第二年平安要交多少钱
闪电侠 第四集 最后和冷冻队长对话的是谁
德国有fresh这个专柜吗
天津上村电子有限公司地址有知道的么?有点事
tcl液晶50寸l50f3800多少钱
求楼盘的电话销售说辞!简短精悍!
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?