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
能解释一下吗?
一道VB题计算题
答案:4 悬赏:0
解决时间 2021-03-09 02:22
- 提问者网友:他的思颖
- 2021-03-08 19:58
最佳答案
- 二级知识专家网友:陪我到地狱流浪
- 2021-03-08 21:02
'其实你用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
'有一个很重要的原因,只要是函数内没有定义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
全部回答
- 1楼网友:末路丶一枝花
- 2021-03-09 00:10
true
- 2楼网友:恕我颓废
- 2021-03-08 22:47
这个考核滴是vb滴函数参数是传值还是传地址滴问题以及变量滴有效范围问题。
请参考:
形参的完整的语法格式应该为:
[[Optional][ByVal|ByRef]|ParamArray] <变量名> [()][As <类型>][=<缺省值>]
ByVal表示该参数按值传递,简称值参。此时形参与实参各占一个独立的存储空间,形参的存储空间是调用时才分配的。如果选择值参,则实参与过程体内的运算无关,它仍保留原值。因此,为了保护实参不受过程运算的影响,应选用数值参数。
ByRef表示该参数按地址传递,称为变量参数,简称变参。此时形参与实参共同占用同一个存储空间,而实参的存储空间是调用前就分配了的。如果选择变参,则实参与过程体内的运算有关,形参的改变会影响变参的值。因此,当被调过程需要向调用方传递两个及两个以上的值时,应选用地址传递。由于变参是VB默认的传值方式,所以在此之前,很多地方我们使用的都是变参。
值传递:传递值,传递后形参和变参脱离关系 形参可能变化,但不带给实参,属于“单向传递”。此时,形参一般是变量,实参可以为常数、变量、表达式。调用时为形参分内存。
地址传递:传递地址,形参与实参用的是同一个地址,形参的变化会直接带给实参,属于 “双向传递”。此时,形参、实参一般是变量或数组。
- 3楼网友:悲观垃圾
- 2021-03-08 21:12
这主要考两个点:1)变量的作用范围,x,y是全局变量,各个函数都可用改变其值。2)参数传递方法:byval是传值参数,byref是传址参数,byval a as integer为传值参数,只是给子过程传递一个5的数值,n as integer为传址参数,给子过程传递的是b的地址,所以在子过程中改变b的内存地址数值后,command_click里的b的数值也改变了。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