第一章:C语言关键字
1. C语言关键字有哪些
每次讲关键字之前,我总是问学生:C 语言有多少个关键字?sizeof 怎么用?它是函数吗?有些学生不知道C 语言有多少个关键字,大多数学生往往告诉我sizeof 是函数,因为它后面跟着一对括号。当投影仪把这32 个关键字投到幕布上时,很多学生表情惊讶。有些关键字从来没见过,有的惊讶C 语言关键字竟有32 个之多。更有甚者,说大学老师告诉他们sizeof 是函数,没想到它居然是关键字!由此可想而知,大学的计算机教育是多么失败!
C 语言标准定义的32 个关键字:
auto 声明自动变量,缺省时编译器一般默认为auto int 声明整型变量
double 声明双精度变量 long 声明长整型变量 char 声明字符型变量 float 声明浮点型变量 short 声明短整型变量
signed 声明有符号类型变量 unsigned 声明无符号类型变量 struct 声明结构体变量 union 声明联合数据类型 enum 声明枚举类型 static 声明静态变量 switch 用于开关语句 case 开关语句分支
default 开关语句中的“其他”分支 break 跳出当前循环 register 声明寄存器变量 const 声明只读变量
volatile 说明变量在程序执行中可被隐含地改变 typedef 用以给数据类型取别名(当然还有其他作用)
extern 声明变量是在其他文件正声明(也可以看做是引用变量) return 子程序返回语句(可以带参数,也可不带参数) void 声明函数无返回值或无参数,声明空类型指针
continue 结束当前循环,开始下一轮循环 do 循环语句的循环体
while 循环语句的循环条件 if 条件语句
else 条件语句否定分支(与if 连用) for 一种循环语句(可意会不可言传) goto 无条件跳转语句
sizeof 计算对象所占内存空间大小
下面的篇幅就一一讲解这些关键字。但在讲解之前先明确两个概念:
什么是定义?什么是声明?它们有何区别?举个例子: A)int i;
B)extern int i;(关于extern,后面解释)
哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一人能回答上这个问题。这个十分重要的概念在大学里从来没有被提起过!
什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。^_^),它们就同生共死,终生不离不弃。并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。
什么是声明:有两重含义。如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了(伊人已嫁,吾将何去何从?何以解忧,唯有稀粥),下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声明最典型的例子就是函数参数的声明,例如: void fun(int i, char c);
好,这样一解释,我们可以很清楚的判断:A)是定义;B)是声明。那他们的区别也很清晰了。记住,定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存(一个抱伊人,一个喝稀粥。^_^)。
2. C语言auto—最宽恒大量的关键字
auto:它很宽恒大量的,你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto
的。
3. C语言register关键字—最快的关键字
register:这个关键字请求编译器尽可能的将变量存在CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
一、皇帝身边的小太监----寄存器
不知道什么是寄存器?那见过太监没有?没有?其实我也没有。没见过不要紧,见过就麻烦大了。^_^,大家都看过古装戏,那些皇帝们要阅读奏章的时候,大臣总是先将奏章交给皇帝旁边的小太监,小太监呢再交给皇帝同志处理。这个小太监只是个中转站,并无别的功能。
好,那我们再联想到我们的CPU。CPU 不就是我们的皇帝同志么?大臣就相当于我们的内存,数据从他这拿出来。那小太监就是我们的寄存器了(这里先不考虑CPU 的高速缓存区)。数据从内存里拿出来先放到寄存器,然后CPU 再从寄存器里读取数据来处理,处理完后同样把数据通过寄存器存放到内存里,CPU 不直接和内存打交道。这里要说明的一点是:小太监是主动的从大臣手里接过奏章,然后主动的交给皇帝同志,但寄存器没这么自觉,它从不主动干什么事。一个皇帝可能有好些小太监,那么一个CPU 也可以有很多寄存器,不同型号的CPU 拥有寄存器的数量不一样。
为啥要这么麻烦啊?速度!就是因为速度。寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。进水楼台先得月嘛,它离CPU 很近,CPU 一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!
二、使用register 修饰符的注意点
虽然寄存器的速度非常快,但是使用register 修饰符也有些限制的:register 变量必须是能
被CPU 寄存器所接受的类型。意味着register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“&”来获取register 变量的地址
4. C语static关键字—言最名不符实的关键字
不要误以为关键字static 很安静,其实它一点也不安静。这个关键字在C 语言里主要有两个作用,C++对它进行了扩展。
一、修饰变量
第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。 静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern ***。恶心吧?要想不恶心,很简单,直接在文件顶端定义不就得了。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。 static int j; void fun1(void) {
static int i = 0; i ++; }
void fun2(void) { j = 0; j++; } intmain() {
for(k=0; k<10; k++)
{ fun1(); fun2(); } return 0; }
i 和j 的值分别是什么,为什么?
二、修饰函数
第二个作用:修饰函数。函数前加static 使得函数成为静态函数。
但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。
关键字static 有着不寻常的历史。起初,在C 中引入关键字static 是为了表示退出一个块后仍然存在的局部变量。随后,static 在C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static 关键字来表示这第二种含义。
当然,C++里对static 赋予了第三个作用,这里先不讨论,有兴趣的可以找相关资料研究。
5. c语言基本数据类型short、int、long、char、float、double
C 语言包含的数据类型如下图所示:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库第一章:C语言关键字 - 图文在线全文阅读。
相关推荐: