由于这里没有递归,并且所有变量都有不同的名称,我们可以“欺骗”一点并将局部变量更改为全局变量(因为这不会导致任何名称冲突):
int x=12, y=10; /* original globals */
int tmp; /* belongs to tswap */
int a; /* belongs to main */
void tswap(int pa, int pb) {
tmp=pa;
pa=pb;
pb=tmp;
x=x+pa;
x=x-pb;
y++;
printf("%d %d %d %d\n",pa,pb,x,y);
}
int main() {
a=4;
tswap(x,a);
printf("%d %d %d\n",x,y,a);
return 0;
}
由于tswap只调用一次,我们知道它的pa参数总是别名为x,并且它的pb参数总是别名为a。所以,我们可以去掉参数,用它们别名的变量替换它们:
int x=12, y=10;
int tmp;
int a;
void tswap() {
tmp=x;
x=a;
a=tmp;
x=x+x;
x=x-a;
y++;
printf("%d %d %d %d\n",x,a,x,y);
}
int main() {
a=4;
tswap();
printf("%d %d %d\n",x,y,a);
return 0;
}
此时,这只是普通的 C 代码;我们不再有任何参数,所以“pass-by-reference”和“pass-by-value”是等价的。追溯:
int x=12, y=10;
int tmp;
int a;
void tswap() {
tmp=x; /* x=12, y=10, tmp=12, a=4 */
x=a; /* x=4, y=10, tmp=12, a=4 */
a=tmp; /* x=4, y=10, tmp=12, a=12 */
x=x+x; /* x=8, y=10, tmp=12, a=12 */
x=x-a; /* x=-4, y=10, tmp=12, a=12 */
y++; /* x=-4, y=11, tmp=12, a=12 */
printf("%d %d %d %d\n",x,a,x,y); /* prints "-4 12 -4 11" */
}
int main() {
a=4; /* x=12, y=10, tmp is uninitialized, a=4 */
tswap(); /* x=-4, y=11, tmp=12, a=4; prints "-4 12 -4 11" */
printf("%d %d %d\n",x,y,a); /* prints "-4 11 4" */
return 0;
}