单片机面试笔试大全

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机笔试面试白皮书
目录
第一部笔试面试流程1
一、准备简历1
二、简历投递2
三、笔试准备2
四、面试准备3
五、面试练习4
第二部C笔试面试题4
第一大块:根本语法4
第二大块:变量7
第三大块:函数16
第四大块:指针& 存19
第五大块:链表25
第六大块:算法28
第三部LSD笔试面试题35
第四部C++/驱动笔试面试题36
第五部JAVA笔试面试题38
第六部android笔试面试题38
第七部工程面试题40
第一部笔试面试流程
一、准备简历
在51、智联、中华英才个做一份简历。

简历容重点:
所学课程〔C语言、linux系统程序设计、JAVA、android〕
所做工程:工程描述一定要完整,清晰。

工程是关键点。

并且,如果面试的是android,那么把android工程放在前面。

【一句话摆平】你和应届生的本质区别,就在于你有工程经历。

工作背景:如果有技术相关背景,写清楚,只要技术相关都可以加分的。

交流背景:以前做过和交流沟通相关的事情
如果是应届生,那么做过的学生会工作,组着过活动等;
如果工作过,那么做过的工作,把闪光点说出来;最起码,工作沟通、
稳定性等方面是可以展示出来的。

面试官很关心这个。

简历书写考前须知:
简历书写语言简洁,多用条例性语言。

〔第一、第二、第三、...〕
简历不能出现经历空白,如中间半年没有任何经历。

简历不能和其他学员的简历出现一样的容,尤其是工程描述。

否那么,两个人都有可能失去面试时机。

简历版面简单,字体不要超过3种。

不需要相片,不需要花哨的格式。

招聘介绍:
51效果最好,重点关注51招聘。

注意关键字:
在简历重要多出现重要关键字: C语言、数据构造、linux系统开发〔linux系统移植、
驱动、arm、C++〕、JAVA、android
二、简历投递
每天早晨〔一定要早晨,早晨的效果是最好的,否那么可能效果减半〕把3个的简历都“刷新〞一下。

每天早晨投递简历,主要搜索,嵌入式开发、C开发、linux开发、JAVA开发、android开发、软件开发。

每天投递十几个公司。

一家公司,如果没给面试通知,屡次投递。

重点关注的51,要在这个上注册2-3个账号,使用同样的简历,每天可以更换账号投递。

并不是你投递的每个人的简历公司人事都会看到,如果收到的简历很多,那么人事可能每天只能看到排在收件箱最前面的简历。

所以你的投递必须要人事能最先看到。

简历投递的重点注意:
第一、最好投递时间是早晨。

早晨效果往往是其他时间段的两倍。

第二、51上要注册两、三个账号。

使用同样的简历,轮流投递。

第三、第一轮投递使用海投的方式,即搜索“嵌入式开发〞、“linux开发〞、“C开发〞等关键字,然后全选投递〔海投〕。

第四、以后每天坚持投递,投递职位数目在十多个。

三、笔试准备
笔试的主要容应该是C语言和android,其次算法,JAVA。

所以C语言必须扎实。

很多公司的笔试题目就是为了笔试而笔试,可能开发中千年难用。

但是你做不出来,就能表达出公司的出题水平。

我们可以鄙视这些公司,但我们还是要认真准备笔试的。

1、“嵌入式经典笔试整理收录〞这份题目必须看.这里面的题目一道都不能落下全部弄懂。

这里面都是根底.包括概念在.练习题目不但要看懂,而且要在纸上动手写出来。

一定要在纸上写出来,因为不笔试的时候不是上机,要一次写出来,难度还是大些。

2、“高质量C++-C编程指南.doc〞看这份资料。

这份看完根本C语言就没有太多问题。

3、看其他面试笔试资料。

资料要多看。

注意:很多笔试题目一定要自己在纸上写出来。

笔试讲求的就是“纸上谈兵〞!在纸上写程序要比你在电脑上写难很多。

切记不可以骄傲。

四、面试准备
看"嵌入式经典面试题目收录" 常见面试题目。

必须每道题目都能流畅完整打出来。

准备自我介绍:
1、教育背景:学校专业毕业时间。

2、工作背景:之前从事什么工作。

一定要说明为什么转到这个行业了,为什么离开上一家公司了。

