C,C++面试指南笔记.docx





《C,C++面试指南笔记.docx》由会员分享,可在线阅读,更多相关《C,C++面试指南笔记.docx(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1、C语言语句是指以分号作为结束符,编译后产生机器指令的代码。 预处理指令不是C语句。2、变量的声明和定义有什么区别?定义:为变量分配地址和存储空间。声明:不分配地址。个变量可以在多个地方声明,只能在个地方定义。加入extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分定 义。说明:很多时候个变量,只是声明,不分配内存空间,直到个 体使用时初始化分配内存空间,如外部变量。3、以最简单的方式使电脑发出蜂鸣声音?使电脑发出蜂鸣有很多方法:可以调用beep:可以用汇编直接操作 蜂鸣器对应的管脚。最简单的方式:#include stdio.hint main(int argc,cha
2、r *argv)(printf(”7);/常用字符的 ASCI! 值return 0;4、编程规范包括程序的可行性,可读性,可移植性及可测试性。可行性:是目的,也是规范的灵魂。通常要注意:预处理命令的使用;运算符优先级的区别;指针的使用等。可读性:变量和函数名的命名做到见名知义;适当加注释(写在代码的上方或右方);无参数函数时最好加void等。可移植性:使用标准库函数,并且把它们和ANSI/ISOC标准中定义 的头文件放在起使用。等等。可测试性:增加打印消息,跟踪程序流程,这样可使测试者更加快捷 地找到问题所在;嵌套最好不多于五层。等。5、变量与函数名命名的习惯 满足命名规则,不能用关键字。(
3、以下总结为可读性) 标识符最好采用英文单词或其组合,切忌中英混用且不要过长。 Windows系统中标识符通常大小写混排如LittleBoyo 指针变量命名基本原则:一重指针为“p”+变量类型前缀+名称, 如float类型指针pfStat.多重指针类似。 程序中最好不要出现局部变量与全局变量完全相同的情况。 符号常量常用下划线分隔单词。 全局变量加前缀g_。 类的数据成员加前缀m_(表示member),避免数据成员与成员函 数参数同名时混。6、写出bool,int,float.指针变量(用flag表示的)与“零值”比较的if 语句。 bool :if(flag)elseB;)或:if(!flag
4、)else(B;A;不良习惯:)If(flag=TRUE);if(flag=FALSE);if(flag=l);if(flag=O) int:If( O!=flag)或:If( O=flag)(A;B;)ElseElse(B;A;不良习惯:If(flag=FALSE);if(flag).指针类型:If(NULL=flag)Else(B;或:if(NULL!=flag)(B;Else(A;不良习惯:If(p=O);if(p!=O);if(p). float:const float NORM=0.0001;If(flag=NORM)&(flag=NORM)(A;不良习惯:If(x=O.O);if(
5、x!O.O).应当特别注意:在int,指针变量和零值比较时,把零值写在左边。是因为当把”=写成“=”时,编译器可以报错,否则这种逻辑错 误不容易被发现。7、代码、 short sl=l;sl=sl+lL;代码二、short sl=l;sl+=lL;以上两段代码是否都正确?类型转换关系:例如:short和int型数据相加,则将short转换成int.代码一中si是short,转换成long与1L相加,得到的是long和, 但赋值给short型的si,所以不正确。改为:Short sl=l;sl=(short)(sl+lL);代码二中“+=”会进行类型转换,所以正确。8、C中任何数据在内存中都是以
6、二进制形式存放的。而数值是以补 码表示的。字符型数据在内存中是按其ASCII码值来存储的,其ASCII码值在内存中也是以二进制形式存储的。9、什么是左值,什么是右值?左值位于赋值号左边,右值位于赋值号右边。常量不可寻址,变量可以,变量有两个相关值:地址值和数据值。数据值:存储在内存中的数据,也称为变量的右值。地址值:存储数据值的地址,也称为变量的左值。左值一般是变量,右值可以是变量,表达式或常量。即左值可以为右 值,右值不可以为左值。10、字符型数据无论在!6位机上还是32位机上都是占个字节,而 基本整型在16位机上占两个字节,在32位机上占四个字节。因此, 用si沈of求字节数时要注意分情况
7、。11、Sizeof 与 strlen 的区别 sizeof是个操作符,而strlen是库函数。 Sizeof用来返回一个数据类型的占的字节数,参数可以是数据类 型也可以是变量且后面的小括号可以不写。Strlen用来返回一个 字符串的长度且只能以(T作为结束符的字符串为参数。编译器在编译时就计算出sizeof的值,而strlen函数是在运行时 计算出来。数组做sizeof参数不退化,做strlen参数时退化为指针。例如:#includestdio.h#includestring.h void main(void)char str10=,abce;int x=strlen(str);int y=
8、sizeof(str);printf(%d,%dn,x,y);)结果为:4, 1012、位域#includestdio.h struct si(int i:8;char j:4;int a:4;double b;);struct s2(int i:8;intj:4;double b;int a:4;);struct s3(int i;char j;double b;int a;);怎么区分是结构体还是位域? ?void main(void)(printf(,sizeof(sl)=%dn,sizeof(struct si);printf(sizeof(s2)=%dn,sizeof(struct
9、s2);printf(sizeof(s3)=%dn,sizeof(struct s3);注:在VC中都是24。怎么回事?书上是:16, 24, 32说每个数据都要对照结构体内最大数据字节数的最小公倍数补齐。位域:是把个字节中的位按照实际的需求分成不同的区域,表明每 个区域位数,区域的域名,并允许程序按照域名进行操作。如此就可 以把不同的对象用一个字节来表示。能节省空间。即成员均按二进制 位分配。位域定义格式:struct位域的结构名位域列表;位域列表表示形式:类型说明符位域名:位域的长度如上 sl,s2,s3o几点说明: 个位域必须存储在同一个字节中,不能跨两个字节。如一个字 节所剩空间不够存
10、放另个位域时,应从下单元起存放该位域。 也可以有意使某位域从下单元开始。如:Struct wy(Unsigned a:6;Unsigned :;/空域Unsigned b:4;/从下单元开始存放Unsigned c:4;);在这个位域定义中,a占第一个字节的6位,后2位填0表示不 使用,b从第二字节开始,占用4位,c占用4位。 由于位域不能跨两个字节,因此位域的长度不能大于一个字节的 长度,也就是不能超过8位二进制位。 位域可以无位域名,这时它只用来填充或调整位置。无名的位域是不能使用的。例如:struct kyInt a:l;Int :2;这两位不能使用Int b:3;Int c:2;);1
11、3、C和C+中的static有什么区别?C中:static用来修饰变量或函数,主要用来说明这个变量或函数只 能在本文件代码块中访问,且static修饰的变量存放在段存储区。 主要有以下用途: 定义局部静态变量存储在静态存储区,在程序运行期间不会释放,只在声明时初始化 次,若没有初始化,自动赋值为或空字符。具有局部变量的记忆 性”及生存周期“全局性特点。记忆性”是指在两次函数调用时, 第二次调用开始时,变量能够保持上一次调用结束时的值。全局性” 可改善函数返回指针的问题,局部变量的问题在于当函数退出时其生 存期结束。而利用static修饰的局部变量却可以延长其生存期。 限定访问区域被static
12、修饰的变量及函数只能被同一文件内的代码段访问。C+中,除上述两种还有: 定义静态成员变量和静态成员函数。静态成员变量或静态成员函数表示其不属于任何个类实例,是类的所有类实例所其有的。实现在多对象实例间进行通信,传递信息。如:#include,iostream.h#incJude,string.h,class A(public:static int a;static int geta();int b;int getb(););int A:a=100;int A:geta()(return a;int A:getb()return b;void main(void)A m,n;m.b=90;cou
13、tm.geta()endl;coutm.getb()endl;coutm.aendl;n.a=33;n.b=44;coutm.geta()endl; 体现共用coutm.getb()endl;coutm.aendl;/体现共用14、C, C+的结构体有什么区别? C的结构体是不能有函数成员的,只是些已有数据结构组合而 成,而C+俵可以。 C结构体数据成员没有public,private,protected之分,C+有。 C的结构体没有继承关系,C+有。注:结构体可简单理解为类的前身。15、C中的malloc和C+中的new有什么区别?malloc,free,new,delete都是用来动态申请
14、内存和释放内存的。 malloc,free是标准函数,而new,delete是运算符。前两个在C,C+中都可使用,要包含相应的头文件,可以覆盖;而后两个只属于 C+,不需要头文件的支持,可以重载。 Malloc要指定申请内存的大小,其申请的只是一段内存空间。New 不必指定申请内存的大小,只是建立一个对象。 New和delete调用对应的构造函数和析构函数。而malloc,free只 是分配内存和回收内存。 malloc,free返回的是void类型指针,new,delete返回的是某种数 据类型指针。16、C中指针和C+引用有什么区别?引用是变量或对象的别名,不是值,不占据存储空间,只有声明
15、没有 定义。在C+中可用于:函数参数当函数的返回值多于个时,可用指针实现。如:#include,iostream.hvoid swap(int *a,int *b)(int temp;temp=*a;*b=temp;void main(void)(int a=10,b=20;coutbefore change:,a bendl;swap(&a,&b);coutafter change: *bendl;结果是:before change: 10,20after change:20,10也可以用引用实现,如:#includeiostream.hvoid swap(int &a,int &b)(in
16、t temp;temp=a;a=b;b=temp;void main(void)int a=10,b=20;coutbefore change:,a bendl;swap(a,b);coutafter change: *bendl;)结果是:before change: 10,20after change:20,10引用更加简便和易理解。指针可不初始化且初始化时,可以指向个地址,也可以为空。引用必须初始化且只能初始化一次。引用之间赋值和指针之间赋值不同。指针赋值如下:int vl=7,v2=9;int *pl=&vl,*p2=&v2;pl=p2;/*p! 指向变了/引用赋值如下:int vl=
17、7,v2=9;int &rl=vl,&r2=v2;rl=r2;/改变的是vl的值,将r2指向的对象v2的值赋值给VI。而rl, r2仍指向原来的变量。*/由上述例子可知,指针可以改变指向,而引用总是指向初始化时 的对象。17、预处理在C/C+中预处理如宏定义、文件包含、条件编译等。简述#ifdef,#else,#endif,#ifndef 的作用软件程序的升级是在已成型软件的基础上进行修改和扩充。升级工作 非常复杂和烦琐,因为软件不断地升级,程序体积在不断扩大,但是 老用户却不能受到影响。条件编译指令便是解决这问题的最佳选 择。条件编译指令#ifdef,#else,#endif,#ifndef
18、 作用有:(1)利用#ifdef和#endif将某程序功能模块包括进去,以向特定用 户提供该功能,在不需要时用户可轻易屏蔽。如:#ifdefMATH#includemath.c#endif注:如果不许向别的用户提供该功能,则在编译之前将首行的MATH 加一个下划线即可。(2)在子程序前加上标记,以便于追踪和调试。#ifdef DEBUGprintf(*indebugging);#endif(3)应对硬件的限制。由于些具体应用环境的硬件不一样,限于 条件,本地缺乏这种设备,只能绕过硬件,直接写出预期结果。#ifdefYAN2410i=getBordNum();当没有YAN2410硬件时,程序调试
19、运行时绕过此语句#elsei=0;#endif18、typedef和define有什么区别?(1)用法不同typedef是用来说明一个数据类型的别名,以增强程序的可读性。define是用来定义符号常量和带参数宏。(2)执行时间不同typedef定义是定义语句,占用运行时间。且有类型检査功能。define是预处理,只占编译时间。只是简单进行字符串的替换,不进 行类型检査。(3) typedef有作用域限制,define没有,只要在声明后引用均可。#includevoid fl (void)(Typedef int INT;INTA=3;Printf(A:%d,A);编译不会通过,typedef定
20、义的INT只限制在f1函数里。上述例子不是很恰当,typedef一般不放在函数里,在此只是为了 说明问题#includevoid fl (void)(#define MAX 100;Void main(void )(Printf(MAX:%d,MAX);编译运行正确。(4)对指针的操作不同 #include#define pCHAR char * typedef char * pchar;pCHAR a,b;pchar x,y;printf(sizeof(a):%dnsizeof(b):%dn,sizeof(a),sizeof(b);printf(Hsizeof(x):%dnsizeof(y)
21、:%dn,sizeof(x),sizeof(y);结果为:Sizeof(a):4Sizeof(b):lSizeof(x):4Sizeof(y):4注意:用define定义的char只是简单替换19、#define CHAR char 和 typedef char * CHAR 有什么区别?由define定义的类型别名可以被其他修饰符扩展如unsigned,而 typedef不可。define定义的类型别名代表指针时,其连续声明的变 量中只有第一个是指针,其他的均为非指针的普通变量,而typedef 能够保证连续声明的所有变量都为同一类型的指针。如18.20、const(l)const用来定义个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 面试 指南 笔记

限制150内