在递归函数的情况下获得的值
任何人都可以向我解释这个程序输出背后的原因是0 0 0 0 0
吗?
这里我们使用static variable var
其值不会因函数调用而改变。 在递归调用期间, var
的值将为4,3,2,1。 当var
变为零时,递归终止并且控制转到printf
语句。
为什么输出不是1,2,3,4
?
main(){ static int var=5; if(--var) main(); printf(" %d ",var); }
再次,如果你使用if条件var--
那么程序输出将是-1 -1 -1 -1 -1 -1
?
在递归调用中, printf()
在main()
返回时执行。 因为var
是一个static variable
它的值保持为0
(所有函数调用的最后一个值= 0相同)
注意当var
变为0
时, if()
条件为false(最后一个值,在main()之后;调用时不要更改var – notice diagram)。
希望以下图表可以帮助您理解(阅读评论):
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 }
静态函数的剩余寿命是程序终止(所以值不丢失),而Scope在函数内。
14.1.6静态变量
静态自动变量的范围与自动变量的范围相同,即它是定义它的块的本地变量; 但是,分配的存储在程序期间变为永久存储。 静态变量可以在其声明中初始化; 但是, 初始化程序必须是常量表达式,并且在为静态变量*分配内存时,在编译时只进行一次初始化 。
第二个问题:
再次,如果你使用
var--
那么你的输出将是-1 -1 -1 -1 -1 -1
?
假设你的条件是var--
那么if()
条件在减量之前检查是true
还是false
--
。 (因为在表达式var--
--
中, --
是后缀)。
因为if()
在var
== 0
时中断,然后递归调用停止,函数返回从0
到-1
递减值。 并且因为在返回var
之后没有改变因此输出为-1
。
在递归调用期间,var的值将为4,3,2,1。 当var变为零时,递归终止并且控制移动到
printf()
语句。为什么输出不是1, 2, 3, 4
?
静态变量是一个静态分配的变量 – 其生命周期或“范围”在整个程序运行中都会延伸。
因此var的值每次都会改变,最后它变为0
并且在返回main之后执行printf()
,并且当var的值为0
,每个printf()
语句将打印0
。
静态变量是那些寿命保持等于程序生命周期的变量。 静态变量 get初始化一次 。 每次系统调用后,变量的值都会改变。 如果您尚未将变量声明为静态,则会发生无限递归,从而导致分段错误 。