新节目主持人来了.

有没有人能帮我了解一下以下项目的流程?我已经在下面的部分提到了我的理解.请让我知道我哪里错了.

这里的目标是用C语言在不使用循环的情况下打印1到n.我能够使用GOTO函数完成这项工作,但无意中发现了下面的解决方案/代码,并遇到了疑问.如有任何帮助,我们不胜感激.

Code

// Prints numbers from 1 to n
void printNos(unsigned int n)
{
    if (n > 0) {
        printNos(n - 1);
        printf("%d ", n);
    }
    return;
}

// Driver code
int main()
{
    int n = 10;
    printNos(n);
    getchar();
    return 0;
}

我的理解是.

  1. 在‘main’部分(作为驱动程序代码),我们定义一个名为‘n’的int,并为其赋值10
  2. 在下一行中,我们将调用函数‘printNos’并将的值作为参数传递给n,即10
  3. 现在程序跳转到‘printNos’函数,并将n的值接收为10
  4. 在‘printNos’函数中,程序达到IF条件并判断10是否大于0
  5. 如果条件为真,现在进入if函数体 This is where i need help from
  6. 在这里,根据我的理解,我们再次使用参数10-1(即9)调用‘printNos’函数
  7. 根据我的理解,这是一个自循环,有一个新的参数n-1,即8,7,6,以此类推,直到n大于0

问题1--打印件是如何制作的? 问题2-在主体中使用getchar()有什么用?

推荐答案

这里漏掉的单词是"递归的".printNos()是一个recursive函数,因为它调用自己.为了避免无限递归,它有一个条件允许它自己调用not,也就是当n == 0.所以发生的事情是,它建立了一个对自己的调用堆栈,每次递减n,直到它达到零.然后,它开始从这些调用中的每一个返回,也就是执行每个printf()的时候,返回的顺序与它们的堆栈顺序相反.n的值进入堆栈10、9、...、1,然后离开堆栈并打印1、2、...、10.

至于getchar(),它会暂停程序,直到提供字符作为输入.我不知道为什么它会在里面.

C++相关问答推荐

错误:C中需要参数声明符

通过MQTT/蚊子发送大文件—限制在4MB

什么C代码将确定打开的套接字正在使用的网络适配器?

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

为什么在C中进行大量的位移位?

显式地将值转换为它从函数返回的类型的含义是什么?

如何将长字符串转换为较小的缩写,该缩写由第一个字符、最后一个字符和中间的字符数组成?

为什么GDB/MI进程的FIFO循环中有read()阻塞

使用AVX2的英特尔2022编译器的NaN问题&;/fp:FAST

为什么此共享库没有预期的依赖项?

什么是.c.h文件?

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

是否定义了此函数的行为?

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

Fscanf打印除退出C代码为1的程序外的所有内容

在吉陀罗中,_2_1_和CONCAT11是什么意思?

指向返回 struct 成员的指针,安全吗?

为什么<到达*时不会转换为>?

这些表达式是否涉及 C 中定义的复合文字?

React Native Android C++ TurboModules 静态 C 库链接问题