首先,要说的是,对不起11楼及所有被我整晕的弟兄们了。上次说的绕的确是不得以。因为这个涉及的面还是比较深的。如果是泛泛的说,可能又不够清晰。
接下来,我就透彻一些的说吧。
要想搞清楚来龙去脉,不得不提到一些C语言编译方面的工作。这里,很多编程者是不涉及的。
大家在录入程序的时候,后缀名位.c之类的文件都是ASCII文本文件,不是运行的程序。只有当编译链接之后生成的.exe文件才是。就是说,编译是在大家运行程序之前就做的事情。那么,从.c到.exe之间就有了一些变化。变化在哪呢?就是录入的这些东西编译的存储策略各有其位。如上所说的,针对代码,编译后的东西放到程序代码区,而局部于各函数的局部动态变量放到局部变量区,当然,它的生命域和作用域只局限于所包容的那个函数,而如果你的程序涉及到堆这种数据结构时,放到的是自由空间那个地方。而上面考虑的加了static修饰的变量,不论是全局的还是局部于某程序的,在编译的时候放到的是静态存储区,所以f和n不在一个地方,虽然作用域都是fac函数,但由于是static类型的,那么它的生命域就是整个程序期间一直存在,而n在每次调用fac时重新生成再次初始化。这就是生命域与作用域之间的异同!好了,现在清楚的明白一点,每次调用n都是要重新来的,但f由于在应用程序运行期间一直存在,则调用f时.exe文件中并没有关于‘=1’这种重复性的语句。所以每次调用都是在f的当前值上接着施加影响。
最后,要说的是,理解这个对一般的c语言初学者来说并不是一件易事。这里面涉及到比较深的编译及系统结构知识,即便是会写c语言的也可能是知其然不知其所以然。可以先跳过一些深层次的东西,从会编写开始树立信心!从中体验快乐,套用一句‘快乐编程’。
祝你好运!