VB参数传递问题

来源:百度知道 编辑:UC知道 时间:2024/05/03 09:47:23
Private Sub Form_Click()
Dim x As Integer, y As Integer, z As Integer
x = 1: y = 2: z = 3
Call sub1(x, y, y)
Print x,y,z
End Sub
Private Sub sub1(x As Integer, y As Integer, ByVal z As Integer)
Dim I As Integer
x = 3 * z: y = 2 * z: z = x + y
Print x, y, z
End Sub

运行结果为
6 4 10

6 4 3

根据辨别流程图知道X Y为按地址传递,Z为按值传递
实参 X=1 Y=2 按地址传给sub1来计算 岂不是X=3*Z --》 1=3*Z
Y=2*Z --》 2=2*Z
何故 X=6 Y=4 这样Z应该是 Z=2 那么Z=2是怎么来的呢 谁能告诉我 坐电脑前看了老半天没弄懂来 哪个朋友帮帮忙解释下我知道呀 快崩溃了
谢谢一楼三楼的朋友,现在能理解 得出来的数字了
那个 SUB1 挨CALL调用时 是不是就说 整个Private Sub sub1(x As Integer, y As Integer, ByVal z As Integer)
Dim I As Integer
x = 3 * z: y = 2 * z: z = x + y
Print x, y, z
执行完 既print x,y,z 6 4 10 后 才轮到Private Sub Form_Click()
Dim x

给你解释下址传递和值传递

地址传递:就是把一个内存地址内的数据分别给多个变量使用.
就相当于一个人有两个名字(比如这人叫"A","B"),那么我叫A和叫B的结果都是一个样也就是我叫的都是同一个人,只是我的叫法不一样了,那么假如我说原来A有1个苹果,我给了B2个苹果,那么结果问A现在有几个苹果.因为A和B是同一个人,我给A和给B都是达到了同样的目的,那么答案肯定是3个当然结论就是"只要其中一个有了变化,那么另一个也随之变化.

数值传递:
数值传递则没有这样共用一个内存地址.他只是把形参的数据复制给实参,他们分别用了两个地址存放数据.同样用A和B来举例.A有1个苹果,现在我让B等于A(注意我是复制,而不是说现在B也是A),然后我在给B 2个苹果,那么现在A还是有1个苹果,而B有3个.因为我给的是不同的两个人所以后面的人和前面的互不影响.

再来看你的这题
先说明因为你这个程序里的XYZ没有定义为过程级以上的变量,所以两个过程中的XYZ若不经过传递是不会当作一个的,他们互相不干涉.为方便理解行参一律用了X1,Y1,Z1 实参一律用 X2,Y2,Z2.

根据辨别流程图知道X Y为按地址传递,Z为按值传递.
Call sub1(x, y, y) 调用了SUB1过程X1=X2=1,Y1=Y2=2,Z2=Y1=2 前面X1为形参,X2为实参,前面Y1为形参,Y2为实参.
因为过程中的X2Y2是地址传递,也就是说他和形参中的XY相当于同一个人2个名字.过程中的Z2是数值传递,只是把行惨Y1的数据复制给实参Z2. 也就是说X1Y1改变他会导致形参X1Y1变化,而实参Z2的改变不会引起形参Y1变化.
那么过程中:x = 3 * z: y = 2 * z: z = x + y
就是 X=3*2,Y=2*2,Z=X+Y Print 为 X=6,Y=4,Z=10
(注意此时因为实参XY为6和4,所以退出过程后X和Y仍然是X=6,Y=4)

退出过程后的 Print x,y,z
因为Z在程序运行过程中始终没有用到过,SU