有人可以解释这个C程序的输出吗?

时间:2018-07-16 09:02:01

标签: c

#include <stdio.h>

int main()
{
    static int i = 5;

    if (--i)
    {
        main();
        printf("%d\n", i); // will this line executes ?
    }

    return 0;
} 

输出:

0
0
0
0

在main()下面执行代码;从该程序终止时,每次发生主递归调用并执行时,都会将printf语句指令放置到堆栈中?

3 个答案:

答案 0 :(得分:5)

通过连续调用i来减少

main,直到达到零为止。

然后 printf用于每个递归级别。

(请注意,尽管在C语言中不明智,但从自身调用main的行为是明确定义的,在C ++中,行为是 undefined 。)

答案 1 :(得分:5)

if (--i)

这将在第一次(--i == 4)中评估为是。该代码递归到main()中。 (Recursion:一个调用自身的函数。)

由于istatic,它将保留其值4(与自动变量相对,后者将再次初始化为5)。 if (--i)执行中的main()将再次为true(计算为3),并再次调用main()(第三次调用函数的执行)。

--i == 2--i == 1的情况相同,对于main()条件为真的四个if执行(包括第一个非递归执行)

下一次递归将把if条件评估为--i == 0,因此为false。跳过if子句,该函数调用将仅返回。 i在此时为零,并且-为static,即对于i的所有实例只有一个持久性main()-将保持该值。

main()调用堆栈的上一层-求值--i == 1,然后调用main()并等待其返回的那一层,现在将继续执行以下语句main()printf()的调用i当前值...,即0

相同的情况还会发生三遍(总共四遍),直到最顶部的main()返回。您得到i当前值0的四倍。


请注意,在C中允许从程序中调用main(),但在C ++中是不允许的。这是专门用于递归调用 main() 的;对于其他功能,可以使用任何一种语言。

答案 2 :(得分:-2)

(-i)将在首次调用时将i的值减小到4,并且它将继续减小i直到(i == 0)< / strong>。 由于您已使用static关键字声明了变量i,因此为其分配了一个内存,所有更改都反映回了它