使用static关键字的变量声明

时间:2014-08-15 04:18:33

标签: c static

void main()
{
    static int a=5;
    printf("%i",a--);
    if(a)
        main();
}

这个程序打印54321.任何人都可以解释原因吗?

3 个答案:

答案 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将被赋予值5a--在打印后将其减少到4,如果再次调用a!= 0func()。请注意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