程序设计 call by value ,call by address ,call by name 假设有一段code内容大致如下:----------------------------------MAIN()BEGINA[1:4]={1,2,3,4};X = 1;Y = 2;CALL SUB(X,Y,A[X]);ENDSUB(A,B,C)BEGINA = B;C = 12;END-------------------------

来源:学生作业帮助网 编辑:作业帮 时间:2024/06/11 12:59:39
程序设计 call by value ,call by address ,call by name 假设有一段code内容大致如下:----------------------------------MAIN()BEGINA[1:4]={1,2,3,4};X = 1;Y = 2;CALL SUB(X,Y,A[X]);ENDSUB(A,B,C)BEGINA = B;C = 12;END-------------------------
xU]O"W+sݫ6`7&[o&+kM +U>7 Z)v`vAys`u6,Ùwy}n7\׵?j?׿hd|^[ۊloO o#JbewkHAY'/jf>2lif6gKOr<ۻWw1Y&Yӥυ!@dq]E?Xrk?/t8M!r y*pQ!$$vNPM=А:fnlVVm>ܵ{oX]jvi3̲Z %+^^>Č]L2p)Әə7jdv 7߿+:]:g**Rmd (창6D-jǏ-0:?E']@ kPx'&G n4T'PW|PjQb!?}OSb'u&s*l3EV'e_A5T5d LCuf`T >) ZfzH"z}XQD勉Vjm8N@ 18,&* B%$jt҉nIxp²,K4ː'Ӯ^|t,Mr& #^fT3UY`HMt >)GhHuoGu{c_ent\mŞ_:;.CMGᢱHvQGy^߁'qZ qg&slU\*H*XY1kΥ0qhG:Ĩ.%T0RY,z ܂/=#w{A>9{YP&оkAiSJ|$5^Fg_eM2-J9y^q7 b{

程序设计 call by value ,call by address ,call by name 假设有一段code内容大致如下:----------------------------------MAIN()BEGINA[1:4]={1,2,3,4};X = 1;Y = 2;CALL SUB(X,Y,A[X]);ENDSUB(A,B,C)BEGINA = B;C = 12;END-------------------------
程序设计 call by value ,call by address ,call by name
假设有一段code内容大致如下:
----------------------------------
MAIN()
BEGIN
A[1:4]={1,2,3,4};
X = 1;
Y = 2;
CALL SUB(X,Y,A[X]);
END
SUB(A,B,C)
BEGIN
A = B;
C = 12;
END
----------------------------------
在下列三种呼叫方式下
程式执行的结果各为何?
希望能附上说明给我,这样我比较能理解
call by value
call by address (reference)
call by name

程序设计 call by value ,call by address ,call by name 假设有一段code内容大致如下:----------------------------------MAIN()BEGINA[1:4]={1,2,3,4};X = 1;Y = 2;CALL SUB(X,Y,A[X]);ENDSUB(A,B,C)BEGINA = B;C = 12;END-------------------------
call by value 方式:
调用时子程序得到的是参数值的副本,子程序中对形参的改变其实只是影响了该副本的值,但在返回主程序后该副本会被丢弃,因此在主程序中按值调用的参数仍保持原来的值.
例如SUB(A,B,C)中,若形参A是by value的,则在MAIN中CALL SUB(X,Y,A[X])后,X仍为1.
call by address/reference 方式:
调用时子程序得到的是实际参数的内存地址,因此在子程序中改变形参的值时,实际会导致对该形参所对应的地址处的内存数据的变化,即直接修改的是主程序中的变量的值,返回主程序后该参数所对应的变量值会产生变化.
例如SUB(A,B,C)中,若形参A是by reference的,则在MAIN中CALL SUB(X,Y,A[X])后,X会变为2.
call by name 方式:
有点类似于宏扩展的方式,调用的参数并非是在调用前计算出来,而是在子程序中每个引用所对应的形参的地方都重新进行计算,因此有延迟计算的作用.例如你例子中,若主程序调用SUB时是by name的,则实际执行的情况是:
A=B --> X=Y --> X=2
C=12 --> A[X]=12 --> A[2]=12
这里就看到,因为X的值先变化过,所以在对C赋值的时候,实际影响的是A[2],而不是A[1].