本文系本站原创,欢迎转载! 转载请注明出处:

http://blog.csdn.net/mr_raptor/article/details/7209452

++++++++++++++++++++++++++++++++++++++++++

关键字概述

很多朋友看到这儿可能会有疑问,往往其它讲C语言的书籍都是从HelloWorld,数据类型开始C语言学习的,为什么我们要从C语言的关键字开始呢?关于这点,我有两点需要说明:

  • 本章节面向的读者对象是有一定的C语言基础知识的朋友(至少应该学习过大学里的C语言程序设计等类似的课程)
  • 本章节结合了作者多年嵌入式工作、研究、教学经验而作,由计算机底层硬件到上层软件设计融会贯通,中间有大量的深入浅出的示例

在我对C语言进行培训的时候,往往就是从C语言的关键字入手,因为C语言的关键字蕴含了C语言的全部的词汇,囊括了C语言里大量知识要点,从C语言关键字开刀,首先可以对你之前所学知识进行复习,其次,切磋一下和作者有什么不同的见解,废话少说,让我们从关键字开始。

关键字,又叫保留字,是编译器能识别的特殊单词,每种计算机语言都会有其特定的关键字,C语言中有32位关键字。

问:为什么要有关键字?

答:关键字是程序设计中代码必须包含的部分,编译器在编译C代码的时候,必然要将C代码进行断句,将代码分割成不同部分,将这些部分分别进行解析和编译。

int a = 10;  int是关键字,编译器看到它出现,会将它后面的字符作为整型变量名来处理。

也就是说,关键字是编译器能认识的特殊字符串符号。

关键字的数量是由编译器来决定的,关键字大小写敏感性也和编译器有关。如果关键字写错,那么在代码的解析过程中,编译器就会报错:符号不能识别或符号不能被解析。

每个关键字有着不同的意义,用来告知编译器编程者的目的。

关键字分类

32个关键字每个都有不同的意义,大体上根据其意义可以分为以下几类(下划线表示不同分类中有交集):

1)        非常见:auto、register、volatile、goto

2)        存储相关:const、extern、register、volatile、static、auto、signed、unsigned

3)        数据类型:char、short、int、float、long、double、struct、union、enum、void

4)        逻辑控制:if、else、for、while、do、break、continue、return、default、switch、case、goto

5)        特殊用途:sizeof、typedef

我相信,大部分关键字我们都能认识,并且能够使用,有一部分可能很少见,甚至一点印象也没有:它也是C语言的关键字???

1.         隐形刺客:auto

描述:auto关键字在我们写的代码里几乎看不到,但是它又无处不在,它是如此的重要,又是如此的与世无争,默默的履行着自己的义务,却又隐姓埋名。

作用:C程序是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。例如:

[cpp] view plaincopy
  1. int fun(){
  2. int a = 10;      // auto int a = 10;
  3. // do something
  4. return 0;
  5. }

整型变量a在fun函数内声明,其作用域为fun函数内,出来fun函数,不能被引用,a变量为自动变量。也就是说编译器会有int a = 10之前会加上auto的关键字。

auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。

内存栈:

如果大家学过数据结构,应该知道,栈就是先进后出的数据结构。它类似于我们用箱子打包书本,第一本扔进去大英,第二本扔进行高数,第三本扔进行小说,那么取书的时候,先取出来第一本是小说,第二是高数,第三本是大英。

栈的操作为入栈和出栈,入栈就是向箱子里扔书,出栈就是从箱子里取书。那么这和我们的auto变量分配空间有什么关系呢?

由于一个程序中可能会有大量的变量声明,每个变量都会占有一定的内存空间,而内存空间对于计算机来说是宝贵的硬件资源,因此合理的利用内存是编译器要做的一个主要任务。有的变量是一次性使用的,如局部变量。有的变量要伴随着整个程序来使用的,如全局变量。为了节省内存空间,优化性能,编译器通常会将一次性使用的变量分配在栈上。也就是说,代码中声明一个一次性变量,就在栈上进行入栈操作。当该变量使用完了(生命周期结束),进行出栈操作。这样,在执行不同的函数的时候,就会在一个栈上进行出入栈操作,也就是说它们在频繁的使用一个相同的内存空间,从而可以更高效的利用内存。