对之前工作中的自己不要否认:因为你自己都否认自己了,谁还会肯定你?
3、培训背景:
所学课程:课程名称(不要把课程名称都忘掉了,名字都忘了,别人怎么相信你学好这个课程〕
所做工程:在培训期间动手完成了那些工程。

工程描述要清晰,一般套路:1、工程名称〔这个也不能忘〕2、工程简介3、工程分成几个模块4、工程所使用的技术。

工程描述是整个面试的一个重点。

4、技术问答:对面试官所提出的技术问题,进展解答。

解答问题要简洁明了,要用肯定语气,一定要给面试官信心。

回到问题要简介明了,不要有语气词。

如果有不会答复的问题,不用着急。

可以肯定的告诉面试官不知道。

很多问题答不上来是正常的。

所以不要紧。

都答上来还不一定要你呢〔面试中面试官一定要出一些拟答不上来的问题,这样才能确定你的能力围,另外也能让你认识到自己的缺乏,这样你开价的时候也会自觉地悠着点〕。

也可以绕过去,但不能太多问题都去绕。

面试官提问喜欢沿着一个问题不停的追问,直到你不会为止。

所以准备的时候注意一定要全面深入。

另外不会也不用紧,影响后面的面试。

5、人事面试:
常见问题:你对加班的看法?
你对你上一家公司的经理的看法?
你觉得你最忌最大的优点和缺点个是什么?
你为什么离开上一家公司?
你3年或者5年的职业开展规划?
你觉得你自己值这么多钱〔你开的薪资〕吗?
闲聊:注意闲聊的时候不要忘形,要给别人一种稳定,喜欢技术,对公司所属行业感兴趣,自己个人爱好安康,不要提消极〔爱玩游戏,懒,之类的事情〕
6、谈薪资:
谈薪资,开场要想要自己期望的薪资是多少。

不要模糊的。

告诉比人我期望薪资多少。

不过不要太高,如果太高的话,别人即使想要你也可以去,但别人会认为你不踏实,而不敢要你。

所以你所说的期望薪资可以比你的最低薪资多出500.最多不能多出1000.
注意一般面试时间要超过20分钟。

如果面试官面试时间超过20分钟,那么说明他对你的
情趣比拟大了。

30分钟以上说明你已经有6成以上的把握了。

一般情况如果面试的人当时没有对你表示出意向,让你回去等通知,根本没戏了。

五、面试练习
把面试的自我介绍写下来,让后多读几遍。

最好是对着镜子读。

不要不好意思,流畅与否,那就是每月500或者1000的差呀。

面试准备是非常重要的。

因为经常面试的东西主要就那些。

另外,面试过程中必须对自己有信心。

那怕装也得装出来。

正常情况下,如果两个人技术差不多,那么面试官一般都会挑选有信心的。

有信心的人在日后的工程中会更有韧性,能担当的更多。

即使技术现在不是很好,但有信心的话,可以在以后的工作中很快就弥补上来了。

每个人对自己的信心,要有这样的觉悟,即使我现在技术不是很好,但我将来一定会好好学,好好做,一定能给我所在的公司带来价值,公司选择我那是正确,不选我那是公司最大的损失。

反过来,如果对自己没有信心,那凭什么让面试官对你有信心呢?即使你技术过了,他还可能认为,是不是死记硬背的。

即使你值5k他会觉得,给你3.5k你都会来。

面试不但是技术的战争,更是心理的战争。

最后一句:信心十足,但不高调。

祝大家马到成功!!!
第二部C笔试面试题
第一大块:根本语法
1.用预处理指令#define 声明一个常数,用以说明1年中有多少秒〔忽略闰年问题〕
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在这想看到几件事情:1). #define 语法的根本知识〔例如:不能以分号完毕,括号的使用,等等〕2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。

3). 意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。

4). 如果你在你的表达式中用到UL〔表示无符号长整型〕,那么你有了一个好的起点。

记住,第一印象很重要。

2.写一个“标准〞宏MIN,这个宏输入两个参数并返回较小的一个#define MIN(A,B) ((A) <=
(B) (A) : (B))
这个测试是为下面的目的而设的:1). 标识#define在宏中应用的根本知识。

这是很重要
的,因为直到嵌入(inline)操作符变为标准C的一局部,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能到达要求的性能,嵌入代码经常是必须的方法。

2). 三重条件操作符的知识。

这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。

3). 懂得在宏中小心地把参数用括号括起来4). 我也用这个问题开场讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least = MIN(*p++, b);
其实宏在编程中的副作用主要表现在编译器的处理计算上,如果考虑不周全很容易出现重复计算的问题。

