执行过程
a1=1:b1=2:c1=3
call test(a1,b1+3,(c1))
vb 中所有函数都默认为按值传,就是这个值的内存地址
例如上面的调用 当你在参数内参加计算时 代码编译时 会给你分开的 先把参数内的计算式子计算后,再传给函数
计算机会给你分解成
计算 c1 -> b1+3
计算后的值都应该在堆栈里
再按值传递时,其实就计算后的堆栈的地址 ,明白这点下面就好说了
test(a1,5,3)
p=p+1 '会修改传进来的 a1 的值 a1=2 : p=2
m=m+1 '按值修改 m 的地址 的值也会变 m=6 因为是新地址 b1 地址没有传过来不会改变
n=n+1 同上 一个括号也是运算符,只要参加运算,都会开辟新的内存 n=4
Print " sub:" p,m,n ' 2,6,4
上面可以看到 只有 a1 变了
Print " main:" a1,b1,c1' 2,2,3
传址会把变量的内存地址传递到sub里,在sub里对变量所做的修改就是对原来的变量进行修改,而传值只是把变量的值传递到sub里,此时在sub里修改变量的值不会影响原来的变量。
在vb中调用函数默认是传址(byref),你可以在函数的参数前加byval使用传值方式。
Private Sub test(a, ByRef b, ByVal c)
a和b都是传址,c是传值
题中 a1被传址 所以a1=a1+1=2 b1未传址 而是传的数值 b1+3 所以main里的b1不变=2 c1加括号相当于传值 所以c1不变=3
如果你在函数的pmn前面都加上byval 结果就是264 123
其实这个问题就相当于按年龄发钱
a1是自己去的,所以最后a1=a1+1=2
b1是找了个比自己大三岁的人去的,所以b1自己什么也没得到
c1是找了个和自己一样大的人去的,所以c1自己也什么都没得到
sub里面却是
我不管来的是谁,只是按年龄发钱
第一个1岁,给她一块
第二个5岁,给一块
第三个3岁,给一块
咳咳,估计你也不怎么明白,看多了就知道了.........
-------VB的英文词义让人蛋疼---所以我不会--