為什麼這篇Call by name鄉民發文收入到精華區:因為在Call by name這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者epola (Epola)看板Examination標題[請益] call by referen...
請問各位
首先
call by reference與call by name差別在哪裡 ?
兩者都會把參數的位址傳到副程式中,會有side effect
那兩者的差別為何呢 ?
其次
procedure confuse(x,y,z)
begin
y=y+1;
z=z+x;
end;
begin
a=2;
b=3;
confuse(a+b,a,a)
printf a;
end
如果是call by reference 參考書的答案為8
如果是call by name 參考書的答案為9
可否有人可以幫忙解答,為何兩者會有所差異呢 ?
如果都是將參數的位址給副程式使用 那為何答案有所出入 ?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.225.147.226
※ epola:轉錄至看板 Programming 05/06 07:24
> -------------------------------------------------------------------------- <
作者: tlchan (tl) 看板: Examination
標題: Re: [請益] call by reference與call by name的差눠…
時間: Tue May 6 08:29:48 2008
小弟來回答吧..雖然很久沒看書了..
有錯煩請指正..謝謝!
※ 引述《epola (Epola)》之銘言:
: 請問各位
: 首先
: call by reference與call by name差別在哪裡 ?
: 兩者都會把參數的位址傳到副程式中,會有side effect
: 那兩者的差別為何呢 ?
: 其次
: procedure confuse(x,y,z)
: begin
: y=y+1;
: z=z+x;
: end;
: begin
: a=2;
: b=3;
: confuse(a+b,a,a)
: printf a;
: end
: 如果是call by reference 參考書的答案為8
call by reference 就是call by address
就是當主程式呼叫副程式時,將主程式中的實際參數的位址傳給副程式對應的型式參數..
也就是..主程式和副程式所屬的參數是互為別名..
副程式的生命週期在procedure執行完畢後結束..
而副程式改變參數值..因為與主程式互為別名..所以會產生副作用..
所以以上例來說...
主程式:a=2 b=3呼叫副程式(a+b)傳給x
a傳給y
a傳給z
(a+b)由於在主程式沒定義..所以會產生一個匿名變數..
y=y+1==>所以y指向的位址的值加1==>即a+1==>3
z=z+x==>z為3,x為5所以z指向的位址的值變成8==>即a=8
返回..輸出a..即是8
: 如果是call by name 參考書的答案為9
call by name則是主程式呼叫副程式時,將主程式中實際參數的名稱,傳給副程式中的
對應型式參數..即..副程式中所有型式參數的名稱都用實際參數的名稱來替代..
所以以上例來說..
副程式y=y+1;會替換成a=a+1;
z=z+x;會替換成a=a+a+b;
執行第一行敘述時..a=2+1所以a會變成3
執行第二行敘述時..a=3+3+3所以a會變成9
返回..輸出a..此時a會變成9
: 可否有人可以幫忙解答,為何兩者會有所差異呢 ?
: 如果都是將參數的位址給副程式使用 那為何答案有所出入 ?
: 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.126.22.198