那位大侠帮解答一下,传址方式,传值方式的问题
<%
dim c
sub addone(byval n) '参数将以传值方式来传递
n=n+2
response.write"子程序体内输出的c的值为: "&c&"<br>"
end sub
c=5
response.write("执行子程序前的C的值为: "&c&"<br>")
addone c
response.write("执行子程序后的c的值为: "&c&"<br>")
%>
显示的结果是:
执行子程序前的C的值为: 5
子程序体内输出的c的值为: 5
执行子程序后的c的值为: 5
<%
dim c
sub addone(byref n) '参数将以传址方式来传递
n=n+2
response.write"子程序体内输出的c的值为: "&c&"<br>"
end sub
c=5
response.write("执行子程序前的C的值为: "&c&"<br>")
addone c
response.write("执行子程序后的c的值为: "&c&"<br>")
%>
显示的结果:
执行子程序前的C的值为: 5
子程序体内输出的c的值为: 7
执行子程序后的c的值为: 7
谁能告诉我,这两个程序的工作过程.具体一点
参考答案:这是一个关于值传递和地址传递的问题,是程序编译器中的常见问题。
首先说一下参数传递的方式,一般有5种方法(上学时候学的,现在只记得4种了)分别是 值传递、地址传递、值地址传递、名字传递、还有一个忘了。
参数传递的方法是将数值存放到寄存器中,然后再通过调用寄存器来改变参数。值传递是不管寄存器的地址,只对数值做修改。
所以值传递是只传数值,但是主程序中的数值不随子程序变化而变化。
{
子程序:
a=1,b=2;
}
{
主程序:
a=2,b=2;
call 子程序();
n=a+b;
}
结果n=4
地址传递是将数值所在的寄存器的地址记录下来,子程序对地址进行修改,从而改变主程序中的数值。
在你的程序中,byval是借用value方法出的数据,所以子程序中修改的数据仍然存放在原来的位置,而主程序调用子程序时候是寻找子程序中参数所在的寄存器,值传递不改变寄存器的地址,所以主程序取不到想要得到的值。
byref是借用ruffer,是通过缓冲区调用子程序中n的所在寄存器的地址,然后把这个地址中的数值引入到主程序中进行计算,所以地址传递改变主程序结果。地址传递可以想象成一个堆栈,n是栈中的数值,而主程序取出来的n所在栈的地址,把这个地址告诉主程序的命令,从这个地址中取需要计算c的数值,然后再进行计算。
可能表达也不很清楚,如果想多了解一些这方面的东西的话可以找一些关于编译原理方面的书,简而言之记住一点,值传递是保护主程序数据不被随意修改的方法,所以不可能改变主程序的结果,如果要修改主程序的结果,必须用地址传递。