logo资料库

计算机专业必备笔试面试题.doc

第1页 / 共60页
第2页 / 共60页
第3页 / 共60页
第4页 / 共60页
第5页 / 共60页
第6页 / 共60页
第7页 / 共60页
第8页 / 共60页
资料共60页,剩余部分请下载后查看
1. static 有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。 它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块 的本地范围内使用 2. 引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 3. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性。 4. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈。 5. 什么是平衡二叉树? 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于 1。 6. 堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。 7. 什么函数不能声明为虚函数? constructor 函数不能声明为虚函数。 8. 冒泡排序算法的时间复杂度是什么? 时间复杂度是 O(n^2)。 9. 写出 float x 与“零值”比较的 if 语句。 if(x>0.000001&&x<-0.000001) 10. Internet 采用哪种网络协议?该协议的主要层次结构? Tcp/Ip 协议 主要层次结构为: 应用层/传输层/网络层/数据链路层/物理层。 11. Internet 物理地址和 IP 地址转换采用什么协议? ARP (Address Resolution Protocol)(地址解析协议 ) 12. IP 地址的编码分为哪俩部分? IP 地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些是主机位。 13. 用户输入 M,N 值,从 1 至 N 开始顺序循环数数,每数到 M 输出该数值,直至全部输出。写出 C 程序。 循环链表,用取余操作做
14. 不能做 switch()的参数类型是: switch 的参数不能为实型。 华为 C/C++笔试题(2) 1. 某 32 位系统下, C++程序,请计算 sizeof 的值 #include #include void Foo ( char str[100] ) { printf("sizeof(str)=%d \n", sizeof(str) ); } main() { char str[] = "www.ibegroup.com"; char *p1 = str ; int n = 10; void *p2 = malloc( 100 ); printf("sizeof(str)=%d \n", sizeof(str) ); printf("sizeof(p1)=%d \n", sizeof(p1) ); printf("sizeof(n)=%d \n", sizeof(n) ); printf("sizeof(p2)=%d \n", sizeof(p2) ); Foo(str); } 答:(1)17 (2)4 (3) 4 (4)4 (5)4 2. 回答下面的问题 (1) 头文件中的 ifndef/define/endif 干什么用? 预处理 答:防止头文件被重复引用 (2) #include 和 #include "filename.h" 有什么区别? 答: 对于#include ,编译器从标准库路径开始搜索 filename.h 对于#include "filename.h" ,编译器从用户的工作路径开始搜索 filename.h (3) 在 C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明? 答:函数和变量被 C++编译后在符号库中的名字与 C 语言的不同,被 extern "C"修饰的变量和函数是按照 C 语言方式
编译和连接的。由于编译后的名字不同,C++程序不能直接调用 C 函数。C++提供了一个 C 连接交换指定符号 extern“C”来解决这个问题。 3. 回答下面的问题 (1) 请问运行 Test 函数会有什么样的结果? Void GetMemory(char **p, int num) { *p = (char *)malloc(num); } void Test(void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } 答:输出“hello” (2) 请问运行 Test 函数会有什么样的结果? void Test(void) { char *str = (char *) malloc(100); strcpy(str, “hello”); free(str); if(str != NULL) { strcpy(str, “world”); printf(str); } } 答:输出“world” (3) 请问运行 Test 函数会有什么样的结果? char *GetMemory(void) { char p[] = "hello world"; return p; }
void Test(void) { char *str = NULL; str = GetMemory(); printf(str); } 答:无效的指针,输出不确定 4. 编写 strcat 函数 已知 strcat 函数的原型是 char *strcat (char *strDest, const char *strSrc); 其中 strDest 是目的字符串, strSrc 是源字符串。 (1)不调用 C++/C 的字符串库函数,请编写函数 strcat 答:VC 源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ } (2)strcat 能把 strSrc 的内容连接到 strDest,为什么还要 char * 类型的返回值? 答:方便赋值给其他变量 5. 程序什么时候应该使用线程,什么时候单线程效率高 (1) 耗时的操作使用线程,提高应用程序响应 (2) 并行操作时使用线程,如 C/S 架构的服务器端并发线程响应用户的请求。 (3) 多 CPU 系统中,使用线程提高 CPU 利用率 (4) 改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独 立的运行部分,这样的程序会利于理解和修改。 其他情况都使用单线程。 6. C++中什么数据分配在栈或堆中,New 分配数据是在近堆还是远堆中? 答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理堆: 程序运行时动态申请,new 和 malloc 申请的内存就在堆上
7. 关于内存对齐的问题以及 sizof()的输出 答:编译器自动对齐的原因:为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为 了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。 8. int i=10, j=10, k=3; k*=i+j; k 最后的值是? 答:60,此题考察优先级,实际写成: k*=(i+j);,赋值运算符优先级最低 9. 动态连接库的两种方式? 答:调用一个 DLL 中的函数有两种方法: 1.载入时动态链接(load-time dynamic linking),模块非常明确调用某个导出函数,使得他们就像本地函数一样。 这需要链接时链接那些函数所在 DLL 的导入库,导入库向系统提供了载入 DLL 时所需的信息及 DLL 函数定位。 2.运行时动态链接(run-time dynamic linking),运行时可以通过 LoadLibrary 或 LoadLibraryEx 函数载入 DLL。DLL 载入后,模块可以通过调用 GetProcAddress 获取 DLL 函数的出口地址,然后就可以通过返回的函数指针 调用 DLL 函数了。如此即可避免导入库文件了 10. 函数模板与类模板有什么区别? 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。 11.Windows 是内核级线程么。 答:见下一题 12. Linux 有内核级线程么。 答:线程通常被定义为一个进程中代码的不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核级 线程”。 用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,应用进程利用线程库提供创 建、同步、调度和管理线程的函数来控制用户线程。这种线程甚至在象 DOS 这样的操作系统中也可实现,但线程的调度 需要用户程序完成,这有些类似 Windows 3.x 的协作式多任务。另外一种则需要内核的参与,由内核完成线程的调度。 其依赖于操作系统核心,由内核的内部需求进行创建和撤销,这两种模型各有其好处和缺点。用户线程不需要额外的内核 开支,并且用户态线程的实现方式可以被定制或修改以适应特殊应用的要求,但是当一个线程因 I/O 而处于等待状态时, 整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会;而内核线程则没有各个限制,有利于发挥多处理 器的并发优势,但却占用了更多的系统开支。 Windows NT 和 OS/2 支持内核线程。Linux 支持内核级的多线程 13. 使用线程是如何防止出现大的波峰。 答:意思是如何防止同时产生大量的线程,方法是使用线程池,线程池具有可以同时提高调度效率和限制资源使用的好处, 线程池中的线程达到最大数时,其他线程就会排队等候。 14. 写出判断 ABCD 四个表达式是否正确, 若正确, 写出经过表达式中 a 的值 int a = 4;
(A) a += (a++); (B) a += (++a); (C) (a++) += a; (D) (++a) += (a++); a = ? 答:C 错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a; 改后答案依次为 9,10,10,11 15. MFC 中 CString 是类型安全类么? 答:不是,其它数据类型转换到 CString 可以使用 CString 的成员函数 Format 来转换 16. C++中为什么用模板类。 答: (1) 可用来创建动态增长和减小的数据结构 (2) 它是类型无关的,因此具有很高的可复用性。 (3) 它在编译时而不是运行时检查数据类型,保证了类型安全 (4) 它是平台无关的,可移植性 (5) 可用于基本数据类型 17. CSingleLock 是干什么的。 答:同步多个线程对一个数据类的同时访问 18. 局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译 器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变 量的作用域就在那个循环体内。 19. 如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用 extern 关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理, 假定你将那个变写错了,那么在编译期间会报错,如果你用 extern 方式引用时,假定你犯了同样的错误,那么在编译期 间不会报错,而在连接期间报错。 20. 全局变量可不可以定义在可被多个.C 文件包含的头文件中?为什么? 答:可以,在不同的 C 文件中以 static 形式来声明同名全局变量。 可以在不同的 C 文件中声明同名的全局变量,前提是其中只能有一个 C 文件中对此变量赋初值,此时连接不会出错。
21. 语句 for( ;1 ;)有什么问题?它是什么意思? 答:无限循环,和 while(1)相同。 22. do……while 和 while……do 有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环。 23. 请写出下列代码的输出内容 #include main() { int a,b,c,d; a=10; b=a++; c=++a; d=10*a++; printf("b,c,d:%d,%d,%d",b,c,d); return 0; } 答:10,12,120 华为 C/C++笔试题(3) 1. 找错 #define MAX_SRM 256 DSN get_SRM_no() { static int SRM_no; int I; for(I=0;I
if(I>=MAX_SRM) return (NULL_SRM); else return SRM_no; } 答: (1). SRM_no 没有赋初值 (2). 由于 static 的声明,使该函数成为不可重入(即不可预测结果)函数,因为 SRM_no 变量放在程序的全局存储区 中,每次调用的时候还可以保持原来的赋值。这里应该去掉 static 声明。 2. 写出程序运行结果 int sum(int a) { auto int c=0; static int b=3; c+=1; b+=2; return(a+b+C); } void main() { int I; int a=2; for(I=0;I<5;I++) { printf("%d,", sum(a)); } } 答:8,10,12,14,16 该题比较简单。只要注意 b 声明为 static 静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。 3. int func(int a) { int b; switch(a)
分享到:
收藏