PS:有的编译器为了提高效率,在出栈时不会进行数据清空,这也就意味着,下个函数里的变量在入栈使用该空间时,里面的数据是上一次变量操作的结果。

2.         闪电飞刀:register
描述:
register就和它的名字一样,很少出现在代码世界中,因为敢称为闪电飞刀的变量,通常只会在一些特定场合才能出现。它是如此的快,以致于CPU都对其刮目相看,但是它有一个致命的缺点,它的速度“看心情”而定,不是每一次都能让人满意。

作用:如果一个变量被register来修辞,就意味着,该变量会作为一个寄存器变量,让该变量的访问速度达到最快。比如:一个程序逻辑中有一个很大的循环,循环中有几个变量要频繁进行操作,这些变量可以声明为register类型。

寄存器变量:寄存器变量是指一个变量直接引用寄存器,也就是对变量名的操作的结果是直接对寄存器进行访问。寄存器是CPU的亲信,CPU操作的每个操作数和操作结果,都由寄存器来暂时保存,最后才写入到内存或从内存中读出。也就是说,变量的值通常保存在内存中,CPU对变量进行读取先是将变量的值从内存中读取到寄存器中,然后进行运算,运算完将结果写回到内存中。为什么要这么设计,而不直接对变量的值从内存中进行运算,而要再借助于寄存器?这是由于考虑到性能的问题才这么设计的。在计算机系统中,包含有很多种不同类型的存储器,如表xxx所示。

表xxx 计算机存储器分类

名称

速度

特点

用途

静态存储器

最快

造价高,体积大,适合小容量的缓存

寄存器,缓存

动态存储器

较快

造价较低,体积较小,适合大容易保存数据

内存

在计算机中CPU的运算速度最快,现在都达到3GHZ左右,而相对应的存储器速度却相对慢很多,访问速度最快的寄存器和缓存,由于其体积又大,不适合大容量的使用,所以只能二者相接合的方式来提高效率。程序代码保存在内存中,当使用数据时,将其送到寄存器,让CPU来访问,使用完毕,送回内存保存。而C语言又允许使用寄存器来保存变量的值,很明显这样能大大提高程序的执行速度,但是,寄存器的个数是有限的,X86也就是十几个,ARM最多才37个。我们不可能将全部的变量都声明为寄存器变量,因为其它代码也要使用寄存器,同样,我们声明的寄存器变量也不一定直接保存在寄存器中,因为寄存器可能全部都在被其它代码占用。编译器只能是尽量的为我们的变量安排在寄存器中。

在使用寄存器变量时,请注意:

  • 待声明为寄存器变量类型应该是CPU寄存器所能接受的类型,意味着寄存器变量是单个变量,变量长度应该小于等于寄存器长度
  • 不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址
  • 尽量在大量频繁的操作时使用寄存器变量,且声明的变量个数应该尽量的少

