作者yauhh (哟)
看板Programming
标题Re: [请益] call by value, call ref, call by name
时间Sat Apr 3 09:49:45 2010
※ 引述《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
1F:→ yauhh:哦,有个错误一直做错了,z结果应该是8... 59.112.228.65 04/03 11:52
用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)