void main()
{
static int a=5;
printf("%i",a--);
if(a)
main();
}
这个程序打印54321.任何人都可以解释原因吗?
答案 0 :(得分:2)
由于此问题标记为C,因此以下是C标准的答案:
声明标识符的对象没有存储类说明符
_Thread_local
,并且具有外部或内部链接或存储类说明符static
,具有静态存储持续时间。它的生命周期是程序的整个执行,它的存储值只在程序启动之前初始化一次。第6.2.4节
答案 1 :(得分:1)
void func()
{
static int a=5;
printf("%i",a--);
if(a)
func();
}
让我们摆脱main()
问题,并将其称为func()
。
声明某些内容static
意味着该变量将在函数调用之间保留其值。
第一次调用func()
时,a
将被赋予值5
。
a--
在打印后将其减少到4
,如果再次调用a!= 0
,func()
。请注意func()
在退出之前调用自身。
这将递归重复,直到a==0
,此时它将退出函数的所有实例。
谷歌“递归函数c ++”有一些深入的解释。
答案 2 :(得分:-1)
假设使用C / C ++,我发现了here:
(1)在函数内部使用静态...意味着一旦变量初始化,它就会一直保留在内存中,直到程序结束。你可以把它想象成变量坚持,保持其价值,直到程序完全结束。例如,您可以使用静态变量来记录函数被调用的次数,只需包含static int count = 0;和计数++;在函数内部。
(2)因为count是一个静态变量,所以行“static int count = 0;”只会执行一次。每当调用该函数时,count将为其分配最后一个值。
所以,有两件事情发生了:从(1),a
将坚持整个计划。从(2)开始,a
的声明/初始化将在开始时恰好发生一次。对您的函数进行的后续递归调用不会重新声明/重新初始化a
。