C语言深入理解系列 - 关键字:auto和register相关推荐

  1. Go语言 和 Java语言对比理解系列四:门闩(WaitGroup/CountDownLatch)

    文章目录 Java中的门闩最基础的实现方式就是CountDownLatch,可以参考之前的文章<使用三个线程,按顺序打印X,Y,Z,连续打印10次>: 而Go中可以通过sync.WaitG ...

  2. java 变量作用域 c语言_C语言深入理解 - 常量与变量

    ++++++++++++++++++++++++++++++++++++++++++ <C语言深入理解系列 - 常量与变量> 查看其它博文请关注原创作者. 本文系本站原创,欢迎转载! 转载 ...

  3. C语言 —— 关键字(C语言标准定义的32个关键字:auto、register、static、sizeof、signed、unsigned 、break 、 continue 、void)

    C语言标准定义的32个关键字:(列出每个关键字的意义) 关键字 意 义 auto 声明自动变量,缺省时编译器一般默认为 auto int 声明整型变量 double 声明双精度变量 long 声明长整 ...

  4. C语言关键字auto,case,default,switch应该如何使用

    前言:本文章主要用于个人复习,追求简洁,感谢大家的参考.交流和搬运,后续可能会继续修改和完善. 因为是个人复习,会有部分压缩和省略. 一.auto 1.c语言中,关键字auto用于声明一个变量为自动变 ...

  5. 小猪的C语言快速入门系列(三)

    小猪的C语言快速入门系列(三) 标签: C语言 本节引言: 在上一节中,对C语言的基本语法进行了学习,类比成学英语的话,我们现在 只是会单词而已,组成一个个句子还需要学习一些语法,本节学习的就是两对 ...

  6. 【C语言深度剖析】关键字(全)

    文章目录 一.存储类型关键字 前言 补充1:内存 思考: 补充2:变量与内存的关系 补充3:变量的分类 补充4:存储类 补充5:删除数据是怎么删除的? 1.auto 2.register 3.stat ...

  7. 重学JavaScript深入理解系列(六)

    JavaScript深入理解--闭包(Closures) 概要 本文将介绍一个在JavaScript经常会拿来讨论的话题 -- 闭包(closure).闭包其实已经是个老生常谈的话题了: 有大量文章都 ...

  8. 程序员你真的理解final关键字吗?

    文章目录 1.修饰类 2.修饰方法 3.修饰变量 4.final变量修饰变量(成员变量.局部变量) 4.1 final修饰成员变量: 4.2 final修饰局部变量: 5.final变量和普通变量的区 ...

  9. 图书封面的故事之——“巴别塔”选自《七周七语言:理解多种编程范型》

    我认为,图书的封面很重要,因为首先映入读者眼帘的就是封面,他可以诱发潜在的读者去注意图书,图书的封面可以显示出很多信息,例如书名.推荐语.评价.出版单位等,最重要的还是要给图书起一个好的名字,一本好书 ...

最新文章

  1. rlwrap 让Linux下的sqlplus变得好用
  2. tomcat启动报错
  3. jquery效果案例学习站
  4. android id设计模式,Android与设计模式话题
  5. java 上传文件编码_(java)有什么办法把MultipartFile上传的文件转为utf-8的编码吗
  6. html文件上传删除,文件上传以及删除文件方法
  7. EDAS再升级!全面支持Spring Cloud应用
  8. java中级职称考试试题_Java中级开发工程师笔试题及答案2016
  9. Java使用HtmlUnit抓取js渲染页面
  10. linux定时任务crontab的设置
  11. [CodeForces 372A] Counting Kangaroos is Fun
  12. 【转】【CN五一装机版】GhostXP_SP3电脑公司通用版v19.2装机版NTFS
  13. WLAN RTT (IEEE 802.11mc)
  14. 【seeprettyface.com】开源源码:Video-Auto-Wipe
  15. composer设置镜像
  16. C语言——大整数加法
  17. Linux的vi编辑器下的常用命令
  18. 汉字区位码查询与算法——microsoft visual studio 2005系列
  19. 数字电路基础(五)算术运算电路
  20. AMESim储能电气库用户手册(一)

热门文章

  1. 余弦距离、欧氏距离和杰卡德(Jaccard)相似性度量的比较
  2. Spring源码分析之Aop中拦截器,适配器,通知之间的关系
  3. js和php中几种生成验证码的方式
  4. Contoso 大学 - 3 - 排序、过滤及分页
  5. 思科交换技术之vlan
  6. .NET 4.0的犄角旮旯
  7. mini 打开窗口提交表单,按钮在页脚
  8. vuejs解析url地址
  9. c语言数据类型、运算符和表达式
  10. Kafka/Metaq设计思想学习笔记 转