【问题标题】:Can anyone explain output of this program谁能解释这个程序的输出
【发布时间】:2017-09-12 22:27:36
【问题描述】:

带有递归函数的静态变量示例

 #include <stdio.h>
    int main()
    {
        static int i=10;
        if(--i)
        {
            main(); /*recursive call main */
            printf("%d ", ++i); /* print returned value of main */

        }
    }

【问题讨论】:

  • 请解释你有什么问题,你期望的输出是什么?实际输出是多少?并且确实需要一些时间来read about how to ask good questions
  • printf("%d ", ++i); /* print returned value of main */ 这里的评论具有误导性。

标签: c recursion function-definition


【解决方案1】:

虽然i 不等于零,但函数 main 会调用自身。

    if(--i)
    {
        main(); /*recursive call main */

所以你有一个调用链

main( i = 10 ) -> main( i = 9 ) ->...-> main( i = 0 )

i 等于 0 时,递归停止,每个被调用的 main 将控制权返回给上一个 main 调用。

之前的main调用只是执行了这条语句

printf("%d ", ++i); /* print returned value of main */

因此输出将是

1 2 3 4 5 6 7 8 9

【讨论】:

  • 知道了,谢谢,所以被调用的 main 从最后一个顺序返回到第一个顺序对吗??
  • @SiddharthSidhu 是的,首先调用 main 直到 i 等于 0,然后它将控制权返回到上一个调用。考虑 i 最初等于 1 的情况。在这种情况下,不会输出任何内容,因为 --i 等于 0,并且它是 main 的第一次调用,没有其他 main 调用。
【解决方案2】:

++ii = i + 1 一样,所以当你写的时候

printd("%d ", ++i);

您再次增加i,使其值保持不变。

【讨论】:

    【解决方案3】:

    static 变量被初始化一次。它的生命周期是程序的。变量初始化一次,初始值为10。

    在每次递归调用中,它都会递减(if 语句),当达到 0 时,它将不再递归。

    最后一次递归后,开始打印并返回。

    由于printf语句是在递归之后,它会在最后一次递归之后开始第一次打印(当i=1时),会打印1到9。

    在执行printf 并返回时,它会不断增加i 1。因此,最顶层的函数堆栈将i 作为9。

    【讨论】:

      猜你喜欢
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多