由于这里没有递归,并且所有变量都有不同的名称,因此我们可以“作弊”一点,将局部变量更改为全局变量(因为这不会导致任何名称冲突):
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;
}
Since tswap
只被调用一次,我们知道它pa
参数是always别名为x
,及其pb
参数是always别名为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 代码;我们不再有任何参数,因此“按引用传递”和“按值传递”是等效的。追踪通过:
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;
}