为什么这两个相似的递归C代码给出不同的输出?

时间:2019-01-15 21:39:40

标签: c recursion parameters parameter-passing

我已经考虑了好几个小时...

我尝试解释一下,但是如果您不清楚,请尝试输入我的代码...

第一个代码遵循i = 1,1,1,2,3,2,3,2,3,而c遵循0-> 1-> 2-> 3。

#include <stdio.h>
int c = 0;
void func (int a){
    c = a + 1;
    printf("%d", c+100);
    for (int i = 1; i <= 3; i++)
    {
        printf("%d", i );
        if (c <= 2){
            func(c);
        }
    }
}
int main(int argc, const char *argv[]){
    func(c);
    return 0;
}

第二个代码遵循i = 1,1,1,2,3,2,1,2,3,3,1,2,3,2,1,1,2,3 ...(39 i总计),并且c遵循0-> 1-> 2-> 3-> 2-> 3-> 2-> 3。

#include <stdio.h>
int c = 0;
void func (int c){
    c = c + 1;
    printf("%d", c+100);
    for (int i = 1; i <= 3; i++)
    {
        printf("%d", i );
        if (c <= 2){
            func(c);
        }
    }
}
int main(int argc, const char *argv[]){
    func(c);
    return 0;
}

唯一的区别是func()中的参数,即“ void func(int a)”和“ c = a + 1”。

您能解释一下为什么在第一个代码中“ c”表现为全局变量的原因,但是在第二个代码中,“ c”变为3之后,它仍然可以跳回到2并导致进一步递归。

非常感谢您!

1 个答案:

答案 0 :(得分:6)

在第二个int c中声明参数func时,它shadows是全局c,因此该函数范围内的所有进一步更改仅适用于本地c而不是全局{}。