回 帖 发 新 帖 刷新版面

主题:[讨论]关于多文件中static变量的生存期

最近在看 《c primer plus》,里面有个关于多文件中static变量的使用问题,求高手指点
程序清单 12.5 parta,c文件
#include <stdio.h>
void report_count ();
void accumulate (int k);
int count = 0;
int main (void)
{
    int value;
    register int i;

    printf ("Enter a positive integer (0 to quit): ");
    while (scanf ("%d", &value) == 1 && value > 0)
    {
        ++count;
        for (i = value; i >= 0; i--)
            accumulate (i);
        printf ("Enter a positive integer (0 to quit): ");
    }
    report_count ();
    return 0;
}

void report_count ()
{
    printf ("Loop executed %d times\n", count);
}

程序清单 12.6 partb,c文件
#include <stdio.h>

extern int count;

static int total = 0;
void accumulate (int k);
void accumulate (int k)
{
    static int subtotal = 0;

    if (k <= 0)
    {
        printf ("loop cycle: %d\n", count);
        printf ("subtotal: %d; total: %d\n", subtotal, total);
        subtotal = 0;
    }
    else
    {
        subtotal += k;
        total += k;
    }
}
运行示例:
Enter a positive integer (0 to quit): 5
loop cycle: 1
subtotal: 15; total: 15
Enter a positive integer (0 to quit): 10
loop cycle: 2
subtotal: 55; total: 70
Enter a positive integer (0 to quit): 2
loop cycle: 3
subtotal: 3; total: 73
Enter a positive integer (0 to quit): 0
Loop executed 3 times
根据书上所说及自己的理解,partb中的两个static变量都是存在静态存储区,虽然作用域不一样,但生存期是一样的,都应该生存到文件执行结束,这样两个变量的值应该是一样的,为什么运行结果不一样呢,求高手指点

回复列表 (共5个回复)

沙发

你main函数里面for循环i从value到0.
当i==0时,调用accumulate(0)会在输出值的同时让subtotal=0.

板凳

static 变量不是被初始化一次之后就不再管了么?

3 楼

我的意思是说static只能被初始化一次,以后不会再被初始化了么

4 楼

第一次...这叫初始化。

但是程序里你还是可以去改变static变量的值的。

if (k <= 0)
{
    printf ("loop cycle: %d\n", count);
    printf ("subtotal: %d; total: %d\n", subtotal, total);
    subtotal = 0;
}

注意看这一段里,改变了subtotal的值,total在这里没有相应变动。

所以只有第一次的值两者是相同的,后面就不一样了

5 楼

static只会初始化一次。

我来回复

您尚未登录,请登录后再回复。点此登录或注册