版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、预处理程序1.用预处理指令#define声明一个常数,指示一年有多少秒(忽略闰年问题)#定义秒_每_年(60 * 60 * 24 * 365)UL我想在这里看几样东西:1)基本的# define语法知识(例如,不能以分号结尾,使用括号等)。)2)知道预处理器将为您计算常量表达式的值,直接写下您如何计算一年中的秒数而不是实际值会更清楚,成本也更低。3)意识到这个表达式将溢出一个16位机器的整数,所以使用长整数符号L告诉编译器这个常数是一个长整数。4)如果你在表达中使用UL,那么你就有了一个好的起点。记住,第一印象很重要。2.写一个“标准”宏MIN。这个宏输入两个参数,并返回较小的一个。#定义最小
2、(A,B) (A)=(B)?(一):(二)该测试旨在实现以下目的:1)确定宏中#define应用程序的基本知识。这非常重要。因为在内联操作符成为标准C的一部分之前,宏是容易生成嵌入式代码的唯一方法,所以嵌入式代码通常是嵌入式系统实现所需性能的必要方法。2)三条件算子的知识。这个运算符存在于C语言中的原因是,它使编译器能够产生比if-then-else更优化的代码。理解这个用法很重要。3)知道如何在宏中小心地将参数括在括号中4)我也用这个问题开始讨论宏的副作用,比如:当你写下面的代码时会发生什么?最小值=最小值(*p,b);3.预处理器标识#error的目的是什么?如果你不知道答案,请参考参考资
3、料1。这个问题对于区分正常人和书呆子非常有用。只有书呆子才能阅读C语言课本的附录,找到这些问题的答案。当然,如果你不是在找一个书呆子,那么候选人最好希望不知道答案。无限循环4.无限循环经常在嵌入式系统中使用。你如何用C写死循环?这个问题有几种解决方法。我的第一选择是:而(1)一些程序员更喜欢下面的方案:用于(;)这种实现让我很尴尬,因为这种语法不能准确表达正在发生的事情。如果一个候选人把这个作为一个计划,我将利用这个机会来探索他们所做事情的基本原则。如果他们的基本答案是:“我被教导这样做,但我从未想过为什么。”这会给我留下不好的印象。第三种选择是使用gotoLoop:.转到循环;如果候选人给出
4、了上述建议,这表明他要么是一个汇编语言程序员(这可能是一件好事),要么是一个想进入新领域的BASIC/FORTRAN程序员。数据声明5.使用变量A给出以下定义一个整数指向整数的指针指向整数的指针(指向整数的指针)10个整数的数组e)指向一个整数的10个指针的数组。(10个整数指针的数组)一个指向10个整数数组的指针g)指向一个函数的指针,该函数有一个整数参数并返回一个整数。h)一个由10个指针组成的数组,指向一个具有整数参数并返回整数的函数。答案是:a)整数a;/整数b)int * a;/指向整数的指针c)国际* * a;/指向整数指针的指针d)int a10;/10个整数的数组e)int *
5、 a10;/10个整数指针的数组f)int(* a)10;/指向10个整数数组的指针g)int(* a)(int);/指向函数A的指针,该函数接受整数参数并返回整数h)int(* a10)(int);/由10个指针组成的数组,指向接受整数参数并返回整数的函数人们经常声称有几个问题需要翻过来回答。我同意这种说法。当我写这篇文章的时候,我确实查了这本书,以确保语法正确。但是当我被采访时,我希望被问到这个问题(或者类似的问题)。因为在面试中,我确信我知道这个问题的答案。如果候选人不知道所有的答案(或者至少大部分答案),那么他就没有为面试做好准备。如果候选人没有为面试做好准备,那他为什么要准备呢?静态
6、的关键字static的功能是什么?很少有人能完全回答这个简单的问题。在C语言中,关键字static有三个明显的功能:1)在函数体中,声明为静态的变量在调用该函数期间保持其值。2)在模块中(但是在函数之外),声明为静态的变量可以被模块中使用的函数访问,但是不能被模块之外的其他函数访问。它是一个局部全局变量。3)在模块中,声明为静态的函数只能由模块中的其他函数调用。也就是说,这个函数被限制在声明它的模块的本地范围内。大多数考生能正确回答第一部分,有些人能正确回答第二部分,很少有人能理解第三部分。这是一个候选人的严重缺点,因为他显然不理解本地化数据和代码范围的好处和重要性。常数关键字const是什么
7、意思?我一听到受访者说,“常数意味着常数”,我就知道我在和一个业余爱好者打交道。丹萨克斯在去年的文章中全面总结了const的所有用途,所以每个专门用途英语的读者都应该非常熟悉const能做什么和不能做什么。如果你从未读过那篇文章,就说const的意思是只读。虽然这个答案不完整,但我认为是正确的。(如果你想要更详细的答案,请仔细阅读萨克斯。)如果候选人能正确回答这个问题,我会再问他一个问题:以下陈述是什么意思?常量int a;int常量a;常量int *a。int * const a;int常量* a常量;/* * * * */前两个函数是相同的。a是一个常数。第三个意味着A是一个指向一个常数整
8、数的指针(也就是说,一个整数不能被修改,但是指针可以)。第四个意思是A是一个指向整数的常量指针(也就是说,指针指向的整数可以被修改,但是指针不能被修改)。最后一个意味着A是指向一个常数整数的常数指针(也就是说,指针指向的整数是不可修改的,指针也是不可修改的)。如果候选人能正确回答这些问题,他会给我留下好印象。顺便说一句,你可能会问,即使你不用关键字const,用正确的函数编写程序还是很容易的,那么为什么我如此重视关键字const呢?我还有以下原因:1)关键字const的功能是向代码的读者传达非常有用的信息。事实上,声明一个参数常量就是告诉用户这个参数的应用目的。如果你花了很多时间清理别人留下的
9、垃圾,你会很快学会感谢这些额外的信息。(当然,知道如何使用常量的程序员很少留下垃圾给别人清理。)2)通过给优化器一些额外的信息,使用关键字常量可能会产生更紧凑的代码。3)关键字const的合理使用使得编译器能够自然地保护那些不想被无意的代码修改所改变的参数。简而言之,这可以减少错误的发生。不稳定的关键字volatile是什么意思?给出了三个不同的例子。定义为易变的变量意味着变量可能会被意外更改,因此编译器不会假定变量的值。具体来说,优化器必须在每次使用该变量时仔细地重新读取该变量的值,而不是使用存储在寄存器中的备份。以下是一些易变变量的例子:1)并行设备的硬件寄存器(例如状态寄存器)2)将在中
10、断服务子程序中访问的非自动变量3)多线程应用程序中几个任务共享的变量那些不能回答这个问题的人将不会被雇用。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式人员经常处理硬件、中断、RTOS等等,所有这些都需要可变的变量。不理解易变的内容会带来灾难。假设受访者正确回答了这个问题(嗯,我怀疑是否会是这样),我会深入一点,看看这个人是否完全意识到了不稳定的重要性。1)参数可以是常量还是变量?解释原因。2);指针会波动吗?解释原因。3);以下功能有什么问题:int square(volatile int *ptr)返回*ptr * *ptr。答案如下:1)是的。一个例子是只读状态寄存器。它
11、是不稳定的,因为它可以被意外地改变。它是常量,因为程序不应该试图修改它。2);是的,虽然这不是很常见。一个例子是当服务子程序修复一个指向缓冲区的指针时。3)该代码有点异常。这段代码的目的是将指针*ptr返回到值的平方,但是由于*ptr指向一个易失性参数,编译器将生成如下代码:int square(volatile int *ptr)int a,b;a=*ptr。b=*ptr。返回a * b。由于*ptr的值可能会意外更改,因此A和B可能会有所不同。因此,该代码可能不是您期望的平方值!正确的代码如下:长平方(可变整数*ptr)int a;a=*ptr。返回a * a位操作9.嵌入式系统总是要求用
12、户对变量或寄存器执行位操作。给定一个整数变量a,写两个代码,a的第一个设置位3和a的第二个清零位3。在上述两个操作中,保持其他位不变。对这个问题有三种基本的反应。1)我不知道怎么做。被套从未作为嵌入式系统使用过。2)使用位字段。位域是被扔进C语言死角的东西。它确保您的代码在不同的编译器之间不可移植,也确保您的代码不可重用。不幸的是,我最近看到英飞凌为它更复杂的通信芯片写了一个驱动程序。它使用位字段,所以对我来说完全没有用,因为我的编译器以其他方式实现位字段。从道德上讲,永远不要让一个非嵌入式的家伙停留在实际硬件的边缘。3)使用#定义和位掩码操作。这是一种高度可移植的方法,应该使用。最佳解决方案
13、如下:#定义BIT3 (0x1 3)静态int a;void set_bit3(void)a |=BIT3。void clear_bit3(void)a=BIT3。有些人喜欢定义一个掩码来设置和清除值,同时定义一些描述常量,这也是可以接受的。我想看到几个要点:解释常量,|=和=运算。访问固定的内存位置10.嵌入式系统通常要求程序员访问特定的内存位置。在项目中,需要将绝对地址为0x67a9的整数变量的值设置为0xaa66。编译器是一个纯ANSI编译器。编写代码来完成这项任务。这个问题测试你是否知道将一个整数转换成一个指针来访问一个绝对地址是合法的。这个问题的实现因个人风格而异。典型的类似代码如下:int * ptrptr=(int *)0x 67 a9;*ptr=0xaa55。一个更模糊
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻璃钢制品喷射工岗前实操熟练考核试卷含答案
- 生物材料在骨科领域的应用
- 新教科版四年级上册科学第一单元《空气》单元检测题及参考答案
- 《安徽中医药高》课件
- 医院感染暴发调查与处理
- 疼痛的观察与护理
- 2026年秋招:PACK结构工程师笔试题及答案
- 2026年普利司通(中国)招聘面试题及答案
- 《医疗垃圾的分类和处置》培训考试试题及答案
- 根鸟试题及答案
- 2026中国眼科医疗行业市场现状供需分析及投资评估规划研究报告
- 浙江省省杭州市上城区建兰中学2026年数学七上期末教学质量检测试题含解析
- 公安遴选专业试题及详尽答案剖析
- 2026年秋季升旗仪式安排表
- 防水工程细部构造施工方案-施工组织设计
- 洪水漫堤险情处置预案解读
- 2026秋新(2024)外研版九上英语 【Unit 1-6 】单词、短语专项练习
- 云南省建筑B证考试试题及答案
- CSCO胰腺癌诊疗指南(2026版)完整核心要点
- 2026年车检检测测试题及答案
- 财政投资评审操作规程实务指南
评论
0/150
提交评论