`

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

 
阅读更多

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

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)        非常见:autoregistervolatilegoto

2)        存储相关:const、extern、registervolatile、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代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。例如:

  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`、`extern`和`static`,它们影响变量的存储类别和生命周期。`auto`是默认的存储类别,适用于局部变量;`register`试图将变量存储在寄存器中以提高速度,但不是总能实现;`...

    C语言关键字 C语言关键字 C语言关键字

    C语言关键字是指由C语言本身定义的一组保留字,它们具有特定的语法含义,不能用作标识符(如变量名、函数名等)。C语言的关键字主要分为以下几类:类型关键字、控制结构关键字、存储类别关键字、其他关键字等。 ###...

    C语言关键字9.pdf

    C语言关键字是组成C语言语法的保留字,它们有着特殊的含义和用法,不能用作变量名、函数名等标识符。这份材料列出了C语言的基本关键字,并且根据标签“技术及资料”,可以判断这份材料是一份技术性很强的文档,旨在...

    C语言中的32个关键字

    - **存储级别关键字**包括`auto`、`static`、`register`、`extern`、`const`和`volatile`。 #### 流程控制关键字 流程控制关键字用于控制程序的执行流程,包括: - **跳转结构**:如`return`、`continue`、`break`...

    c语言关键字汇总

    ### C语言关键字详解 #### 1. auto:声明自动变量 - `auto` 关键字用来声明自动变量,这类变量通常存储在栈中,并且在它们的作用域之外是不可见的。 - 示例: ```c auto int i = 10; ``` #### 2. short:声明短...

    嵌入式C语言深入 ----嵌入式C的必须资料

    从给定的文件标题、描述、标签以及部分内容中,我们可以提炼出关于嵌入式C语言的几个关键知识点,包括变量修饰符(auto, const, register, static, volatile, extern)的使用,以及指针与数组的定义。下面将对这些知识...

    C语言32以及C++63个关键字及其含义.doc

    1. C语言关键字: - `auto`:声明一个自动变量,通常用于局部变量,表示变量在函数调用结束后自动销毁。 - `break`:用于跳出当前循环或switch语句,提前结束执行。 - `case`:switch语句的一部分,用于匹配不同情况...

    C语言培训资料.pdf

    C语言因其灵活性和效率而受到程序员的欢迎,但同时也要求程序员对内存管理和指针操作有深入理解,这可能导致一些学习曲线较陡峭的问题。了解并熟练掌握C语言,可以为开发者提供强大的工具来创建高效、可移植的软件。

    c语言深剖析---“精通C语言”

    1. **关键字的理解与运用**:C语言中的关键字是其语法结构的重要组成部分,例如`auto`、`register`、`static`等。这些关键字的正确使用直接影响到程序的性能和可维护性。 2. **数据类型的选择与转换**:了解C语言中...

    C语言中关键字const、static、volatile、extern、auto、register的用法分析.doc

    本文将对C语言中的六个关键字:const、static、volatile、extern、auto、register进行详细的分析和解释。 一、const关键字 Const关键字是C语言中最基本的关键字之一,它的主要作用是将变量或对象声明为只读的,...

    C语言的32个关键字、9种控制语句、34个运算符

    C语言中的存储类型关键字有auto、extern、register和static。auto用于声明自动存储期的变量,extern用于声明变量的引用,register用于建议编译器尽可能将变量存储在寄存器中,static用于声明静态存储期的变量。 4. ...

    c语言关键字检索

    C语言是一种广泛应用于系统编程、应用编程、嵌入式开发以及游戏开发等领域的高级编程语言。它的设计简洁、高效,且具有高度的可移植性。...因此,无论是学习还是工作中,了解和使用C语言关键字检索工具都是十分有益的。

    C语言中的所有关键字

    C语言是一种广泛使用的编程语言,它的语法简洁而强大。在C语言中,关键字是具有特殊含义的保留词汇,不能作为变量或函数的名字。...理解并正确应用这些关键字,对于成为一名优秀的C语言程序员至关重要。

    C语言32个关键字含义特别说明

    在C语言中,关键字是具有特殊意义的预定义保留词,它们具有特定的语法和语义,不能用作标识符。C语言中包含了32个关键字,这些关键字...理解这些关键字的含义和使用场景,对于编写高效、可维护的C语言程序至关重要。

    c语言32个关键字.pdf

    C语言是计算机程序设计领域里的重要语言之一,它以结构化、紧凑性和高效性著称。C语言的核心基础之一是关键字,它们是语言中预定义的保留字,具有特殊意义和...熟练掌握这些关键字,是深入学习和有效使用C语言的关键。

    C语言程序设计中的关键字及其用途

    C语言是一种广泛使用的编程语言,尤其对于初学者来说,...掌握这些关键字是理解和编写C语言程序的基础,通过灵活运用这些关键字,可以构建出复杂的程序结构和逻辑。对于初学者而言,不断练习和实践是提高技能的关键。

    C语言运算符和关键字

    ### C语言运算符详解 C语言是一门广泛应用于系统编程和嵌入式系统的高级编程语言。它提供了丰富的运算符和关键字来实现复杂的功能。本文将详细介绍C语言中...掌握这些基本概念对于理解和编写高效的C语言程序至关重要。

Global site tag (gtag.js) - Google Analytics