| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 418 人关注过本帖
标题:C语言关键字之static【经验分享】
只看楼主 加入收藏
MRPutin
Rank: 2
等 级:论坛游民
帖 子:21
专家分:43
注 册:2012-3-28
收藏
 问题点数:0 回复次数:2 
C语言关键字之static【经验分享】
C语言中static的关键字,有诸多特性,有编程经历的朋友应该深有感触。以局部静态变量来说,它有三个特点:

 生存周期:与程序之生命相始终;
作用范围:仅在局部(这一点,同普通变量无区别。
赋值:仅在编译阶段赋且仅赋初值一次,注意是初值,不是说赋值。
    static的第三个特点最重要,也最容易让人忽略。下面举例子来说。请看下面简单的代码。

代码1:

#include "stdio.h"

long fac(int n)

{

   static long f=1;

   f=f*n;

   return f;

}

 

void main(void)

{

   int i;

   for(i=1;i<=5;i++)

   {

      printf("%d!=%d\n",i,fac(i));

    }

}

 

请问输出结果是什么呢?没错,是1到5,每一个数的阶乘。

仔细的读一下代码,你会不会有这样的疑问红色标注的语句static long f=1;不是被调用了五次吗?这也f的值在每次调用的时候都被赋值1啊,比如fac(4),f应该等于f*4=1*4=4啊,怎么会是四的阶乘呢?仔细品味下static的第三个特点,仅在编译阶段赋且仅赋初值一次。你是不是明白了呢。

代码2:

#include "stdio.h"

long fac(int n)

{

   static long f;

   f=1;

   f=f*n;

   return f;

}

 

void main(void)

{

   int i;

   for(i=1;i<=5;i++)

   {

      printf("%d!=%d\n",i,fac(i));

    }

}

   代码2,将代码1中的红色语句形式上拆分成了两部分。结果是否一样呢?结果,差着十万八千里呢!为什么呢?还是一个赋初值的问题。static long f;其实,该语句就是赋初值语句,不过是默认值0罢了。下面那句f=1;根本就不是赋初值了,它在每一次函数的调用时都会执行一次。就是这么一个小小的区别,导致代码1和代码2结果大相径庭

搜索更多相关主题的帖子: include long 关键字 C语言 return 
2012-04-05 20:25
YUZHENYUAN1
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-4-5
收藏
得分:0 
好东西值的分享,赞一个。。
2012-04-05 22:55
flyee
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2008-9-7
收藏
得分:0 
不错,
2012-04-12 09:14
快速回复:C语言关键字之static【经验分享】
数据加载中...
 
   



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

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