c代码的输出,如通过引用调用
给定此C代码:c代码的输出,如通过引用调用,c,binding,parameter-passing,C,Binding,Parameter Passing,给定此C代码: int x=12,y=10; void tswap(int pa, int pb) { int tmp; 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() { int a=4; tswap(x,a); printf("%d %d %d\n",x,y,a); retu
int x=12,y=10;
void tswap(int pa, int pb) {
int tmp;
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() {
int a=4;
tswap(x,a);
printf("%d %d %d\n",x,y,a);
return 0;
}
我必须弄清楚,如果C使用callbyreference,它将打印什么
这是我的期望首先
x=12 y=10和a=4
after tswap(12,4):
pa=x=12 pb=a=4
after tmp=pa:
tmp=pa=x=12
-----------
after pa=pb:
tmp=x=12
pa=pb=a=4
-------------
after pb=tmp:
pb=tmp=x=12
pa=a=4
after x=x+pa
x=16
------------
and after x=x-pb and y++
x=4,y=11
所以我认为x=4,pb=12,pa=4,y=11;但是答案是-412-411。我错在哪里?因为这里没有递归,所有变量都有不同的名称,我们可以“欺骗”一点,将局部变量更改为全局变量(因为这不会导致任何名称冲突): 由于
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代码;我们不再有任何参数,因此“按引用传递”和“按值传递”是等价的。追踪:
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;
}
C中没有引用调用。要了解代码的功能,只需编译并运行它。@OliCharlesworth我知道C中没有引用调用,而且上面也有这样的说法。“C代码类似于”所以,只需考虑一个与C语法相似的代码,并使用-reference@OliCharlesworth你会把什么叫做
inta=1,b=2;tswap(a&b)代码>使用void tswap(int*pa,int*pb){…}
?@A4L我想你不能用ANSI C来做这件事,但请集中我的问题。@A4L:可能是通过地址。(不过,我很感激没有明确的定义。)
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;
}