6

谁能向我解释这个程序输出背后的原因是0 0 0 0 0什么?

在这里,我们使用static variable var的值不会因函数调用而改变。的值var4, 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

4

3 回答 3

11

在您的递归调用中printf(),当main()返回时执行。并且因为varstatic 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递减的值返回。并且因为返回后不会改变,因此输出适用于所有人。 var00-1var-1

于 2013-07-22T10:57:16.133 回答
2

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

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

所以var的值每次都会变化,最后变成main返回0printf()执行,var的值是0,每条printf()语句都会打印0

于 2013-07-22T11:03:49.667 回答
1

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

于 2013-07-22T11:34:54.207 回答