-2

この 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 が call-by-reference を使用した場合に何を出力するかを理解する必要があります。

これが私の期待です。
まず
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 と言っています。どこが間違っていますか?

4

1 に答える 1

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;
}

は 1 回しか呼び出されないため、そのパラメーターは常ににエイリアスされ、そのパラメーターは常ににエイリアスされるtswapことがわかります。そのため、パラメーターを削除して、それらがエイリアスする変数に置き換えることができます。paxpba

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;
}
于 2013-04-07T20:03:43.280 に答える