首页 > 解决方案 > 为什么以下两个段的输出不同?

问题描述

#include <stdio.h>
int main()
{
    static int i = 5;   // here
    if (--i){
        printf("%d ", i);
        main();
    }
}

输出:4 3 2 1

#include <stdio.h>
int main()
{
     int i = 5;   // here
     if (--i){
        printf("%d ", i);
        main();
    }
}

输出:4 4 4 4...(分段错误)

知道如何只考虑一次静态 int 变量并且一次又一次地接管 int 吗?

标签: crecursion

解决方案


当您在函数中声明static变量时,即使在函数终止后,函数也会“记住”变量的最后一个值。

void Foo() {
    static int x = 5;
}

在上面的例子中,你告诉编译器x应该被“记住”并且初始值为5. 后续调用Foo()不会重新分配x的值5,而是使用先前记住的值。

相比之下:

void Bar() {
    int x = 5;
}

在这里,您告诉编译器每次Bar()执行时,x都将在堆栈上创建一个新变量并为其赋值5


推荐阅读