所以写程序要用宏的简洁,又要注意其中的陷阱,以防出现莫名其妙的错误
3.用宏定义写出swap(x,y)
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
4.请定义一个宏,比拟两个数a、b的大小,不能使用大于、小于、if语句#define Max(a,b)
( a/b)?a:b
5.预处理器标识#error的目的是什么?如果你不知道答案,直接baidu。

6.字节对齐//# pragma pack(4)
struct st{
char c;
int i;
short s;
};
sizeof(struct st);
7.死循环〔Infinite loops〕
8.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?这个问题用几个解决
方案。

我首选的方案是:while(1) { }
一些程序员更喜欢如下方案:for(;;) { }
这个实现方式让我为难,因为这个语法没有确切表到达底怎么回事。

如果一个应试者给出这个作为方案,我将用这个作为一个时机去探究他们这样做的根本原理。

如果他们的
根本答案是:“我被教着这样做,但从没有想到过为什么。

〞这会给我留下一个坏印象。

第三个方案是用goto
Loop:
...
goto Loop;
应试者如给出上面的方案,最好解释汇编语言程或BASIC/FORTRAN语言可以这么做。

但如果是C 编程中出现goto ,那么会留下恶劣的印象。

9.Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。

也可以用预处理
器做类似的事。

例如,思考一下下面的例子:
#define dPS struct s *
typedef struct s * tPS;
dPS mm, qq; //struct s * mm, qq;
tPS nn, pp; // struct s * mm, *qq;
以上两种情况的意图都是要定义dPS 和tPS 作为一个指向构造s指针。

哪种方法更好呢?〔如果有的话〕为什么?这是一个非常微妙的问题,任何人答对这个问题〔正当的原因〕是应当被恭喜的。

答案是:typedef更好。

思考下面的例子:dPS p1,p2;
tPS p3,p4;
第一个扩展为struct s * p1, p2;
上面的代码定义p1为一个指向构造的指,p2为一个实际的构造,这也许不是你想要的。

第二个例子正确地定义了p3 和p4 两个指针。

10.C语言同意一些令人震惊的构造,下面的构造是合法的吗,如果是它做些什么?
int a = 5, b = 7, c;
c = a+++b;这个问题将做为这个测验的一个愉快的结尾。

不管你相不相信,上面的例子是完全符合语法的。

问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处理原那么,编译器应当能处理尽可能所有合法的用法。

因此,上面的代码被处理成:c = a++ + b;
因此, 这段代码持行后a = 6, b = 7, c = 12。

11.头文件中的ifndef/define/endif 干什么用?
12.一个死循环
int main〔〕
{
unsigned char i;
for〔i= 0;i<256;i++〕
{
printf(“i= %d\n〞,i);
}
return 0;
}
程序运行结果
13.如何输出源文件的标题和目前执行行的行数int line = __LINE__;
char *file = __FILE__;
cout<<"file name is "<<(file)<<",line is "<
第二大块:变量
14.变量的存储空间
C程序一直由以下局部组成:
〔1〕正文段——CPU执行的机器指令局部;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
〔2〕初始化数据段〔数据段〕——在程序中所有赋了初值的全局变量,存放在这里。

〔3〕非初始化数据段〔bss段〕——在程序中没有初始化的全局变量;核将此段初始化为0。

〔4〕栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息〔返回地址;环境信息〕。

〔5〕堆——动态存储分配。

|--------------| 高地址
|--------------|
| 栈|
|--------------|
| | |
| \|/ |
| /|\ |
| | |
|--------------|
| 堆|
|--------------|
| 未初始化|
|--------------|
| 初始化|
|--------------|
| 正文段| 低地址
问题:
局部变量存放区域?
初始化全局变量存放区域?
未初始化的全局变量存放区域?
静态局部变量存放区域?
动态分配存是在那个区域?
15.堆和栈的区别
【一句话摆平】堆是手动,但容易导致存碎片;栈是自动,但空间有限。

一般认为在c中分为这几个存储区(1)、栈- 有编译器自动分配释放(2)、堆- 一般由程序员分配释放,假设程序员不释放,程序完毕时可能由OS回收(3)、全局区〔静态区〕,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。

- 程序完毕释放(4)、另外还有一个专门放常量的地方。

- 程序完毕释放在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配存的函数分配得到的就是在堆上。

在所有函数体外定义的是全局量,加了static修饰符后不管在哪里都存放在全局区〔静态区〕,在所有函数体外定义的static变量表示在该文件中有效,不能extern到别的文件用,在函数体定义的static表示只在该函数体有效。

