| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 417 人关注过本帖
标题:有些感念不明白,请高手指点?
只看楼主 加入收藏
wuxianyi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-2-10
结帖率:100%
收藏
 问题点数:0 回复次数:3 
有些感念不明白,请高手指点?
C语言中有关于存储类和生存期的好多概念,不是很明白,请高手指点:
1,具有代码块作用域的静态变量
2,具有外部链接的静态变量
3,具有内部链接的静态变量
主要是1和3不是很能分清楚,他们的生存期到底是什么时间不是很明白。
贴一段程序出来,大家给解释一下吧:
// parta.c --- various storage classes
#include <stdio.h>
void report_count();
void accumulate(int k);
int count = 0;       // file scope, external linkage

int main(void)
{
    int value;       // automatic variable
    register int i;  // register variable
   
    printf("Enter a positive integer (0 to quit): ");
    while (scanf("%d", &value) == 1 && value > 0)
    {
        ++count;     // use file scope variable
        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);
}
// partb.c -- rest of the program
#include <stdio.h>

extern int count;       // reference declaration, external linkage

static int total = 0;   // static definition, internal linkage
void accumulate(int k); // prototype


void accumulate(int k)  // k has block scope, no linkage
{
    static int subtotal = 0;  // static, no linkage
   
    if (k <= 0)
    {
        printf("loop cycle: %d\n", count);
        printf("subtotal: %d; total: %d\n", subtotal, total);
        subtotal = 0;
    }
    else
    {
        subtotal += k;
        total += k;
    }
}
parta和partb是两个不同的文件。大家可以运行一下,对于subtotal和total是如何赋值和重置的真的不是很明白?请高手指点?
搜索更多相关主题的帖子: 感念 
2010-05-22 19:23
skyuser213
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:37
专家分:117
注 册:2010-5-9
收藏
得分:0 
subtotal 是函数里的静态变量,total 是partb.c文件的静态变量
他们的生命周期从程序运行开始到程序关闭,静态变量只会初始化一次,编译器给静态变量一个标志位,
初值为0第一次初始化会改成1, 下次再遇到初始化就检查标志如果是1就跳过不会在赋值
subtotal 的作用域只在accumulate()函数里可以访问,而total只可以在partb.c文件中访问。其他文件不可访问

[ 本帖最后由 skyuser213 于 2010-5-26 09:55 编辑 ]
2010-05-22 19:34
wuxianyi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-2-10
收藏
得分:0 
回复 2楼 skyuser213
图片里是运行的结果。我对这个结果不是很明白。
   
subtotal是如何重置的,total为什么就可以一直保持。你可以把他们赋值的过程再描述的详细点吗?
2010-05-23 18:21
wuxianyi
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2009-2-10
收藏
得分:0 
以下是引用wuxianyi在2010-5-23 18:21:34的发言:

图片里是运行的结果。我对这个结果不是很明白。
   
subtotal是如何重置的,total为什么就可以一直保持。你可以把他们赋值的过程再描述的详细点吗?
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-05-23 18:22
快速回复:有些感念不明白,请高手指点?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017600 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved