【问题标题】:Output of a c code like with call by reference [closed]c代码的输出,如引用调用[关闭]
【发布时间】:2013-04-07 19:30:52
【问题描述】:

鉴于此 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 使用引用调用,我必须弄清楚它会打印什么。

这是我的期望。
首先
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;但答案是 -4 12 -4 11。我错在哪里?

【问题讨论】:

  • C 中没有引用调用。要找出代码的作用,只需编译并运行它。
  • @OliCharlesworth 我知道在 C 中没有引用调用,而且在顶部也有说。" c 代码喜欢" 所以,想想一个与 c 类似的语法并具有调用的代码-参考
  • @OliCharlesworth 你会怎么称呼int a=1, b=2; tswap(&a, &b);void tswap(int* pa, int* pb){...}
  • @A4L 我认为你不能用 ANSI C 做到这一点,但请集中我的问题。
  • @A4L:可能是地址传递。 (不过,我很欣赏没有明确的定义。)

标签: c binding parameter-passing


【解决方案1】:

由于这里没有递归,并且所有变量都有不同的名称,我们可以“欺骗”一下,将局部变量更改为全局变量(因为这不会导致任何名称冲突):

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参数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 代码;我们不再有任何参数,所以“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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    相关资源
    最近更新 更多