在递归函数的情况下获得的值

任何人都可以向我解释这个程序输出背后的原因是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初始化一次 。 每次系统调用后,变量的值都会改变。 如果您尚未将变量声明为静态,则会发生无限递归,从而导致分段错误