2015年东软C语言方向笔试题搜集_第1页
2015年东软C语言方向笔试题搜集_第2页
2015年东软C语言方向笔试题搜集_第3页
2015年东软C语言方向笔试题搜集_第4页
2015年东软C语言方向笔试题搜集_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言笔试题及参考答案-东软集团 1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用 : 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用

2、时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。 3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错 4、语句for( ;1 ;)有什么问题?它是什么意思? 答:和while(1)相同。 5、dowhile和whiledo有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环 6、请写出下列代码的输出内容 #include main() int a,b,c,d; a=10; b=a+;

3、c=+a; d=10*a+; printf( b,c,d:%d,%d,%d ,b,c,d); return 0; 答:10,12,120 7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了

4、其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。 static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

5、 static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝 8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。 9、设有以下说明和定义: typedef union long i; int k5; char c; DATE; struct data int cat; DATE cow

6、; double dog; too; DATE max; 则语句 printf( %d ,sizeof(struct date)+sizeof(max);的执行结果是:_52_ 答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int5, 占用20个字节. 所以它的大小是20 data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52. 当然.在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20 10、队列和栈有什么区别

7、? 队列先进先出,栈后进先出 11、写出下列代码的输出内容 #include int inc(int a) return(+a); int multi(int*a,int*b,int*c) return(*c=*a*b); typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) INCp= &inc; int temp =p(arg1); fun( &temp,&arg1, arg2); printf( %dn ,*arg2); main()

8、 int a; show(multi,10, &a); return 0; 答:110 11、请找出下面代码中的所以错误 说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba” 1、#include string.h 2、main() 3、 4、 char*src= hello,world ; 5、 char* dest=NULL; 6、 int len=strlen(src); 7、 dest=(char*)malloc(len); 8、 char* d=dest; 9、 char* s=srclen; 10、 while(len-!=0) 11、 d+=s-; 12、 pr

9、intf( %s ,dest); 13、 return 0; 14、 答: 方法1: int main() char* src = hello,world ; int len = strlen(src); char* dest = (char*)malloc(len+1);/要为0分配一个空间 char* d = dest; char* s = &srclen-1;/指向最后一个字符 while( len- != 0 ) *d+=*s-; *d = 0;/尾部要加0 printf( %sn ,dest); free(dest);/ 使用完,应当释放空间,以免造成内存汇泄露 return 0;

10、方法2: #include #include main() char str= hello,world ; int len=strlen(str); char t; for(int i=0; i t=stri; stri=strlen-i-1; strlen-i-1=t; printf( %s ,str); return 0; 12。对于一个频繁使用的短小函数,在C语言中应用什么实现,在C+中应用什么实现?答案:c用宏定义,c+用inline13。软件测试都有那些种类?答案:黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口14。确定模块的功能和模块的接口是在软件设计的那个队段完成的?答

11、案:概要设计阶段15。enum stringx1,x2,x3=10,x4,x5,x;问x;答案:取值在0。1。10。11。12中的一个16。unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x;p2=(unsigned long *)0x;请问p1+5= ;p2+20= ;答案:; 。不要忘记了这个是16进制的数字,p2要加20变为16进制就是14选择题:1.Ethternet链接到Internet用到以下那个协议?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID2.属于网络层协议的是:A.TCP;B.IP;C.ICMP

12、;D.X.253.Windows消息调度机制是:A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;答案:b,a,c二找错题:1.请问下面程序有什么错误?int a602501000,i,j,k;for(k=0;k=1000;k+)for(j=0;j250;j+)for(i=0;iMax_GT_Length)return GT_Length_ERROR; .答案:要释放内存1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;答:/假设线性表的双向链表存储结构typedef struct DulNodestruct DulNode *prior; /前驱指针ElemTyp

13、e data; /数据struct DulNode *next; /后继指针DulNode,*DuLinkList;/删除操作Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e)if(!(p=GetElemP_DuL(L,i) /此处得到i位置的节点指针,如果有需要也得写出具体函数实现return ERROR;e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);return OK;/插入操作Status ListInsert_DuL(DuLinkList &L,int i,El

14、emType &e)if(!(p=GetElemP_DuL(L,i)return ERROR;if(!(s=(DuLinkList)malloc(sizeof(DuLNode)return ERROR;s-data=e;s-prior=p-prior;p-prior-next=s;s-next=p;p-prior=s;return OK;2.写一个函数,将其中的t都转换成4个空格。答:该函数命名为convert,参数的意义为:*strDest目的字符串,*strSrc源字符串,length源字符串的长度函数实现为:char* convert(char *strDest, const char

15、*strSrc,int length)char * cp = strDest;int i=0;while(*strSrc & iif (*strSrc=t) /将t转换成4个空格for(int j=0;j4;j+)*cp+= ;else /否则直接拷贝*cp+=*strSrc;strSrc+;i+;return strDest;3.Windows程序的入口是哪里?写出Windows消息机制的流程。答:Windows程序的入口是WinMain函数消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该

16、窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。4.如何定义和实现一个类的成员函数为回调函数?答:所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别5.C+里面是不是所有的动作都是main()引起的?如果不是,请举例。答:不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的

17、。6.C+里面如何声明const void f(void)函数为C程序中的库函数?答:在该函数前添加extern “C”声明7.下列哪两个是等同的int b;A const int* a = &b;B const* int a = &b;C const int* const a = &b;D int const* const a = &b;答:各式表示的意思分别为:A const int* a = &b; /*a是const,但指针a可变B const* int a = &b; /a是const,但*a可变C const int* const a = &b; /a和*a都是const,常量和指

18、针的值都不能改变D int const* const a = &b; /a和*a都是const,常量和指针的值都不能改变因此C,D两者是相同的。总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。8. 内联函数在编译时是否做参数类型检查?答:做类型检查,因为内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来代替1. C+中如何阻止一个类被实例化?纯虚函数;构造函数私有化(友元)2. 一般在什么时候构造函数被声明成private呢?si

19、ngleton模式; 阻止某些操作(如阻止拷贝构造)3. 什么时候编译器会生成默认的copy constructor呢?用户没有自定义copy constructor;在代码中使用到了copy constructor;4. 如果你已经写了一个构造函数,编译器还会生成copy constructor吗?5. struct和class有什么区别?答:默认的访问级别不同,struct是public,class是private6. 没有别的不同了吗?7. 为什么说如果一个类作为基类,则它的析构函数要声明成virtual的?因为,如果delete一个基类的指针时, 如果它指向的是一个子类的对象,那么析构

20、函数不为虚就会导致无法调用子类析构函数,从而导致资源泄露。 当然,另一种做法是将基类析构函数设为protected.8. inline的函数和#define有什么区别?1) 宏是在预编译阶段简单文本替代, inline在编译阶段实现展开2)宏肯定会被替代,而复杂的inline函数不会被展开3)宏容易出错(运算顺序),且难以被调试,inline不会4)宏不是类型安全,而inline是类型安全的,会提供参数与返回值的类型检查当出现以下情况时inline失败9. inline是什么意思?10. 那你说说什么时候会真的被inline,什么时候不会呢?当出现以下情况时inline失败:函数size太大;

21、inline虚函数函数中存在循环或递归函数;调用其他inline函数11. 如果把一个类的成员函数写在类的声明中是什么意思?inline此函数 (inline与template类似, 必须在.h中实现)12. public继承和private继承有什么架构上的区别?public是is-a的关系,继承接口与实现;private是has-a的关系 ,只继承实现13. 在多继承的时候,如果一个类继承同时继承自class A和class B,而class A和B中都有一个函数叫foo(),如何明确的在子类中指出override哪个父类的foo()?14. 虚拟继承的语法是什么?A/ B C /Dcla

22、ss A;class B: virtual public A;class C: virtual public A;class D: public B, public C;.找错试题1:CodeVoid test1()char string10;char* str1=;strcpy(string, str1);试题2:CodeVoid test2()char string10, str110;for(I=0; I10;I+)str1i =a;strcpy(string, str1);试题3:CodeVoid test3(char* str1)char string10;if(strlen(str

23、1) = 10)strcpy(string, str1);解答:test1: 字符串str1需要11个字节才能存放下(包括末尾的0),而string只有10个字节的空间,strcpy会导致数组越界test2: 如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分test3: if(strlen(str1) = 10)应改为if(strlen(str1) = EPSINON) & (x =”或“=”形式

24、。如果写成if (x = 0.0),则判为错,得0分。试题2:以下为Windows NT下的32位C+程序,请计算sizeof的值void Func ( char str100 )sizeof( str ) = ?void *p = malloc( 100 );sizeof ( p ) = ?解答:sizeof( str ) = 4sizeof ( p ) = 4剖析:Func ( char str100 )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1) 数

25、组名指代一种数据结构,这种数据结构就是数组;例如:char str10;cout sizeof(str) endl;输出结果为10,str指代数据结构char10。(2) 数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;char str10;str+; /编译出错,提示str不是左值(3) 数组名作为函数形参时,沦为普通指针。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当你写下面的

26、代码时会发生什么事?least = MIN(*p+, b);解答:#define MIN(A,B) (A) = (B) ? (A) : (B)MIN(*p+, b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1) 谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN

27、(A,B) (A = B ? A : B ) 都应判0分;(2) 防止宏的副作用。宏定义#define MIN(A,B) (A) = (B) ? (A) : (B)对MIN(*p+, b)的作用结果是:(*p+) = (b) ? (*p+) : (*p+) 这个表达式会产生副作用,指针p会作三次+自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B) (A) 1 + 2 * 3 其实是想要(1 + 2) * 32) 作为值返回时,类似1)#define ADD(a,b) (a) + (b)int c = ADD(a,b) * 3; = (a) + (b) * 3 其实是

28、想要(a + b) * 3所以,一般的规则是:宏里面参数全部用括号括起来;如果作为值返回,整个表达式也用括号括起来。所以,上面最好这么写:#define MULTI(a,b) (a) * (b)#define ADD(a,b) (a) + (b)2、实际使用参数和宏内部变量同名#define HASH(str,sz,rst) dounsigned int n = 0; n = xxx; rst = n % sz;while(0)这是一个hash的宏实现,其中定义了一个临时变量n,根据str计算n,然后对sz求模并把返回值赋给传进来的rst.这么调用:int n;HASH(“hello”,7,n

29、);不会达到改变n的效果,因为实际使用参数n和宏内部的变量n同名。宏扩展中最后一条语句是:n = n % sz;因为宏内部n有更小作 用域,实际赋值的是宏内部的那个临时变量n。外面调用的n不会有任何改变。这个副作用有些隐蔽,一般的规则是:宏内部变量使用一种不同风格的命名方式。比如:#define HASH(str,sz,rst) dounsigned int _n = 0; _n = 3、+,#define MAX(a,b) (a) (b) ? (a) : (b)int a = 3,b = 2;int c = MAX(a+,b);执行看看,不但a的值不是和想要的一致,返回值c也会让你大吃一惊,

30、哈哈。(a = 5,c = 4)在宏内部一个变量”执行”多少次,它就自增或自减了多少次。所以一般使用宏最好不要传入自增自减。如果你一定要在宏里消除这个副作用,可以这样:#define MAX(a,b) (int _x = (a), _y = (b);(_x _y) ? _x : _y;)也就是:保证传入宏的参数在内部只使用一次。(注意:传入a+或+a都能得到各自正确的效果)这里的内部变量_x,_y是不需要用括号包起来的,原因可以自己想想。另外对宏中括号的使用补充说明两点:因为宏中定义了临时变量,所以要用括起来;因为要返回值,所以外面还要用()括起来(不返回值);另外,这里还有一个问题:实际中a

31、,b不一定是int的,这个宏中的临时变量声明为int,不通用。改进:#define MAX(a,b,type) (type _x = (a), _y = (b);(_x _y) ? _x : _y;)使用:MAX(1,2,int); MAX(1.1,1.2,double);是不是感觉怪怪的,有点c+的感觉 这样的使用太复杂了,而且也会给代码的阅读带来难度。我觉得好的态度是多了解些宏的可能的副作用,在实际编码中遵守第1、2条规则,不要往宏中传入自增自减的东西,就够了。不要把过多的复杂度全扔给宏,”通用”也不能盲目,因为毕竟:yy是没有极限的。试题4:为什么标准头文件都有类似以下的结构?Code#

32、ifndef _INCvxWorksh#define _INCvxWorksh#ifdef _cplusplusextern “C” #endif/*/#ifdef _cplusplus#endif#endif /* _INCvxWorksh */解答:头文件中的编译宏#ifndef _INCvxWorksh#define _INCvxWorksh#endif的作用是防止被重复引用。作为一种面向对象的语言,C+支持函数重载,而过程式语言C则不支持。函数被C+编译后在symbol库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编

33、译后在symbol库中的名字为_foo,而C+编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C+就是考这种机制来实现函数重载的。为了实现C和C+的混合编程,C+提供了C连接交换指定符号extern “C”来解决名字匹配问题,函数声明前加上extern “C”后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C+的函数了。试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”函数头是这样的:/pSt

34、r是指向以0结尾的字符串的指针/steps是要求移动的nvoid LoopMove ( char * pStr, int steps )/请填充解答:正确解答1:Codevoid LoopMove ( char *pStr, int steps )int n = strlen( pStr ) steps;char tmpMAX_LEN;strcpy ( tmp, pStr + n );strcpy ( tmp + steps, pStr);*( tmp + strlen ( pStr ) ) = 0;strcpy( pStr, tmp );正确解答2:Codevoid LoopMove ( c

35、har *pStr, int steps )int n = strlen( pStr ) steps;char tmpMAX_LEN;memcpy( tmp, pStr + n, steps );memcpy(pStr + steps, pStr, n );memcpy(pStr, tmp, steps );剖析:这个试题主要考查面试者对标准库函数的熟练程度,在需要的时候引用库函数可以很大程度上简化程序编写的工作量。最频繁被使用的库函数包括:(1) strcpy(2) memcpy(3) memsetmemcpy原型:extern void *memcpy(void *dest, void *

36、src, unsigned int count);用法:#include功能:由src所指内存区域复制count个字节到dest所指内存区域。说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。注意:与strcpy相比,memcpy并不是遇到0就结束,而是一定会拷贝完n个字节。举例:/ memcpy.c#include#includeint main(int argc, char* argv)char *s=”Golden Global View”;char d20;clrscr();memcpy(d,s,strlen(s);dstrlen(s)=0;printf(“%s”

37、,d);getchar();return 0;截取view#includeint main(int argc, char* argv)char *s=”Golden Global View”;char d20;memcpy(d,s+14,4);/memcpy(d,s+14*sizeof(char),4*sizeof(char);也可d4=0;printf(“%s”,d);getchar();return 0;输出结果:View初始化数组char msg10;memcpy(msg,0,sizeof(msg);memset函数原型void *memset(void *s, int ch, unsi

38、gned n);编辑本段程序例#include#include#includememset函数int main(void)char buffer = “Hello worldn”;printf(“Buffer before memset: %sn”, buffer);memset(buffer, *, strlen(buffer) );printf(“Buffer after memset: %sn”, buffer);return 0;输出结果:Buffer before memset: Hello worldBuffer after memset: *编译平台:Microsoft Visu

39、al C+ 6.0也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样:int array5 = 1,4,3,5,2;for(int i = 0; i 5; i+)coutarrayi ;coutendl;memset(array,0,5*sizeof(int);for(int k = 0; k 5; k+)coutarrayk ;coutendl;输出的结果就是:1 4 3 5 20 0 0 0 0后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小

40、也可能不同,所以最好用sizeof()。要注意的是,memset是对字节进行操作,所以上述程序如果改为int array5 = 1,4,3,5,2;for(int i = 0; i 5; i+)coutarrayi ;coutendl;memset(array,1,5*sizeof(int);/ 注意 这里与上面的程序不同for(int k = 0; k 5; k+)coutarrayk ;coutendl;输出的结果就是:1 4 3 5 2 为什么呢?因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是,占一个字节。一个INT元素是4字节,合一起就是,就等于,就完成了对一个INT元素的赋值了。所

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论