Re: [請益] call by value, call ref, call by name

看板Programming作者 (喲)時間15年前 (2010/04/03 09:49), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串3/4 (看更多)
※ 引述《syura945 (○~)》之銘言: : 用最笨的方法, 把程式展開就知道答案了 : // call by name : x=1; y=2; z=3; : int m,n,p; : m=(m=x)+2; // m=1; m=m+2=3 : p=(p=z)+(n=(x+y)); // p=3; n=x+y=1+2=3; p=p+n=6 : printf("%d,%d,%d\n",m,n,p); // 3,3,6 : printf("%d,%d,%d\n",x,y,z); // 1,2,3 : return 0; : } 這裡不對,你的call-by-name仍用by-value的策略,先把參數值求出來. 但是call-by-name並不是先求參數值. 以 n <- x + y 來講,因為你用了C語言處理,而C顯然是call-by-value而且是 先求參數值,所以一個n就先被算出是固定值了. 你並沒有模擬出call-by-name. Call-by-name應該是這樣: ("x"表示將呼叫參數x名字填到目前位置.) x = "x" + 2; z = "z" + "x+y"; printf("x", "x+y", "z"); 填好之後再執行程式, x=1, y=2, z=3, 所以結果是 3 5 6. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.228.65

04/03 11:52, , 1F
哦,有個錯誤一直做錯了,z結果應該是8...
04/03 11:52, 1F
用C模擬call-by-name是這樣: #include<stdio.h> #include<stdlib.h> #define confuse_cbn(X, Y, Z) {\ x = X + 2;\ z = Z + Y;\ printf("%d %d %d\n", X, Y, Z);\ } int main() { int x = 1, y = 2, z = 3; confuse_cbn(x, x+y, z); printf("%d %d %d\n", x, y, z); return 0; } 這樣會印出 3 5 8\n3 2 8\n 但我還不清楚call-by-name是不是跳到一個隔離的scope, 其中的x y z不參考caller的x y z. ※ 編輯: yauhh 來自: 59.112.228.65 (04/03 12:09)
文章代碼(AID): #1BjfwyAB (Programming)
文章代碼(AID): #1BjfwyAB (Programming)