您好,欢迎访问三七文档
--1--c语言常见笔试题总结【1使用宏】1.1#ifdefNDEBUG#defineTRACE(S)S#else#defineTRACE(S)printf(%s;\n,#S);S#endif问:以上TRACE()宏的作用是什么?如果NDEBUG为真则不打印信息,如果NDEBUG为假,则打印信息1.2#error的作用?1.2#error用于向编译器报错,并输出它后面带的错误信息。例如:#ifndefSOMETHING#errorSOMETHINGnotdefined!#endif如果在这段代码之前未定义过SOMETHING,则在编译时出错,并给出SOMETHINGnotdefined!的错误信息。1.3定义一个宏,求出给定数组中的元素的个数#defineNELEMENTS(array)??#defineNELEMENTS(array)sizeof(array)/sizeof(array[0])1.4定义一个宏,求出给定结构中给定成员的偏移量#defineOFFSET(structure,member)??【2数据声明和定义】给定以下类型的变量a的定义式:a)Anintegerintab)Apointertoanintegerint*ac)Apointertoapointertoanintegerint**ad)Anarrayof10integersinta[10]={0x00};e)Anarrayof10pointerstointegersint*a[10];f)Apointertoanarrayof10integersint(*a)[10]g)ApointertoaIfunction/Ithattakesanintegerasanargumentandreturnsanintegerint(*a)(int)h)AnarrayoftenpointerstoIfunction/Isthattakeanintegerargumentandreturnanintegerint(*a[10])(int)【3复杂类型(1)】有如下表达式:char(*(*x())[])();请用文字描述x是什么。指向函数的指针数组,回答:声明x是一个函数指针数组,函数的返回值类型是字符指针,参数为空这道题来自TheCProgrammingLanguage中的一个例子。首先,确定标识符:xx是一个函数,没有参数:x()--2--返回值是一个指针:*x()这个指针指向一个数组:(*x())[]数组中的每个元素是指针:*(*x())[]指向一个不带参数的函数:(*(*x())[])()函数的返回值是char:char(*(*x())[])()这里,要知道*、()和[]的优先级。【4复杂类型(2)】jmp_buf的定义:typedefstruct_jmp_buf{REG_SETreg;intextra[3];}jmp_buf[1];setjmp函数的原型:externintsetjmp(jmp_buf__env);问:调用setjmp时传递__env的内容,还是传递指针?这个定义有点怪,它的意思是:jmp_buf这种类型是一个数组,只有一个元素,元素类型为struct{...}。数组名作为函数参数时,应该是传递地址/指针。【5头文件】问:为什么标准头文件都有类似以下的结构?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif/*...*/#ifdef__cplusplus}#endif#endif/*__INCvxWorksh*/在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C++中使用externC可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标准C编译器所生成的目标文件相链接。【6static关键字】请说出static关键字的3种用处:(1)用于全局变量;(2)用于局部变量;(3)用于函数。/*file.c*/staticinta;intb;staticintfn(){--3--staticintx;inty;}(1)用于全局变量:外部静态变量,只能在本源文件中被引用,不能被其它源文件所引用。(2)用于局部变量:局部静态变量,在函数返回后存储单元不释放;下一次调用该函数时,该变量为上次函数返回时的值。(3)用于函数:内部函数,只能被本源文件中的函数所调用,不能被其它源文件调用。【7const关键字】7.1const关键字的意义是什么?定义一个常量其值不能修改。7.2解释以下的变量定义:constinta1;定义一个整形常量intconsta2;定义一个整形常量constint*a3;定义一个整形指针指向一个整形常量int*consta4;定义一个常量指针指向一个整形变量intconst*consta5;定义一个常量指针指向一个整形常量【8volatile关键字】8.1volatile意义?例如表示该值是不确定的可能会在任意情况下被修改,常用来定义寄存器值和内存变量volatileint*p;8.2volatile能和const一起使用吗?例如volatileconstint*p;const关键字的意思是限制编程者自己不能修改变量的值;两者并不矛盾。【9sizeof()】有以下定义:char*pmsg=A;charmsg[]=A;charch='A';问:sizeof(pmsg)=?指针变量的长度sizeof(msg)=?字符数组的长度2sizeof(“A”)=?字符串的长度A+结束符一共2个字节sizeof(ch)=?1sizeof(‘A’)=?1(在C++中等于多少?)voidf(charparam[100]){//sizeof(param)=?指针变量的长度}【10字符串】有以下代码char*pmsg=hello,world!;strcpy(pmsg,hi,there.);试评论该代码。【11混合运算】有以下代码:voidfoo(){unsignedinta=6;intb=-20;(a+b6)?puts(6):puts(=6);}--4--请问调用foo()的输出?6混合运算时的数据类型转换次序【12内存访问】有以下代码:voidfn(){inta[100];int*p;p=(int*)((unsignedint)a+1);printf(“p=0x%x\n”,*p);}代码的意图是想使p指向数组的第二个元素,但通常的写法是:p=a+1。这里存在这样的问题:a是个常量地址,a+1指向下一个数组元素,而((unsignedint)a+1)指向下一个内存地址。如果地址是字节计数的,则p指向的是数组第一个元素的第二个字节。试评论以上代码。【13C库函数】请说明以下函数的意义:voidperror(constchar*__s);perror函数将错误信息打印到标准错误输出,首先打印参数s所指的字符串,然后打印:号,然后根据当前errno的值打印错误原因。fdprintf(int,constchar*,...);传送格式化输出到一个文件中isspace(),isxdigit(),strerr(),sprintf()coon@23:44:01|阅读全文|评论0|引用0|编辑c语言笔试题(九)2006-09-06Tag:C语言1.#includestdio.hintmain(){inta;int*p;p=&a;*p=0x500;a=(int)(*(&p));a=(int)(&(*p));if(a==(int)p)printf(equal!\n);elseprintf(notequal!\n);}请问本程序的输出显示是什么?答案:输出显示为”equal!”--5--2.struct{signedintbit0:1;signedintbit1:1;signedintbit2:1;signedintbit3:1;signedintbit4:1;signedintbit5:1;signedintbit6:1;signedintbit7:1;}bits;请问sizeof(bits)是否是正确的表达式?请问语句bitsmybits;的定义是否正确?如果不正确,要如何修改上述的结构定义才能使该语句正确?修改后的结构定义是否会影响sizeof(bits)的正确性?如果正确则该表达式的值为多少?如果将上述的结构中int类型改为char类型,此时sizeof(bits)的大小为多少?答案:1)是正确的表达式,因为sizeof后面的内容可以是类型,也可以是变量。2)该语句的定义不正确,因为此时的bits为一个变量;应该这样修改结构的定义typedefstruct{signedintbit0:1;signedintbit1:1;signedintbit2:1;signedintbit3:1;signedintbit4:1;signedintbit5:1;signedintbit6:1;signedintbit7:1;}bits;修改后sizeof(bits)表达式依然正确,其值为4;类型改为char后其值为1,注意该值是在VC环境中的32位程序中得到的值,在不同的编译器其值有可能不同,因此在编程时不能自己假定类似结构的大小。3.structbit{unsignedinta[0]:1,a[1]:1,a[2]:1….a[7]:1;}请问这种写法是否正确?为什么?答案:不正确,位域中的变量不能是数组。4.structa{intx;chary;structaz;structa*p;}请问这种定义结构正确否?如果有问题,问题在哪里?答案:结构中不能对定义结构本身的非指针变量,如果编译器支持则会导致无限嵌套,因此一般编译器都会认为structa是未定义的类型,即使提前声明也不会有任何用处。5.什么是可重入函数?C语言中写可重入函数,应注意的事项?答案:可重入函数是指能够被多个线程“同时”调用的函数,并且能保证函数结果的正确性的函数。在编写可重入函数时通常要注意如下的一些问题:尽量不要使用全局变量,静态变量,如果使用了应该注意对变量访问的互斥。通常可以根据具体的情况采用:信号量机制,关调度机制,关中断机制等方式来保证函数的可重入性。不要调用不可重入的函数,调用了不可重入的函数会使该函数也变为不可重入的函数。注意对系统中的临界资源,互斥资源的访问方式,防止使函数成为不可重入的函数。一般驱动程序都是不可重入的函数,因此在编写驱动程序时一定要注意重入的问题。--6--6.简述stackframe的含义。答案:stackframe的中文译名为:栈框架,表示函数在栈空间的调用层次,以x86平台的函数调用为例,通常一个函数编译成汇编程序,都有如下的结构:其中的leave指令相当于:movebp,esp;popebp各个函数在栈空间的映象为:test1函数test2函数test3函数因此在函数test3中,就可以根据这种栈框架的形式得到函数调用层次上的每个函数的基址指针,当前栈指针,以及函数调用点等信息。7.printf(“%d%d\n”,++n,power(2,n));其中power(2,n)为实现一定功能的函数如2^n。请问这种表示方法有什么潜在的问题?答案:编译器的不同,对++n和power(2,n)处理的先后顺序不一样,形成二义性,造成程序的移植性差,因此最好把++n写在printf函数外面,以消除二义性。printf(s);请问这样的语句有没有问题?(s为一指向有效字符串的指针)答案:没有%的话,可以这样表达,如果有%在s中的话,有意想不到的输出结果。9.两段代码共存于一个文件,编译时有选择的编译其中的一部分,请问如何实现?答案:有两种简单的办法可以实现
本文标题:c语言常见笔试总结
链接地址:https://www.777doc.com/doc-6239315 .html