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

时间:2013-07-22 10:55:46

标签: c recursion static-variables

有人可以向我解释这个程序输出的原因是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

3 个答案:

答案 0 :(得分:11)

在递归时,printf()会在main()返回时执行。因为varstatic variable,其值保持0(所有函数调用的最后一个值= 0)

if()变为var时,注意0条件为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 Static Variables

     

静态自动变量的范围与   自动变量,即它是它所在的块的本地变量   定义;但是,分配的存储成为永久存储   计划的持续时间。静态变量可以在它们中初始化   声明;但是,初始值设定项必须是常量表达式,   并且在内存编译时只在编译时进行一次初始化   分配给静态变量*

第二个问题:

  

如果您使用var--,那么您的输出将是-1 -1 -1 -1 -1 -1

假设您的条件是var--,那么if()条件会在递减true之前检查false--。 (因为在表达式var--中,--是后缀) 并且因为if()var == 0时中断,然后递归调用停止并且函数返回从0-1的递减值。并且因为在返回var之后没有改变,因此所有输出都是-1

答案 1 :(得分:2)

  

在递归调用期间,var的值将为4, 3, 2, 1。当变种   变为终止并且控制移动到的变为零   printf()声明。为什么输出不是1, 2, 3, 4

静态变量是一个静态分配的变量 - 其生命周期或“范围”在整个程序运行中都会延伸。

因此var的值每次都会发生变化,最后变为0并且printf()在返回main后执行,而var的值为0,每{{1} }}语句将打印printf()

答案 2 :(得分:1)

静态变量生命周期保持等于程序生命周期的变量。静态变量get初始化一次。每次系统调用后,变量的值都会改变。如果您没有将变量声明为静态,则会发生无限递归,从而导致分段错误