1

再帰関数とトレースの基本的な理解はしていますが、次のプログラムをトレースしようとすると、何かがおかしくなりました。

#include <stdio.h>
#include <stdlib.h>

int f1(int *a, int c);

int main(void) {
    int a=2, b=3, c=4, d=5;
    a = f1(&c, f1(&b,d));
    printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);

    system("pause");
    return 0;
}

int f1(int *a, int c) {
    *a = c - 2;
    c = c*2 - (*a);
    printf("a= %d c= %d\n", *a, c);
    return c - *a;
}

トレースすると、f への 2 つの呼び出し、f(4,4) と f(3,5) が得られます。戻り値と f 関数の printf ステートメントを正しくトレースできます。しかし、main の最後の printf は、a= 4 b= 3 c= 2 d= 5 を与えます。それを書き出すと、最終的に c=4 になります...自分の作業を二重および三重にチェックした後でも。デバッグすると、メインの「c」の値がいつ変更されるかわかりません。また、メインの「c」のコードに算術演算が表示されません。

前もって感謝します...私が見落としているのは小さなものだと感じています。

4

3 に答える 3

2

main()はここで変更されますc

int f1(int *a, int c) {
    *a = c - 2; /* <-- */
    c = c*2 - (*a);
    printf("a= %d c= %d\n", *a, c);
    return c - *a;
}

への外部呼び出しではf1、へのポインタを渡していますcf1で、を割り当てる*aと、ポイントしていたものがすべて更新されます。つまりa、ですc

于 2013-03-11T04:46:00.227 に答える
1

a = f1(&c, f1(&b,d));に渡されたアドレスをc呼び出し、f1()その関数の最初の行

*a = c - 2;

の値を変更しますc*aの値を参照しますc

于 2013-03-11T04:44:44.990 に答える
1

このようにしてみてください:

#include <stdio.h>
#include <stdlib.h>

int f1(int *a, int c, const char *sa);

int main(void) {
    int a=2, b=3, c=4, d=5;
    a = f1(&c, f1(&b,d, "main.b"), "main.c");
    printf("a= %d b= %d c= %d d= %d\n",a,b,c,d);

    system("pause");
    return 0;
}

int f1(int *a, int c, const char *sa) {
  printf("%d: set %s from %d to %d\n", __LINE__, sa, *a, c - 2); 
  *a = c - 2;
  c = c*2 - (*a);
  printf("a= %d c= %d\n", *a, c); 
  return c - *a; 
}

出力

16: set main.b from 3 to 3
a= 3 c= 7
16: set main.c from 4 to 2
a= 2 c= 6
a= 4 b= 3 c= 2 d= 5
于 2013-03-11T04:49:20.247 に答える