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

给定此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);
    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;
}