有人可以向我解释这个程序输出的原因是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
?
答案 0 :(得分:11)
在递归时,printf()
会在main()
返回时执行。因为var
是static 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在函数内。
静态自动变量的范围与 自动变量,即它是它所在的块的本地变量 定义;但是,分配的存储成为永久存储 计划的持续时间。静态变量可以在它们中初始化 声明;但是,初始值设定项必须是常量表达式, 并且在内存编译时只在编译时进行一次初始化 分配给静态变量* 。
第二个问题:
如果您使用
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初始化一次。每次系统调用后,变量的值都会改变。如果您没有将变量声明为静态,则会发生无限递归,从而导致分段错误。