每次讲关键字之前,我总是问学生: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)int i;

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

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

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

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

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

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

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

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

同一个变量或对象。

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

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

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

现多次。

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

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

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

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

void fun(int i, char c);

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

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

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

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 修饰的变量总是存在内存的静态区,所以即使这个函数运行结

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

c语言 关键字 and,C语言的关键字(一)相关推荐

  1. c语言 char转int_C语言关键字及进制的转换你都知道吗?

    ​前面我们讲过 C语言简洁.紧凑 使用方便.灵活 那是什么使得C语言这么方便呢? 那就是关键字,或称保留字 C语言的关键字共有32个 根据关键字的作用 可分为 数据类型关键字 控制语句关键字 存储类型 ...

  2. 根据作用C语言关键字分为,C语言 关键字

    关键字就是已被C语言本身使用,不能作其它用途使用的字.例如关键字不能用作变量名.函数名等 由ANSI标准定义的C语言关键字共32个. 根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两 ...

  3. js与c语言效率_JavaScript控制流及关键字与C语言之比较

    学习JavaScript控制流及关键字概念前,对有过C语言学习经验的同学来说,那么关键字,控制语句概念并不陌生.我们先来看看C语言吧: C语言的32个关键字和9种控制语句 9种控制语句: if.if- ...

  4. 【C语言重点难点精讲】关键字精讲

    必读: C语言关键字是一个非常重要的话题,因为它能在相当的程度上将C语言的核心内容串联起来,起到一种提纲挈领的效果 下面的内容重点提及的是相应关键字特别值得注意的地方,这些地方是我们经常忽略的,而且考 ...

  5. C语言深度解剖读书笔记(1.关键字的秘密)

    开始本节学习笔记之前,先说几句题外话.其实对于C语言深度解剖这本书来说,看完了有一段时间了,一直没有时间来写这篇博客.正巧还刚刚看完了国嵌唐老师的C语言视频,觉得两者是异曲同工,所以就把两者一起记录下 ...

  6. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  7. c语言自定义关键词,C语言关键字详解

    相对于其他语言来说,C语言的关键字算是少的了.在C98中关键子总共只有32个,我们来分析一下每个关键字在C语言中它独特的作用. 1.关于数据类型的关键字 (1) char :声明字符型变量或函数 (2 ...

  8. c语言系统关键字6,C语言语法之关键字

    由ANSI标准定义的C语言关键字共32个: auto double int struct break else long switch case enum register typedef char ...

  9. 输入c语言用哪个关键字,在C语言中什么叫关键字,怎么用

    C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字.控制语句关键字.存储类型关键字和其它关键字四类. 1.数据类型关键字(12个): (1) char :声明字符型变量或函数 (2) ...

最新文章

  1. AI顶会组团“改版”:NeurIPS 2020宣布deadline延期三周
  2. css 固定内容显示范围,css之让文字在一定范围内显示,不超过固定的宽度和高度...
  3. Tomcat启动报错整理
  4. python从txt拿取数据_python requests + xpath 获取分页详情页数据存入到txt文件中
  5. Ceres和g2o的配置和使用
  6. php strus2 漏洞攻击_关于对部分重要漏洞进行安全加固的预警通报
  7. Linux最常用的基础命令 下篇
  8. 02_javaSE面试题:单例设计模式
  9. 区块链 性能压力测试工具Caliper
  10. 硬件工程师痛苦的BOM整理工作,幸好123BOM工具把我拽出水深火热之的BOM编辑工作,超级好用的研发BOM工具,集BOM编辑、BOM合并、BOM拆分、BOM整理等
  11. 《给情绪多点时间》读后感4000字
  12. 进程已结束,退出代码-1073740791(0xC0000409)
  13. uni-app实现本地打包安卓APK
  14. 信息安全系统所需要遵循的基本原则有哪些?
  15. vscode中使用prettier后html,css格式化不生效的问题
  16. UI5-Fiori初学者导航
  17. 原理 拉普拉斯金字塔_图像金字塔(高斯金字塔、拉普拉斯金字塔)
  18. ubuntu gcc 安装 使用
  19. 豌豆射手-第13届蓝桥杯Scratch选拔赛真题精选
  20. vivado添加文件之后出现non-module file的问题

热门文章

  1. 【python画图】画一条水平直线
  2. Java基础——main方法
  3. python学习拾遗(五)——Matplotlib绘图可视化
  4. 虚拟机上设置静态IP的做法
  5. 没有四肢的生命 - 尼克·武伊契奇
  6. OpenCV_Canny图像边缘检测
  7. mysql 2147483647_「2147483647」mysql插入数字都变成2147483647的解决方法 - seo实验室
  8. 从零开始做游戏 - 膝盖中了一箭
  9. MySql-数据库命名规范
  10. Elasticsearch 8.0报错:received plaintext http traffic on an https channel, closing connection