重复调用主要功能的意外输出

时间:2017-07-29 19:09:35

标签: c

我正在执行用C编写的代码,它给出了意想不到的结果,我无法弄明白。为什么我打印五次的价值?

以下是以下代码:

#include <stdio.h>

void main() {
    static int  i = 0;
    static int count =0;
    if (i<5){
        i++;
        main();
        printf("%d\n",i);
        ++count;
        printf("%d\n",count);
    }
}

这是输出:

5
1
5
2
5
3
5
4
5
5

1 个答案:

答案 0 :(得分:0)

输出没有问题。

  • 您首先设置i = 0。
  • 第一个if(i&lt; 5)通过,所以我正在递增(注意:i ++表示我仍然是4,但是当它下次使用时,该值是5)。
  • 调用main,静态变量i和count保持它们的值作为静态变量不会被覆盖,这样程序通过if(i <5)直到i = 5,然后if(i&lt; 5)返回false并且第五次突破主要呼吁。
  • 由于在第五次调用main时没有任何反应,i的值现在仍然是4,但是由于你通过i ++增加了i,所以我在printf()现在是5,因为这是我使用的时间在增加之后。 Printf显示:

    5
    
  • 计数通过++计数递增(++计数表示该值立即递增,因此计数现在为1)。 Printf显示:

    1
    
  • 现在递归循环结束。对于每个“级别”行

    main();
    

    完成调用,所以下一行是

    printf("%d\n", i);
    

    因为我们永远不会改变i的值(因为对于所有“级别”我们已经将i增加到5),控制台向我们显示变量i的值5的5倍。

  • 我们唯一仍然改变的是变量计数。由于在递归调用main之后变量计数仍在递增,因此count仍然加起来为5.因此输出如下所示:

    5 (i, level 5)
    1 (count, level 5)
    5 (i, level 4)
    2 (count, level 4)
    5 (i, level 3)
    3 (count, level 3)
    5 (i, level 2)
    4 (count, level 2)
    5 (i, level 1)
    5 (count, level 1)
    
  • 当计数达到5时,我们再次达到递归调用堆栈的“顶层”级别,程序结束。