另外,函数中的"adgfdf"这样的字符串存放在常量区。

比方:int a = 0; 全局初始化区char *p1; 全局未初始化区main()
{
int b; 栈char s[] = "abc";栈char *p2; 栈char *p3 = "123456"; 123456\0在常量区,p3在栈上。

static int c =0;全局〔静态〕初始化区p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"12345
6"优化成一块。

}
还有就是函数调用时会在栈上有一系列的保存现场及传递参数的操作。

栈的空间大小有限定,vc的缺省是2M。

栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。

有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。

栈是由编译器自动管理的,不用你操心。

堆是动态分配存的,并且你可以分配使用很大的存。

但是用不好会产生存泄漏。

并且频繁地malloc和free会产生存碎片〔有点类似磁盘碎片〕,因为c分配动态存时是寻找匹配的存的。

而用栈那么不会产生碎片。

在栈上存取数据比通过指针在堆上存取数据快些。

一般大家说的堆栈和栈是一样的,就是栈(stack),而说堆时才是堆heap.
栈是先入后出的,一般是由高地址向低地址生长。

堆(heap)和栈(stack)是C/C++/JAVA编程不可防止会碰到的两个根本概念。

首先,这两个概念都可以在讲数据构造的书中找到,他们都是根本的数据构造,虽然栈更为简单一些。

在具体的C/C++/JAVA编程框架中,这两个概念并不是并行的。

对底层机器代码的研究可以提醒,栈是机器系统提供的数据构造,而堆那么是C/C++/JAVA函数库提供的。

具体地说,现代计算机(串行执行机制),都直接在代码底层支
持栈的数据构造。

这表达在,有专门的存放器指向栈所在的地址,有专门的机器指令完成数据入栈出栈的操作。

这种机制的特点是效率高,支持的数据有限,一般是整数,指针,浮点数等系统直接支持的数据类型,并不直接支持其他的数据构造。

因为栈的这种特点,对栈的使用在程序中是非常频繁的。

对子程序的调用就是直接利用栈完成的。

机器的call指令里隐含了把返回地址推入栈,然后跳转至子程序地址的操作,而子程序中的ret指令那么隐含从堆栈中弹出返回地址并跳转之的操作。

C/C++/JAVA中的自动变量是直接利用栈的例子,这也就是为什么当函数返回时,该函数的自动变量自动失效的原因(因为颜换指戳说饔们暗状态)。

和栈不同,堆的数据构造并不是由系统(无论是机器系统还是操作系统)支持的,而是由函数库提供的。

根本的malloc/realloc/free函数维护了一套部的堆数据构造。

当程序使用这些函数去获得新的存空间时,这套函数首先试图从部堆中寻找可用的存空间,如果没有可以使用的存空间,那么试图利用系统调用来动态增加程序数据段的存大小,新分配得到的空间首先被组织进部堆中去,然后再以适当的形式返回给调用者。

当程序释放分配的存空间时,这片存空间被返回部堆构造中,可能会被适当的处理(比方和其他空闲空间合并成更大的空闲空间),以更适合下一次存分配申请。

这套复杂的分配机制实际上相当于一个存分配的缓冲池(Cache),使用这套机制有如下假设干原因:1. 系统调用可能不支持任意大小的存分配。

有些系统的系统调用只支持固定大小及其倍数的存请求(按页分配);这样的话对于大量的小存分类来说会造成浪费。

2. 系统调用申请存可能是代价昂贵的。

系统调用可能涉及用户态和核心态的转换。

3. 没有管理的存分配在大量复杂存的分配释放操作下很容易造成存碎片。

堆和栈的比照从以上知识可知,栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而栈是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。

栈是系统数据构造,对于进程/线程是唯一的;堆是函数库部数据构造,不一定唯一。

不同堆分配的存无法互相操作。

栈空间分静态分配和动态分配两种。

静态分配是编译器完成的,比方自动变量(auto)的分配。

动态分配由alloc函数完成。

栈的动态分配无需释放(是自动的),也就没有释放函数。

为可移植的程序起见,栈的动态分配操作是不被鼓励的!堆空间的分配总是动态的,虽然程序完毕时所有的数据空间都会被释放回系统,但是准确的申请存/释放存匹配是良好程序的根本要素。

所以计算机中的堆和栈经常时放一块讲的node 一般不是必要就不要动态创立,最讨厌是,C++中,把new出来的东西当局部变量用,用完了马上delete 的做法;最恶劣的是,JAVA中不断地new,然后等着GC来回收。

