查看: 4055|回复: 12

[其他] 写好C代码--认识static的作用--堪称精辟

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-27 08:40
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    5

    主题

    91

    帖子

    0

    高级会员

    Rank: 4

    积分
    672
    最后登录
    2020-5-27
    发表于 2016-3-2 09:50:36 | 显示全部楼层 |阅读模式
    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
    1)先来介绍它的第一条也是最重要的一条:隐藏。
    当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。
    下面是a.c的内容
    char a = 'A'; // global variable
    void msg()
    {
        printf("Hello\n");
    }

    下面是main.c的内容
    int main(void)
    {   
        extern char a;    // extern variable must be declared before use
        printf("%c ", a);
        (void)msg();
        return 0;
    }

    程序的运行结果是:
    AHello
    你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
    如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
    2static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。
    #include <stdio.h>

    int fun(void){
        static int count = 10;    // 事实上此赋值语句从来没有执行过
        return count--;
    }

    int count = 1;

    int main(void)
    {   
        printf("global\t\tlocal static\n");
        for(; count <= 10; ++count)
            printf("%d\t\t%d\n", count, fun());   
       
        return 0;
    }

    程序的运行结果是:
    global         local static
    1              10
    2              9
    3              8
    4              7
    5              6
    6              5
    7              4
    8              3
    9              2
    10             1
    (3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。不妨做个小实验验证一下。
    #include <stdio.h>

    int a;

    int main(void)
    {
        int i;
        static char str[10];

        printf("integer: %d;  string: (begin)%s(end)", a, str);

        return 0;
    }

    程序的运行结果如下
    integer: 0; string: (begin)(end)
    最后对static的三条作用做一句话总结。首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。
    我用过非常好,朋友们不妨试试看!

    我知道答案 目前已有12人回答
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    555

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    1343
    最后登录
    2018-10-23
    发表于 2016-3-2 10:01:31 | 显示全部楼层
    谢谢分享               
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-3 11:19
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    50

    主题

    1万

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    14090
    最后登录
    2024-4-19
    发表于 2016-3-2 10:14:07 | 显示全部楼层
    又长知识了。。。 null.png null1.png null2.png null3.png null4.png null5.png null6.png null7.png null8.png null9.png
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2016-3-2 11:10:03 | 显示全部楼层
    谢谢楼主分享!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-1-12 00:23
  • 签到天数: 745 天

    连续签到: 1 天

    [LV.9]以坛为家II

    27

    主题

    1万

    帖子

    26

    金牌会员

    Rank: 6Rank: 6

    积分
    6868
    最后登录
    2020-7-15
    发表于 2016-3-2 11:26:31 | 显示全部楼层
    学习了,谢谢分享!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2016-10-20 09:45
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    80

    主题

    1038

    帖子

    5

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2223
    最后登录
    2023-11-20
    发表于 2016-3-2 12:31:11 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-6-17 09:00
  • 签到天数: 100 天

    连续签到: 1 天

    [LV.6]常住居民II

    0

    主题

    152

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    360
    最后登录
    2021-6-17
    发表于 2016-3-2 16:26:04 | 显示全部楼层
    学习一下,谢谢
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2016-3-2 18:56:54 | 显示全部楼层
    学习了,很实用。
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2023-6-2 13:32
  • 签到天数: 272 天

    连续签到: 1 天

    [LV.8]以坛为家I

    44

    主题

    995

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    4463
    最后登录
    2023-6-2
    发表于 2016-3-3 11:46:31 | 显示全部楼层
    谢谢楼主分享.
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    59

    帖子

    0

    注册会员

    Rank: 2

    积分
    183
    最后登录
    2016-4-26
    发表于 2016-3-9 12:27:21 | 显示全部楼层
    总结的不错
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-11 23:31 , Processed in 0.128881 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表