在您的递归调用中printf()
,当main()
返回时执行。并且因为var
它static variable
的值保持不变0
(所有函数调用的最后一个值 = 0 相同)
注意if()
条件 false 何时var
变为0
(最后一个值,在 main() 之后;调用你不要更改 var - 注意图)。
希望下图能帮助您理解(阅读评论):
main() <---------------+
{ |
static int var=5; | <----"Declared only one/first time with value 5"
if(--var) |
---- main(); ---------+ // called if var != 0
| // main called for var = 4, 3, 2, 1
|// recursion stooped
|// return with 0 value
|// now no operation applied on `var` so it remain 0
+--> printf(" %d ",var); // called when return ed
}
静态函数的剩余寿命是直到程序终止(因此值不会丢失),并且作用域在函数内。
14.1.6 静态变量
静态自动变量的作用域与自动变量的作用域相同,即在定义它的块中是局部的;但是,分配的存储空间在程序执行期间将变为永久性的。静态变量可以在它们的声明中初始化;但是,初始化器必须是常量表达式,并且初始化只在编译时为静态变量 * 分配内存时进行一次。
第二个问题:
如果您再次使用var--
,那么您的输出将是-1 -1 -1 -1 -1 -1
?
假设您的条件是var--
then if()
condition 拳头检查true
还是false
在 decrement 之前--
。(因为在表达式中var--
,--
是后缀)。
并且因为在==if()
时中断,然后递归调用停止并且函数以从to递减的值返回。并且因为返回后不会改变,因此输出适用于所有人。 var
0
0
-1
var
-1