理由1.栈分配比堆快,只需要一条指令就呢给配所有的局部变量2.栈不会出现存碎片3.栈对象好管理当然,某些情况下也要那么写,比方1.对象很大2.对象需要在某个特定的时刻构造或析够3.类只允许对象动态创立,比方VCL的大多数类当然,必须用堆对象时也不能躲避
对于类的申明〔还没有定义〕来说,可以有限的方式使用它。

如我们可以声明指向该类类
型的指针或引用。

允许指针和引用是因为它们都有固定的大小,而与它们指向的对象的大小无关。

只有到完全定义了该类才能对这些指针和引用解引用。

只有对类定义了,才能声明该类类型对象。

在程序中还没有看到类定义之前,数据成员只能是该类类型的指针或引用。

当一个类的类头被看到时,它就被视为已经声明了,所
以一个类可以有指向自身类型的指针或引用作为数据成员。

只有一个类的类体已经完整时,它才被视为已经被定义。

所以可以有如下形式:
class LinkScreen{
Screen window;
LinkScreen *next;
LinkScreen *prev;
}
16.关键字static的作用是什么?这个简单的问题很少有人能答复完全。

在C语言中,关键
字static有三个明显的作用:1). 在函数,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

2). 在模块〔但在函数外〕,一个被声明为静态的变量可以被模块所用函数访问,但不能被模块外其它函数访问。

它是一个本地的全局变量。

3). 在模块,一个被声明为静态的函数只可被这一模块的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地围使用。

大多数应试者能正确答复第一局部,一局部能正确答复第二局部,同是很少的人能懂得第三局部。

这是一个应试者的严重的缺点,因为他显然不懂得本地化数据和代码围的好处和重要性。

17.静态变量
(1)、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。

静态全局变量有以下特点:该变量在全局数据区分配存;未经初始化的静态全局变量会被程序自动初始化为0〔自动变量的值是随机的,除非它被显式初始化〕;静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配存,包括后面将要提到的静态局部变量。

对于一个完整的程序
代码区全局数据区堆区栈区一般程序的由new产生的动态数据存放在堆区,函数部的自动变量存放在栈区。

自动变量一般会随着函数的退出而释放空间,静态数据〔即使是函数部的静态局部变量〕也存放在全局数据区。

全局数据区的数据并不会因为函数的退出而释放空间。

确实,定义全局变量就可以实现变量在文件中的共享,但定义静态全局变量还有以下好处:静态全局变量不能被其它文件所用;其它文件中可以定义一样名字的变量,不会发生冲突;(2)、静态局部变量【一句话解决】静态局部变量具有记忆性在局部变量前,加上关键字static,该变量就被定义成为一个静态局部变量。

通常,在函数体定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈存。

但随着程序退出函数体,系统就会收回栈存,局部变量也相应失效。

但有时候我们需要在两次调用之间对变量的值进展保存。

通常的想法是定义一个全局变量来实现。

但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

静态局部变量正好可以解决这个问题。

静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

example:
void foo()
{
static int a;
a++;
cout<<a<<endl;//C++语法,和C语言中的printf类似
}
int main()
{
foo();
foo();
foo();
return 0;
}
结果是1 2 3 每次foo〔〕退出后,并未销毁变量a,因为它是存放在全局数据区的,不是栈空间。

静态局部变量有以下特点:该变量在全局数据区分配存;静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进展初始化;静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;它始终驻留在全局数据区,直到程序运行完毕。

但其作用域为局部作用域,当定义它的函数或语句块完毕时,其作用域随之完毕;
18.关键字const是什么含意?
只要一听到被面试者说:“const意味着常数〞,我就知道我正在和一个业余者打交道。

const
int a;
int const a;
const int *a;
int * const a;
int const * a;
前两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针〔也就是,整型数是不可修改的,但指针可以〕。

第四个意思a是一个指向整型数的常指针〔也就是说,指针指向的整型数是可以修改的,但指针是不可修改的〕。

最后一个意味着a是一个指向常整型数的常指针〔也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的〕。

如果应试者能正确答复这些问题,那么他就给我留下了一个好印象。

顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1). 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。

如果你曾花很多时间清理其它人留下的垃圾,你就会很快学会感这点多余的信息。

〔当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。

〕2). 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3). 合理地使用关键字const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

简而言之,这样可以减少bug的出现。

19.关键字volatile有什么含意并给出三个不同的例子//register一个定义为volatile的变量是
说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

准确。

相关文档
最新文档