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

rip*_*rld 1 c parameters recursion 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;
}
Run Code Online (Sandbox Code Playgroud)

第二个代码遵循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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢你!

0x5*_*453 6

当您int c在第二个参数中声明参数时func,它会影响全局c,因此函数范围内的所有进一步更改仅适用于本地c而不是全局更改.