【问题标题】:Values obtained in case of a recursive function在递归函数的情况下获得的值
【发布时间】:2013-07-21 01:56:49
【问题描述】:

谁能向我解释这个程序的输出背后的原因是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

【问题讨论】:

  • 关于第二个问题:--var 先递减,然后检查 if(var),而 var-- 检查 var 的值,然后递减。 if(var--) 表示 if(var) var = var - 1;if(--var) : var = var - 1; if(var)

标签: c recursion static-variables


【解决方案1】:

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

静态变量是静态分配的变量——其生命周期或“范围”延伸到程序的整个运行。

所以var的值每次都会改变,最后变成0printf()在main返回后执行,因为var的值是0,所以每个printf()语句都会打印0 .

【讨论】:

    【解决方案2】:

    在您的递归调用中,printf()main() 返回时执行。因为varstatic variable,所以它的值仍然是0(所有函数调用的最后一个值 = 0)

    注意if()var 变为0 时条件为假(最后一个值,在 main() 之后;调用你不要更改 var - 注意图)。

    希望下图能帮助你理解(阅读cmets):

    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 Static Variables

    静态自动变量的作用域与 自动变量,即它在其所在的块中是本地的 定义;但是,分配的存储空间对于 程序的持续时间。静态变量可以在它们的 声明;但是,初始化器必须是常量表达式, 并且初始化只在编译时完成一次,当内存是 分配给静态变量*

    第二个问题:

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

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

    【讨论】:

    • 一定是这样。在所有递归(以及减法)完成后调用 printf
    • @MyPasswordIsLasercats 是的,检查图表
    • 值得注意的是,这里关于观察/预期输出的真正问题是变量是静态的,这意味着它在递归调用中是同一个变量。带有局部变量的修改代码和一些修改将产生预期的输出。
    • 好的。知道了。谢谢 Grijesh Chauhan。
    • @C_beginner 但请稍等,如果我可以添加更多有用的信息..Thomas 有很好的建议
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2021-10-03
      • 1970-01-01
      • 2021-06-09
      • 2019-01-02
      相关资源
      最近更新 更多