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

标签 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 并导致进一步递归的原因。

非常感谢!

最佳答案

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

关于c - 为什么这两个相似的递归 C 代码给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54207244/

相关文章:

Python 通过引用或等效调用

c - 如何在Linux中使用c从txt文件中删除空行 - 不使用Bash

c - 队列推送不起作用

C 线程,CVI : how to return array out of thread?

algorithm - 确定树遍历是广度优先、深度优先还是两者都不是

parameters - Lua:使用pcall

c++ - 为什么键入三个非整数会导致此函数无限递归?

java - 这是递归吗?它会起作用吗?

swift - 为什么要在函数中使用参数?

parameters - MEF+MVVM : How to instantiate a class with non-importing or mixed parameters