Re: [請益] call by value, call ref, call by name
※ 引述《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
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)
討論串 (同標題文章)
Programming 近期熱門文章
PTT數位生活區 即時熱門文章