c语言关键字的用法详解Word格式.doc

上传人:wj 文档编号:6252243 上传时间:2023-05-06 格式:DOC 页数:7 大小:52KB
下载 相关 举报
c语言关键字的用法详解Word格式.doc_第1页
第1页 / 共7页
c语言关键字的用法详解Word格式.doc_第2页
第2页 / 共7页
c语言关键字的用法详解Word格式.doc_第3页
第3页 / 共7页
c语言关键字的用法详解Word格式.doc_第4页
第4页 / 共7页
c语言关键字的用法详解Word格式.doc_第5页
第5页 / 共7页
c语言关键字的用法详解Word格式.doc_第6页
第6页 / 共7页
c语言关键字的用法详解Word格式.doc_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

c语言关键字的用法详解Word格式.doc

《c语言关键字的用法详解Word格式.doc》由会员分享,可在线阅读,更多相关《c语言关键字的用法详解Word格式.doc(7页珍藏版)》请在冰点文库上搜索。

c语言关键字的用法详解Word格式.doc

1.3.1在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

inttestStatic()

{

 

intx=1;

x++;

returnx;

}

main()

inti;

for(i=0;

i<

5;

i++)

printf("

%d\n"

testStatic());

getch();

==》22222

static 

==》23456

1.3.2在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

1.3.3在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

static关键字是C, 

C++中都存在的关键字, 

它主要有三种使用方式, 

其中前两种只指在C语言中使用, 

第三种在C++中使用(C,C++中具体细微操作不尽相同, 

本文以C++为准).

(1)局部静态变量

(2)外部静态变量/函数

(3)静态数据成员/成员函数

下面就这三种使用方式及注意事项分别说明

1.3.4局部静态变量

在C/C++中, 

局部变量按照存储形式可分为三种auto, 

static, 

register

(<

C语言程序设计(第二版)>

谭浩强, 

第174-175页)

与auto类型(普通)局部变量相比, 

static局部变量有三点不同

1.3.4.1存储空间分配不同

auto类型分配在栈上, 

属于动态存储类别, 

占动态存储区空间, 

函数调用结束后自动释放, 

而static分配在静态存储区, 

在程序整个运行期间都不释放. 

两者之间的作用域相同, 

但生存期不同.

1.3.4.2static局部变量在所处模块在初次运行时进行初始化工作, 

且只操作一次

3.对于局部静态变量, 

如果不赋初值, 

编译期会自动赋初值0或空字符, 

而auto类型的初值是不确定的. 

(对于C++中的class对象例外, 

class的对象实例如果不初始化, 

则会自动调用默认构造函数, 

不管是否是static类型)

特点:

 

static局部变量的”记忆性”与生存期的”全局性”

所谓”记忆性”是指在两次函数调用时, 

在第二次调用进入时, 

能保持第一次调用退出时的值. 

示例程序一

#include 

<

iostream>

using 

namespace 

std;

void 

staticLocalVar()

{

static 

int 

0;

// 

运行期时初始化一次, 

下次再调用时, 

不进行初始化工作

cout<

"

a="

a<

endl;

++a;

}

int 

main()

staticLocalVar();

第一次调用, 

输出a=0

第二次调用, 

记忆了第一次退出时的值, 

输出a=1

return 

1.4应用:

1.4.1 

利用”记忆性”, 

记录函数调用的次数(示例程序一)

1.4.2利用生存期的”全局性”

改善”return 

pointer 

reference 

to 

local 

object”的问题. 

Local 

object的问题在于退出函数, 

生存期即结束,. 

利用static的作用, 

延长变量的生存期.

示例程序二:

// 

IP 

address 

string 

format

Used 

in 

Ethernet 

Frame 

and 

Header 

analysis

const 

char 

IpToStr(UINT32 

IpAddr)

strBuff[16];

static局部变量, 

用于返回地址有效

const 

unsigned 

*pChIP 

(const 

*)&

IpAddr;

sprintf(strBuff, 

%u.%u.%u.%u"

 

pChIP[0], 

pChIP[1], 

pChIP[2], 

pChIP[3]);

return 

strBuff;

注意事项:

1. 

“记忆性”, 

程序运行很重要的一点就是可重复性, 

而static变量的”记忆性”破坏了这种可重复性, 

造成不同时刻至运行的结果可能不同.

2. 

“生存期”全局性和唯一性. 

普通的local变量的存储空间分配在stack上, 

因此每次调用函数时, 

分配的空间都可能不一样, 

而static具有全局唯一性的特点, 

每次调用时, 

都指向同一块内存, 

这就造成一个很重要的问题 

---- 

不可重入性!

!

这样在多线程程序设计或递归程序设计中, 

要特别注意这个问题.

(不可重入性的例子可以参见<

effective 

C++ 

(2nd)>

(影印版)第103-105页)

下面针对示例程序二, 

分析在多线程情况下的不安全性.(为方便描述, 

标上行号)

① 

② 

{

③ 

④ 

⑤ 

⑥ 

⑦ 

}

假设现在有两个线程A,B运行期间都需要调用IpToStr()函数, 

将32位的IP地址转换成点分10进制的字符串形式. 

现A先获得执行机会, 

执行IpToStr(), 

传入的参数是0x0B090A0A, 

顺序执行完应该返回的指针存储区内容是:

”10.10.9.11”, 

现执行到⑥时, 

失去执行权, 

调度到B线程执行, 

B线程传入的参数是0xA8A8A8C0, 

执行至⑦, 

静态存储区的内容是192.168.168.168. 

当再调度到A执行时, 

从⑥继续执行, 

由于strBuff的全局唯一性, 

内容已经被B线程冲掉, 

此时返回的将是192.168.168.168字符串, 

不再是10.10.9.11字符串.

二、外部静态变量/函数

在C中static有了第二种含义:

但为了限制全局变量/函数的作用域, 

函数或变量前加static使得函数成为静态函数。

注意此时, 

对于外部(全局)变量, 

不论是否有static限制, 

它的存储区域都是在静态存储区, 

生存期都是全局的. 

此时的static只是起作用域限制作用, 

限定作用域在本模块(文件)内部.

示例程序三:

//file1.cpp

varA;

varB;

extern 

void 

funA()

……

funB()

//file2.cpp

使用file1.cpp中定义的全局变量

错误!

varA是static类型, 

无法在其他文件中使用

vod 

funA();

使用file1.cpp中定义的函数

funB();

无法使用file1.cpp文件中static函数

2.extern用法

外部函数:

(1)在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可供其它文件调用。

如函数首部可以写为

externintfun(inta,intb)

这样,函数fun就可以为其它文件调用。

C语言规定,如果在定义函数时省略extern,则隐含为外部函数。

(2)在需要调用此函数的文件中,用extern声明所用的函数是外部函数。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2