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、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()'sc将在这里改变:

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,您将指针传递给c. 在f1中,当您分配 时*a,它会更新a指向的任何内容,即c.

于 2013-03-11T04:46:00.227 回答
1

调用a = f1(&c, f1(&b,d));传递的地址cf1()该函数的第一行

*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 回答