#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语句指令放置到堆栈中?
答案 0 :(得分:5)
i
来减少 main
,直到达到零为止。
然后 printf
用于每个递归级别。
(请注意,尽管在C语言中不明智,但从自身调用main
的行为是明确定义的,在C ++中,行为是 undefined 。)
答案 1 :(得分:5)
if (--i)
这将在第一次(--i == 4
)中评估为是。该代码递归到main()
中。 (Recursion:一个调用自身的函数。)
由于i
为static,它将保留其值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,因此为其分配了一个内存,所有更改都反映回了它