c/c++程序员面试指南
面试题1:什么是c语言语句? 答:语句就是以分号”;”作为分隔符,编译后产生机器指令的代码,预处理指令不是语句。
面试题2:变量的声明和定义有什么区别? 答:为变量分配地址和存储空间的称为定义,不分配地址内存空间的称为声明。一个变量可以在多个地方声明,但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定义。
面试题3:如何以最简单的方式让电脑蜂鸣器发出声音? 答:#include<stdio.h> Int main(int argc, char *argv[]) {
Printf(“\ Return 0; }
面试题4:谈谈你对编程规范的理解或认识? 答:编程规范可总结为:程序的可行性,可读性,可移植性及可测试性。
面试题5:函数、变量等命名都有哪些规则? 答:含有数字,ASCII字母,下划线,以字母或者下划线开头,不能用保留字作变量名的情况下,还要有很高的可读性。
面试题6:写出bool,int,float,指针变量与“零值”比较的if语句? 答:bool型数据: If(flag) { A; } Else { B; } Int 型数据: If(0!=flag) { A; } Else { B; } 指针型数据: If(NULL==flag) { A; } Else { B; } Float型数据: Const float NORM=0.00001; If((flag>=NORM)&&(flag<=NORM)) { A; }
面试题7:short i=0;i=i+ 以下这两段代码都是正确的吗? 代码一:
Short s1=1;s1=s1+ 代码二:
Short s1=1;s1+= 答:代码一是错的,代码二是正确的。
“s1+
S1=(short)(s1+ 第二段代码中“+=”算符已经执行了类型强转,所以不会出错。
面试题8:char x[]={“abcd”}和char y[]={‘a’,’b’,’c’,’d’}有不同吗? 答:不同。因为char x[]={“abcd”}这种写发,是把字符串abcd包括结束符\0存到x。而char y[]={‘a’,’b’,’c’,’d’}这种是存储4个字符a,b,c,d 到数组y。
面试题9:char型数据在内存中存储形式? 答:ASCII码 (任何数据在内存中都是以二进制形式存放的,而数值是以补码表示的。正数的补码和原码和其原码的形式相同。负数的补码方式是将其绝对值的二进制形式“按位求反再加
面试题10:&&和&,||和|有什么区别? 答:(1)&和|对操作数进行求值运算,&&和||只是判断逻辑关系。 (2)&&和||在判断左侧操作数就能确定结果的情况下不再对右侧操作数求值。
面试题11:什么是左值,什么是右指? 答:右值:存储在某内存地址中的数据。也称为变量的数据。 左值:存储数据值的那块内存的地址。也称为变量的地址值。 (左值可以作为右值,但是右值不可以是左值) 面试题12:sizeof和strlen的区别 答:sizeof和strlen有以下区别: (1) sizeof是一个操作符,strlen是库函数。 (2)
sizeof的参数可以是数据类型,也可以是变量,而strlen只能以结尾’\ (3) 编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来,并且sizeof计算的是数据类型占内存的大小,而strlen计算的字符串实际的长度。 (4) 数组做sizeof的参数不退化,传递给strlen就退化为指针了。 (5) Sizeof和strlen的结果类型都是size_t.
面试题13:结构体可以直接赋值吗? 答:声明时可以直接初始化,同一结构体的不同对象之间也可以直接赋值,但是当结构体中含有指针“成员”时一定要小心。(当有多个指针指向同一段内存是,某个指针释放这段内存可能导致其他指针的非法操作。因此在释放前一定要确保其他指针不再使用这段内存空间。)
面试题14:结构体内存对齐问题? 答: 结构体作为一种复合数据类型,其构成元素既可以是基本数据类型的变量,也可以是一些复合型类型数据。对此,编译器会自动进行成员变量的对齐以提高运算速率,默认情况下,按自然对齐条件分配空间,各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同,向结构体成员中size最大的成员对齐。 位域的定义与结构体定义相仿,其形式为: Struct 位域的结构名 { 位域列表 }; 位域列表的形式为: 类型说明符 位域名:位域的长度 例如: Struct bs { Int a:8; Int b:2; Int c:6; }; 对于位域的定义,有以下几点说明: (1) 一个位域必须存储在同一个字节中, 不能跨两个字节。如果一个字节所剩空间不够存放另一位域时,应从一下单元起存放该位域。也可以有意使某个位域从下一个单元开始。 (2) 由于位域不允许跨两个字节。因此位域的长度不能大于一个字节的长度。也就是不能超过8位二进制。 (3) 位域可以无位域名,这时它只用来填充或调整位置。无名的位域是不能使用的。
面试题15:关键字static在c和c++中的区别? 答:在c中static用来修饰局部静态变量和外部静态变量 ,函数。而c++中除了上述功能外,还用来定义类的成员变量和函数,即静态成员和静态成员函数。
面试题16:c语言的结构体和c++的有什么区别?(c语言的结构体和c++的类有什么区别) 答:c语言的结构体和c++的结构体主要有以下区别: (1) c语言的结构体是不能有函数成员的,而c++的类可以有。 (2) c语言的结构体中数据成员没有private、public和protected访问限定的。而c++的类成员有这些访问限定(在c++中结构体的成员也有访问权限设定的,但是类成员的默认访问属性是private,而结构体的默认访问属性是public。 (3) c语言的结构体是没有继承关系的,而c++的类却有丰富的继承关系。
面试题17:c中的malloc和c++中的new有什么区别? 答:malloc和new有以下不同: (1) new、delete是操作符,可以重载,只能在c++中使用。 (2) malloc、free是函数,可以覆盖,c、c++中都可以使用。 (3) new可以调用对象的构造函数,对应的delete调用相应的析构函数。 (4) malloc仅仅分配内存,free仅仅回收内存。并不执行构造函数和析构函数。 (5) new,delete返回的是某种数据类型指针,malloc、free返回的是void指针。
面试题18:c++的引用和c语言的指针有什么区别? 答:指针和引用主要有以下区别: (1) 引用必须被初始化,但是不分配存储空间,指针声明时可以不初始化,在初始化的时候需要分配存储空间。 (2) 引用初始化以后不能被改变,指针可以改变所指的对象。 (3) 不存在指向空值的引用。但是存在指向空值的指针。
第四章 预处理 保留字 预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。预处理是c、c++语言的一个重要功能特性。它由预处理程序负责完成,。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入源程序的编译。
面试题19:简述#ifdef、#endif、#else和#ifndef的作用? 答:这些条件编译指令主要有以下功能: (1) 利用#ifdef、#endif可将某程序功能模块包括进去,以向特定用户提供功能。 (2) 用于在子程序前加上标记,以便于追踪和调式。 (3) 应对硬件的限制。
面试题20:宏定义和函数有什么区别? 答: (1) 宏的引用只占用编译时间,不占运行时间 (2) 宏的引用没有返回值,如果需要,需给整个表达式加上括号。 (3) 宏的形参无类型。函数的形参必须要有类型。 (4) 实参为表达式的情况。如果没有给表达式加上括号,可能会导致错误的结果,而函数不会 (5) 宏直接替代有可能导致副作用,函数不会。
面试题21:写一个“标准”宏min?(写一个“标准”宏min,这个宏输入两个参数并且返回较小的一个) 答:#define MIN(a,b) ((a)>=(b)?(a):(b))
面试题22:typedef和define有什么区别? 答: (1) 用法不同:typedef用来定义一种数据类型的别名。增强程序的可读性。Define主要用来定义常量。以及书写复杂,使用频繁的宏。 (2) 执行时间不同:typedef是编译过程的一部分,有类型检查的功能,define是宏定义,是预编译的部分,其发生在编译之前,只是简单地进行字符串的替换。不进行类型的检查 (3) 作用域的不同:typedef有作用域限定。Define不受作用域约束。只要是在define声明后的引用都是正确的。 (4) 对指针的操作不同:typedef和define定义的指针有很大的区别。 (5) Typedef定义是语句,因为句尾要加分号,而define不是语句,不能在后面加分号。
面试题23:#define CHAR char*和typedef char * CHAR各有什么优势? 答:由define定义的类型别名可以被其他修饰符扩展(如:unsigned),而typedef不可以。Define定义的类型别名代表指针时,其连续声明的变量中只有第一个是指针。其他的均为非指针的普通变量,而typedef能够保证连续声明的所有变量均为同一类型。
面试题24:谈谈你对typedef的认识? 答:typedef共有四种用途: (1) 定义一种类型的别名 (2) 用在旧的c代码中辅助声明struct (3) 定义与平台无关的类型 (4) 为复杂的声明定义一个新的简单的别名 还有两个注意事项: (1) 定义了一种类型的新别名后不能被其他的修饰符扩展。 (2) Typedef是并不真正影响对象的存储特性的存储类关键字。
面试题25:关键字const是什么? 答:const用来定义一个只读的变量或对象。主要优点: (1) 便于类型检查、同宏定义一样可以方便地进行参数的修改和调整。 (2) 节省空间,避免不必要的内存分配 (3) 为函数重载提供参考
面试题26:const、define定义常量的区别?(常量有什么作用?const和define都可以用来定义常量,两者区别?) 答:常量的引入可以增强程序的可读性。可以使程序的维护和调式更加方便,使书写简便 两者的区别如下: (1) const定义的常量有数据类型,而define没有 (2) 很多集成开发环境只支持对const定义的常量的调式,而不支持define定义的常量 (3) Const定义的常量是要分配内存空间,而define定义的常量却不分配空间,所以const定义的常量比define定义的常量有更多的优势,可以说const是对define的优化。
面试题27:static有什么作用? 答:在c中,static主要定义全局静态变量,定义局部静态变量,定义静态函数 (1) 定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点: (1) 在全局数据区内分配内存 (2) 如果没有初始化,其默认值为0 (3) 该变量在本文件内从定义开始到文件结束可见 (2) 定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点: (1) 该变量在全局数据区分配内存 (2) 如果不显示初始化,那么将被隐式初始化为0 (3) 它始终驻留在全局数据区,直到程序运行结束 (4) 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。 (3) 定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点: (1) 静态函数只能在本源文件中使用 (2) 在文件作用域中声明的inline函数默认为static 在c++中新增了两种作用:定义静态数据成员或静态函数成员 (1) 定义静态数据成员。静态数据成员有如下特点: (1) 内存分配:在程序的全局数据区分配 (2) 初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义 (3) 静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。
面试题29:extern有什么作用? 答:extern标识的变量或函数声明定义在别的文件中,提示编译器遇到的变量和函数时在其他模块中寻找其定义
面试题30:如何避免野指针? 答:“野指针”产生原因及解决办法如下: (1) 指针变量声明时没有被初始化。解决办法:指针声明时初始化,可以是具体的地址值,也可以是让它指向Null。 (2) 指针P被free或者delete之后,没有置为Null。解决办法:指针指向的内存空间被释放后指针应用指向null。 (3) 指针操作超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向Null。
面试题31:a和&a有什么区别? 答:数组名a可以作为数组的首地址,而&a是数组的指针。
面试题32:简述指针常量与常量指针的区别? 答:指针常量是指定义了一个指针,这个指针的值只能在定义时初始化,其他地方不能改变,常量指针是指定义了一个指针,这个指针指向一个只读的对象,不能通过常量指针来改变这个对象的值。 指针常量强调的是指针的不可改变性,而常量指针强调的是指针对去所指对象的不可改变性。
面试题33:流操作符重载为什么返回引用? 答:在程序中,流操作符>>和<<经常连续使用。因此这两个操作符的返回值应该是一个仍旧支持这两个操作符的流引用。其他的数据类型都无法做到这一点。
面试题34:常引用有什么作用? 答:常引用的引用主要是为了避免使用变量的引用时,在不知情的情况下改变变量的值。常引用主要用于定义一个普通变量的只读属性的别名,作为函数的传人参数。避免实参在调用函数中被意外地改变。
面试题35:什么是引用? 答:引用就是一个目标变量的别名,对引用的一切操作和对变量的直接操作是一样的,主要用做函数的参数,函数返回值和常引用。
面试题36:volatile有什么作用? 答:volatile有如下作用: (1) 状态寄存器一类的并行设备硬件寄存器 (2) 一个中断服务子程序会访问到的非自动变量 (3) 多线程间被几个任务共享的变量
面试题37:一个参数可以既是const又是volatile吗? 答:可以,用const和volatile同时修饰变量,表示这个变量在程序内部是只读的,不能改变的,只在程序外部条件变化下改变,并且编译器不会优化这个变量。每次使用这个变量时,都要小心地去内存读取这个变量的值,而不是去寄存器读取它的备份。
面试题38:一个指针可以是volatile吗? 答:可以。因为指针和普通变量一样,有时也有变化程序的不可控性。常见的例子:子中断服务子程序修改一个指向一个buffer的指针时,必须用volatile来修饰这个指针。 |
|