【问题标题】:Unexpected output of the main function by repeated call重复调用主函数的意外输出
【发布时间】:2017-07-30 10:29:26
【问题描述】:

我正在执行一个用 C 编写的代码,它给出了我无法弄清楚的意外结果。为什么I打印的价值是5倍?

下面是代码:

#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

【问题讨论】:

  • void main() 是非常非标准的 C。养成编写符合标准的代码的习惯。 int main(void).
  • 我的评论与(正确)结果无关。使用调试器跟踪代码。
  • 这段代码没有什么意外的。您提出的一个更好的问题是您期望输出是什么?
  • i 的值被打印 5 次,原因与 count 的值被打印 5 次相同——这是因为 main() 函数被显示的代码调用了 5 次, 再加上一次启动代码,其中一个调用发现 i &lt; 5 不正确,从而终止递归。
  • 正如@JonathanLeffler 所述,一旦递归停止,'i' 为 5',则不再调用 main() 代码连续退出递归。在每一步,递归调用main() 之后的代码都会被执行。因此,“i”中包含的值被打印(5),然后“count”递增并打印 I.E。 'i 中的值,计数中的值' (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)。如果您已将要打印的每个值标记为该值的来源,那么正在发生的事情会更加明显

标签: c


【解决方案1】:

输出没有问题。

  • 您首先设置 i = 0。
  • 第一个 if(i
  • 调用 main,静态变量 i 和 count 保持它们的值,因为静态变量不会被覆盖,这样程序会传递 if(i
  • 由于在对 main 的第五次调用中没有任何反应,所以 i 的值现在仍然是 4,但是由于您通过 i++ 递增 i,因此 printf() 中的 i 现在是 5,因为这是在增量。 Printf 显示:

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

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

    main();
    

    调用完毕,所以下一行是

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

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

  • 我们唯一仍然改变的是变量计数。由于在递归调用 main 之后变量 count 仍在递增,因此 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 时,我们再次到达递归调用堆栈的“顶层”,程序结束。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 2013-02-02
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多