注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

0与1构筑世界,程序员创造时代

软件架构设计 Java编程

 
 
 

日志

 
 

C学习笔记 - 坑爹的关键字static | C Language study note - the keyword static  

2012-07-28 23:58:55|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
熟悉了面向对象的Java语言,因工作需要,转向PHP这种半面向对象半面向过程的语言时,发现一些面向对象的设计在PHP中行不通,只能采用变通的方式。现在学习Unix C编程,完全面向过程,让人更加痛苦。而且,前面的一些概念惯性,在学习C的过程中踩了不少陷井。关键字static就是其中一个。

Java中的static

在Java中,static关键字用来修饰方法,变量和代码块,称为静态方法,静态变量和静态代码块。
  • 静态方法:独立于实例,可通过类名直接调用,不可抽象,必须被实现。不可访问实例中的变量和方法。
  • 静态变量:在JVM内存中只有一份拷贝,在类的加载过程中完成。可通过类名来调用。
  • 静态代码块:由JVM在加载类时执行,在一个JVM进程中只会执行一次。

C中的static

在C中,static关键字可以用来修饰方法和变量,称为静态方法和静态变量。
  • 静态方法:方法只在当前文件中可见,起到模块解耦的作用。
  • 静态变量:变量存放在程序的全局存储区中,下一次调用时会保存着上一次的值;仅在自己的作用范围内可见,静态局部变量仅在当前方法可见,静态全局变量仅在当前文件可见。

1、静态局部变量。
1)保存上一次的值。
a.c 源文件:
 #include <stdio.h>
 #include <stdlib.h>

 void runLocalStaticVar(void)
 {
    
static int a = 5;    // 赋值只会执行一次
     int b = 5;              // 赋值每次都会执行
     a ++;
     printf(
"a=%d, b=%d\n", a, b);
 }
 
 
int main(int argc, char *argv[])
 {
    
int x = 0;
    
for(x=0; x<5; x++)
     {
         runLocalStaticVar();
     }
 
    
return EXIT_SUCCESS;
 }


执行结果如下:
a=6, b=5
a=7, b=5
a=8, b=5
a=9, b=5
a=10, b=5

2、静态全局变量。
1)可见性:仅在当前文件可见。
b.h 源文件:
 void runGlobalStaticVar(void);

b.c 源文件:
 #include <stdio.h>
 #include <stdlib.h>
 #include "b.h"
 
 static int a = 5;   // 定义了静态全局变量
 int b = 5;
 
 static void hello(void)  
// 定义了静态方法
 {  
     printf("say hello\n");
 }

 void runGlobalStaticVar(void)
 {
     a ++;
     b ++;
    
printf("a=%d, b=%d\n", a, b);
     hello();
 }

c.c 源文件:
 #include <stdio.h>
 #include <stdlib.h>

  // extern static int a;  // 如果启用这行,在编译的时候将报错:error: multiple storage classes in declaration specifiers
 
// extern int a;
  extern int b;
 
 void runGlobalStaticVar
Again(void)
 {
     // a ++;        // 如果将这行与extern int a; 一同启用,在编译时将报错:undefined reference to `a'
     b ++;
    
printf("b=%d\n", b);
 }
 
 int main(int argc, char *argv[])
 {
     int x = 0;
     for(x=0; x<5; x++)
     {  
         runGlobalStaticVar();
     }
 
     printf("------------------\n");
    
     for(x=0; x<5; x++)
     {  
         runGlobalStaticVarAgain();
     }
    
     // hello();   如果启用这行,编译时将报错:warning: implicit declaration of function ‘hello’ 和 undefined reference to `hello'
    
     return EXIT_SUCCESS;
 }


编译命令:
 gcc -Wall -o d b.c c.c

执行结果如下:
a=6, b=6
say hello
a=7, b=7
say hello
a=8, b=8
say hello
a=9, b=9
say hello
a=10, b=10
say hello
------------------
b=11
b=12
b=13
b=14
b=15 

<正文结束> 

文章声明


作者:傲风(aofengblog@163.com)       编写时间:2012年07月28日

网址:http://aofengblog.blog.163.com

作者保留所有权利,转载请保留文章全部内容!


  评论这张
 
阅读(1653)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017