精華區beta Examination 關於我們 聯絡資訊
請問各位 首先 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
epola:感謝您的耐心回覆,謝謝 05/06 09:23