C面试试题.docx

上传人:文*** 文档编号:68352826 上传时间:2022-12-27 格式:DOCX 页数:132 大小:197.17KB
返回 下载 相关 举报
C面试试题.docx_第1页
第1页 / 共132页
C面试试题.docx_第2页
第2页 / 共132页
点击查看更多>>
资源描述

《C面试试题.docx》由会员分享,可在线阅读,更多相关《C面试试题.docx(132页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 .用预处理指令#define声明个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL我在这想看到几件事情:1) . #define语法的基本知识(例如:不能以分号结束,括号的使用,等等)2) .懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有 多少秒而不是计算出实际的值,是更清晰而没有代价的。3),意识到这个表达式将使一个16位机的整型数溢出一因此要用到长整型符号L,告诉编 译器这个常数是的长整型数。4),如果你在你的表达式中用到UL (表示无符号长整型),那么你有了一个好的起

2、点。 记住,第一印象很重要。2 .写个“标准”宏MIN,这个宏输入两个参数并返回较小的个。#define MIN(A,B) (A) 6) puts( 6): puts(6”。原因是当表达式中存在有符号 类型和无符号类型时所有的操作数都自动转换为无符号类型。因此20变成了一个非常大的 正整数,所以该表达式计算出的结果大于6。这一点对于应当频繁用到无符号数据类型的嵌 入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。13 .评价面的代码片断: unsigned int zero = 0; unsigned int compzero = OxFFFF;/*l*s com

3、plement of zero */对于个int型不是16位的处理器为说,上面的代码是不正确的。应编写如下:unsigned int compzero =0;这问题真正能揭露出应试者是否懂得处理器字长的重要性。在我的经验里,好的嵌入 式程序员非常准确地明白硬件的细节和它的局限,然而PC机程序往往把硬件作为一个无法 避免的烦恼。到了这个阶段,应试者或者完全垂头丧气了或者信心满满志在必得。如果显然应试者不 是很好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的 追加问题,这些问题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题, 我希望更多看到应试者应付问题的

4、方法,而不是答案。不管如何,你就当是这个娱乐吧动态内存分配(Dynamic memory allocation)14 .尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的 过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主 题已经在ESP杂志中被广泛地讨论过了(主要是P.J. Plauger,他的解释远远超过我这里能 提到的任何解释),所有回过头看一下这些杂志吧!让应试者进入种虚假的安全感觉后, 我拿出这么个小节目:下面的代码片段的输出是什么,为什么?char *ptr;if (

5、ptr = (char *)malloc(0) = NULL)puts(Got a null pointer);elseputs(Got a valid pointer);这是个有趣的问题。最近在我的个同事不经意把。值传给了函数malloc,得到了一 个合法的指针之后,我想到这个问题。这就是上面的代码,该代码的输出是“Got a valid pointer。我用这个来开始讨论这样的问题,看看被面试者是否想到库例程这样做是正确。 得到正确的答案固然車要,但解决问题的方法和你做决定的基本原理更市:要些。Typedef15 . Typedef在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可

6、以用预处理 器做类似的事。例如,思考一下下面的例子:#define dPS struct s *typedef struct s * tPS;以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针。哪种方法更好 呢?(如果有的话)为什么?这是个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案 是:typedef更好。思考下面的例子:dPS pl,p2;tPS p3,p4;第一个扩展为struct s * pl, p2;上面的代码定义pl为个指向结构的指,p2为个实际的结构,这也许不是你想要的。 第二个例子正确地定义了 p3和p4两个指针。晦涩的语法16 . C语言

7、同意些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么?int a = 5, b = 7, c;c = a+b;这个问题将做为这个测验的个愉快的结尾。不管你相不相信,上面的例子是完全合乎 语法的。问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题,根据最处 理原则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成:c = a+ + b;因此,这段代码持行后a = 6, b = 7, c = 12。如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问 题。我发现这个问题的最大好处是:这是一个关于代码编写风格,代码的可读性,代码的可 修改性的

8、好的话题嵌入式软件工程师笔试题1、将一个字符串逆序2、将一个链表逆序3、计算个字节里(byte)里面有多少bit被置14、搜索给定的字节(byte)5、在一个字符串屮找到可能的最长的子字符串6、字符串转换为整数7、整数转换为字符串! 前后交换2。直接?3 while(n=(n&n-l )count-H-;4 .5 .动态规划电子信息类公司招聘C笔试题1 .改错(5分)void test()char str10;char* str 1 =0123456789”;strcpy(str, strl);2 .改错(5分)void test()(char str10, strl10;for(int =

9、0;i10; i+)(str = a;)strcpy(str, strl);3 .读程序,写出结果(5分)int sum(int a) int c = 0; static int b = 3;c += 1;b+=2;return (a + b + c);int main()int a = 2;fbr(int i = 0; ilink = q-link; q = p-link;B: p-link = q; q-link = p-link;C: q-link = p-link; p-link = q;D: q = p-link; p-link = q-link;3、在种语言中,运算符是从右向左结合

10、的(例如:a+b+e =a+(b+e)面表达式 “7(16/(3+1)*2)4啲结果是(C)A-1 ; B、! ; C、3; D、7; E、9;4、程序的局部变量存在于(B)中,全局变量存在于(A)中,动态申请数据存在于(C) 中A:数据段B:堆栈C:堆空间5、循环链表指(A、C)A:最后个节点的指针域总是指向链表头B:可疑自山膨胀的链表C:链表含有指向上一级节点的指针域D:以上都不是6、下列是个C语言函数:int f (int a)int b;switch (a)case 1 : b = 10;case 2 : b = 20;case 3 : b = 30;default: b = 0;re

11、turn b;在其它函数中调用f(1) , f (2) , f (4),的返回值依次是:D, D, DA: 10 B: 20 C: 30 D: 07、进程和线程的最主要区别在于:(B、C、D)A:进程是UNIX下的概念,线程是Windows下的概念;B:进程的效率比线程低;C:在进程中可以创造线程,但线程中不能生成进程;D:进程有自己的运行空间,线程的运行空间是共享的8、如下代码:unsigned int ulBuf10;int I;unsigned char ucInfb10;for (I = 0;K10;I+)(ulBuf=I+l;uclnfo = 0;sprintfif uclnfo J

12、%s”,ulBuf);请问uclnfo中的值应该是什么(D)A: 0 B: 1 C: 或1 D:不确定9、下面程序的运行结果是多少?(D)main () char chr= 127;int sum = 200;chr += 1;sum +=chr;printfpsum = %dn”,sum);retum(O);A: 327B:328C:99D:7211、软件需求分析阶段的测试手段一般采用(C)。A总结B阶段性报告C需求分析评审D不测试12、有如下的Hash函数:unsigned short hashf (unsigned short key) return (key 4) % 256 hash

13、f(16)和 hashf(256)的值A: 1,16 B: 8,32 C: 4,15 D: 1,3213、enumA,B,C,D,E,K=8,J,M;请说出 D=A: 3 B:4 C: 5 D: 6 E :714、下面的代码中的含义是什么#ifhdef _oss_LIB_H_/define _oss_LIB_H_#endifA.包含oss的Lib库 B:定义个常量C,不包含oss的Lib库D.防止头文件被重复引用15、下面程序的运行结果是多少?#include main() char chr = 127; int sum = 200;chr += 1; sum += chr; pfintfif

14、 tsum=%d/n,sum); return 0 ; A:327B:328 C: 199 D: 7216、以下手段哪些可用于进程间的同步与互斥A:信号量与PV原语B: B树 C:进程上下文D:临界区加锁17、对栈S进行下列操作:push(l), push(2), pop( ), pop( )则此时栈顶元素是A: 1 B: 2 C: 0 D:不确定18、switch(c)中的c不能是哪种数据类型A: char B: long C: unsigned D: double E: float19、在Windows95环境下,定义数组:int*a23:则数组a所占用的内存单元为A: 6字节 B: 24

15、字节 C: 48字节 D:不能确定20、类型定义:chair S3=AB char *p;在执行了语句p=s之后,*(p+2)的值是A: B B:字符,B的地址C:D:不确定E:以上答案均不正确21、下面对宏的定义和使用,哪些是错误的?A: #define RECTANGLE一AREA(a, b) (a * b)B: #define RECTANGLE_AREA(a,b) ( a )* (b)C: #define INTI_RECT_VALUE( a, b )D: #define MBUF_CLEAR_FLAG(pstMBufM, ulflagM) (pstMEufM)-stUserTagDa

16、ta.stCommonlnfb.ulFlag &=( (ulFlagM) 21、下面叉树前序遍历的顺序是a /b cA: a,b,c B: b,a,c C: b,c,a D: c,b,a22、对下列关键字序列用快速排序进行排序时,速度最快的情形是A: 25、23、30、17、21、5、9B: 21、9、17、30、25、23、5)C: 21、 25、 5、 17、 9、 23、 30D: 5、 9、 17、 21、 23、 25、 30)23、在下列叙述中,错误的一条是A:操作系统是用户与计算之间的接口;B:程序的并发执行,使程序失去了顺序执行时具有的封闭性和可再现性,程序与程序的执 行不再对

17、应。C:进程从个状态到别个状态的转换,都是靠使用不同的原语来实现。D:在单CPU的系统中,任何时刻处于就绪状态的进程有多个,而且,只有处于就绪状态 的进程经调度程序选中后方可进入运行状态。24、下面关于内容存管理的说法哪种是正确的A:页式内存管理存在严重的碎片问题B:段式内存管理不存在抖动问题C:分区式内存管理既存在碎片问题,又存在抖动问题D:段页式内存管理既减少了碎片问题,又减少了抖动问题 二、简答题1、const char*, char const*, char*const 的区另1?解答:把个声明从右向左读。char * const cp; ( * I买成 pointer to ) cp

18、 is a const pointer to char const char * p; p is a pointer to const char;char const * p;同上因为C+里面没有const的运算符,所以const只能属于前面的类型。2,下面这个程序执行后会有什么错误或者效果:#define MAX 255 int main() (unsigned char AMAX,i;for (i=0;i=MAX;i+)A=i;解答:MAX=255数组A的下标范围为:0.MAX-1,这是其.其二.当i循环到255时,循环内执行:A255=255;这句本身没有问题.但是返回for(i=0;i

19、=MAX;i+)语句时,山于unsigned char的取值范围在(0.255),i+以后i又为 了.无限循环下去.注:char 类型为个字节,取值范围是-128, 127, unsigned char 0 ,2553、ASSERT。是干什么用的 解答:ASSERT。是个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表 达式为FALSE (),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的 语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导 致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为,如果为可能导致 错误,你可以这

20、样写程序:ASSERT( n != 0); k = 10/ n;ASSERT只有在Debug版本中有效,如果编译为Release版本则被忽略。assert。的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个近要区别是可以 用在Release版本中。4、头文件中的ifndef/define/endif干什么用?解答:防止该头文件被重复引用。5、#include 和 #include filename.h”有什么区别?解答:对于#include ,编译器从标准库路径开始搜索filename.h对于#include filename.h”,编译器从用户的工作路径开始搜索filena

21、me.h6, const有什么用途?(请至少说明两种)解答:(1)可以定义const常量(2) const可以修饰函数的参数、返冋值,甚至函数的定义体。被const修饰的东 西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。7、在C+程序中调用被C编译器编译后的函数,为什么要加extern C?解答:C+语言支持函数重载,C语言不支持函数重载。函数被C+编译后在库中的名字 j C语言的不同。假设某个函数的原型为:void fbo(int x, int y);该函数被C编译器编译后在库中的名字为fb。,而C+编译器则会产生像_fbo int int之类的名字。C+提供了 C连接交换指定符

22、号extemC”来解决名字匹配问题。8、void GetMemory(char *p)(p = (char *)malloc(100);void Test(void)(char *str = NULL;GetMemory(str);strcpy(str, hello world);printf(str);)请问运行Test函数会有什么样的结果?解答:程序崩溃。因为GetMemory并不能传递动态内存,Test函数中的str 一直都是NULL。strcpy(str, hello world);将使程序崩溃。9、char *GetMemory(void)fchar p = hello world;return p;void Test(void)char *str =

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