友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
九色书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

c语言深度剖析-第1章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



本内容由凯幽网【痴情流氓】制作,要更多请到手机网mrpyy下载

第一章关键字

每次讲关键字之前,我总是问学生:C语言有多少个关键字?sizeof怎么用?它是函数

吗?有些学生不知道C语言有多少个关键字,大多数学生往往告诉我sizeof是函数,因为

它后面跟着一对括号。当投影仪把这32个关键字投到幕布上时,很多学生表情惊讶。有些

关键字从来没见过,有的惊讶C语言关键字竟有32个之多。更有甚者,说大学老师告诉他

们sizeof是函数,没想到它居然是关键字!由此可想而知,大学的计算机教育是多么失败!

表(1。1)C语言标准定义的32个关键字

关键字意义

auto声明自动变量,缺省时编译器一般默认为auto

int声明整型变量

double声明双精度变量

long声明长整型变量

char声明字符型变量

float声明浮点型变量

short声明短整型变量

signed声明有符号类型变量

unsigned声明无符号类型变量

struct声明结构体变量

union声明联合数据类型

enum声明枚举类型

static声明静态变量

switch用于开关语句

case开关语句分支

default开关语句中的“其他”分支

break跳出当前循环

register声明寄存器变量

const声明只读变量

volatile说明变量在程序执行中可被隐含地改变

typedef用以给数据类型取别名(当然还有其他作用)





下面的篇幅就一一讲解这些关键字。但在讲解之前先明确两个概念:

什么是定义?什么是声明?它们有何区别?

举个例子:

A)inti;

B)externinti;(关于extern,后面解释)

哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一

人能回答上这个问题。这个十分重要的概念在大学里从来没有被提起过!

什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它

取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和

这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。^_^),它们就同

生共死,终生不离不弃。并且这块内存的位置也不能被改变。一个变量或对象在一定的区

域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义

同一个变量或对象。

什么是声明:有两重含义,如下:

第一重含义:告诉编译器,这个名字已经匹配到一块内存上了(伊人已嫁,吾将何去何

从?何以解忧,唯有稀粥),下面的代码用到变量或对象是在别的地方定义的。声明可以出

现多次。

第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量

名或对象名。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预

订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声

明最典型的例子就是函数参数的声明,例如:

voidfun(inti;charc);

好,这样一解释,我们可以很清楚的判断:A)是定义;B)是声明。

那他们的区别也很清晰了。记住,定义声明最重要的区别:定义创建了对象并为这个

extern声明变量是在其他文件正声明(也可以看做是引用变量)

return子程序返回语句(可以带参数,也可不带参数)

void声明函数无返回值或无参数,声明空类型指针

continue结束当前循环,开始下一轮循环

do循环语句的循环体

while循环语句的循环条件

if条件语句

else条件语句否定分支(与if连用)

for一种循环语句(可意会不可言传)

goto无条件跳转语句

sizeof计算对象所占内存空间大小





对象分配了内存,声明没有分配内存(一个抱伊人,一个喝稀粥。^_^)。

1。1,最宽恒大量的关键字auto

auto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量

都是auto的。

1。2,最快的关键字register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内

存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么

几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量放

入寄存器吧,轮也可能轮不到你。

1。2。1,皇帝身边的小太监寄存器

不知道什么是寄存器?那见过太监没有?没有?其实我也没有。没见过不要紧,见过就

麻烦大了。^_^,大家都看过古装戏,那些皇帝们要阅读奏章的时候,大臣总是先将奏章交

给皇帝旁边的小太监,小太监呢再交给皇帝同志处理。这个小太监只是个中转站,并无别

的功能。

好,那我们再联想到我们的CPU。CPU不就是我们的皇帝同志么?大臣就相当于我们

的内存,数据从他这拿出来。那小太监就是我们的寄存器了(这里先不考虑CPU的高速缓

存区)。数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理

完后同样把数据通过寄存器存放到内存里,CPU不直接和内存打交道。这里要说明的一点

是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉,

它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU也可以有很多寄存器,

不同型号的CPU拥有寄存器的数量不一样。

为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只

不过其存取速度要比内存快得多。进水楼台先得月嘛,它离CPU很近,CPU一伸手就拿到

数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然

它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!

1。2。2,使用register修饰符的注意点

虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:register变量必须是

能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小

于或等于整型的长度。而且register变量可能不存放在内存中,所以不能用取址运算符“&”

来获取register变量的地址。





1。3,最名不符实的关键字static

不要误以为关键字static很安静,其实它一点也不安静。这个关键字在C语言里主要有

两个作用,C++对它进行了扩展。

1。3。1,修饰变量

第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法

使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些

代码行也不能使用它。想要使用就得在前面再加extern***。恶心吧?要想不恶心,很简单,

直接在文件顶端定义不就得了。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他

函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结

束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

staticintj;

voidfun1(void)



staticinti=0;

i++;



voidfun2(void)



j=0;

j++;



intmain()



for(k=0;k
返回目录 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!