跟踪C中的递归

时间:2013-03-11 04:39:02

标签: c recursion console

我对递归函数和跟踪有基本的了解,但是当我尝试跟踪以下程序时,有些事情会变得混乱:

#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”的代码中看到任何算术。

提前致谢...我感觉它很小,我忽略了。

3 个答案:

答案 0 :(得分:1)

main()的{​​{1}}将会改变:

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。在c中,当您指定f1时,它会更新*a指向的任何内容,即a

答案 1 :(得分: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

答案 2 :(得分:0)

致电a = f1(&c, f1(&b,d));c的地址传递给f1(),并在该功能中第一行

*a = c - 2;

更改c的值。 *a是指c的值。