还剩36页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
华为面试题及答案整个源程序,当一个源程序由多个源文件组成时,非静态
1.局部变量能否和全局变量重名的全局变量在各个源文件中都是有效的而静态全局变量答能,局部会屏蔽全局要用全局变量,需要使用则限制了其作用域,即只在定义该变量的源文件内有效,••在同一源程序的其它源文件中不能IT人才网it.adO.cn使局部变量可以与全局变量同名,在函数内引用这个变用它由于静态全局变量的作用域局限于一个源文件内,量时,会用到同名的局部变量,而不会用到全局变量对只能为该源文件内的函数公用,因此可以避免在其它源文于有些编译器而言,在同一个函数内可以定义多个同名的件中引起错误局部变量,比如在两个循环体内都定义一个同名的局部变从以上分析可以看出,把局部变量改变为静态变量后量,而那个局部变量的作用域就在那个循环体内是改变了它的存储方式即改变了它的生存期把全局变量
2.如何引用一个已经定义过的全局变量改变为静态变量后是改变了它的作用域,限制了它的使用答extern范围可以用引用头文件的方式,也可以用extern关键字,如static函数与普通函数作用域不同仅在本文件只在果用引用头文件方式来引用某个在头文件中声明的全局变当前源文件中使用的函数应该说明为内部函数static,内理,假定你将那个变写错了,那么在编译期间会报错,如部函数应该在当前源文件中说明和定义对于可在当前源果你用extern方式引用时,假定你犯了同样的错误,那么在文件以外使用的函数,应该在一个头文件中说明,要使用这编译期间不会报错,而在连接期间报错些函数的源文件要包含这个头文件3,全局变量可不可以定义在可被多个.C文件包含的头static全局变量与普通的全局变量有什么区别static文件中为什么全局变量只初使化一次,防止在其他文件单元中被引用;答可以,在不同的C文件中以static形式来声明同名static局部变量和普通局部变量有什么区别static局全局变量部变量只被初始化一次,下一次依据上一次结果值;可以在不同的C文件中声明同名的全局变量,前提是static函数与普通函数有什么区别static函数在内存其中只能有一个C文件中对此变量赋初值,此时连接不会出中只有一份,普通函数在每个被调用中维持一份拷贝错
8、程序的局部变量存在于堆栈中,全局变量存在于
4.语句for;1;有什么问题它是什么意思静态区中,动态申请数据存在于堆中答和while⑴相同
9、设有以下说明和定义
[5];char c;}DATE;答前一个循环一遍再判断,后一个判断以后再循环struct data{int cat;DATE cow;double dog;}too;6,请写出下列代码的输出内容DATE max;以下是引用片段则语句printf%d,sizeofstruct date+sizeofmax;#include的执行结果是52—main答DATE是一个union.变量公用空间.里面最大的变量类型是int⑸.占用20个字节.所以它的大小是20int a,b,c,d;data是一个struct.每个变量分开占用空间,依次为a=10;int..DATE
2..double..
32.b=a++;所以结果是20+32=
52.c=++a;当然…在某些16位编辑器下,int可能是2字节,那么d=10*a++;结果是int2+DATE10+doubles=20printfb,c,d:%d,%d,%d,b,c,d;
10、队列和栈有什么区别return0;队列先进先出,栈后进先出
11.写出下列代码的输出内容}以下是引用片段答10,12,120#include
7、static全局变量与普通的全局变量有什么区别static局部变量和普通局部变量有什么区别static函数与普通函int incint a数有什么区别return++a;全局变量外部变量的说明之前再冠以static就构成}了静态的全局变量全局变量本身就是静态存储方式,静态int multiint*a,int*b,int*c全局变量当然也是静态存储方式这两者在存储方式上并无不同这两者的区别虽在于非静态全局变量的作用域是return*c=*a**b;
2.・.假设你在编写一个使用多线程技术的程序,当程序中止int a;运行时,需要怎样一个机制来安全有效的中止所有的线程const int ra=a;请描述其具体流程.ra=l;〃错误int funcxa=l;〃正确例2int countx=0;string foo;whilexvoid barstrings;那么下面的表达式将是非法的countx++;barfoo;x=xx-l;barz,hello world;}原因在于foo和〃hello world〃串都会产生一个临return countx;时对象,而在C++中,这些临时对象都是const类型的因}此上面的表达式就是试图将一个const类型的对象转换为非.・假定・.
9999.答案8思路将x转化为2进制,看含有const类型,这是非法的的1的个数引用型参数应该在能被定义为const的情况下,尽量定义为..
2.什么是“引用”?申明和使用“引用”要注意哪些问const.题?
5.将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?答引用就是某个目标变量的“别名”alias,对应用格式类型标识符函数名形参列表及类型说明{〃的操作与对变量直接操作效果完全相同申明一个引用的函数体}好处在内存中不产生被返回值的副本;时候,切记要对其进行初始化引用声明完毕后,相当于目注意正是因为这点原因,所以返回一个局部变量的引标变量名有两个名称,即该目标原名称和引用名,不能再用是不可取的因为随着该局部变量生存期的结束,相应把该引用名作为其他变量名的别名声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一的引用也会失效,产生runtime error!注意事项个别名,它本身不是一种数据类型,因此引用本身不占存1不能返回局部变量的引用这条可以参照Effective储单元,系统也不给引用分配存储单元不能建立数组的C++⑴的Item
31.主要原因是局部变量会在函数返回后被销引用毁,因此被返回的引用就成为了〃无所指〃的引用,程序・.3,将“引用”作为函数参数有哪些特点?会进入未知状态1传递引用给函数与传递指针的效果是一样的这时,2不能返回函数内部new分配的内存的引用这条可被调函数的形参就成为原来主调函数中的实参变量或对象以参照Effective条+
[1]的Item
31.虽然不存在局部变量的的一个别名来使用,所以在被调函数中对形参变量的操作被动销毁问题,可对于这种情况返回函数内部new分配内就是对其相应的目标对象在主调函数中的操作存的引用,又面临其它尴尬局面例如,被函数返回的引用2使用引用传递函数的参数,在内存中并没有产生实只是作为一个临时变量出现,而没有被赋予一个实际的变参的副本,它是直接对实参操作;而使用一般变量传递函量,那么这个引用所指向的空间数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调由new分配就无法释放,造成memory leak.3可以返回用拷贝构造函数因此,当参数传递的数据较大时,用引类成员的引用,但最好是const.这条原则可以参照Effective用比用一般变量传递参数的效率和所占空间都好C++[l]的Item
30.主要原因是当对象的属性是与某种业务规3使用指针作为函数的参数虽然也能达到与使用引则business rule相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一用的效果,但是,在被调函数中同样要给形参分配存储单个业务规则当中如果其它对象可以获得该属性的非常量元,且需要重复使用〃*指针变量名〃的形式进行运算,这引用或指针,那么对该属性的单纯赋值就会破坏业务规很容易产生错误且程序的阅读性较差;另一方面,在主调函则的完整性数的调用点处,必须用变量的地址作为实参而引用更容4流操作符重载返回值申明为“引用”的作用流操易使用,更清晰作符〈〈和〉,这两个操作符常常希望被连续使用,例如:cout・.
4.在什么时候需要使用“常引用”?如果既要利用引用提高程序的效率,又要保护传递给,,hello,/endl;因此这两个操作符的返回值应该是函数的数据不在函数中被改变,就应使用常引用常一个仍然支持这两个操作符的流引用可选的其它方案包括返回一个流对象和返回一个流对象引用声明方式const类型标识符引用名二目标变量名;指针但是对于返回一个流对象,程序必须重新拷贝构例1造一个新的流对象,也就是说,连续的两个*操作符实际上是针对不同对象的!这无法让人接受对于返回一个流指源故在本篇中我将对引用进行详细讨论,希望对大家更针则不能连续使用操作符因此,返回一个流对象引用好地理解和使用引用起到抛砖引玉的作用是惟一选择这个唯一选择很关键,它说明了引用的重要
一、引用简介性以及无可替代性,也许这就是C++语言中引入引用这个概引用就是某一变量目标的一个别名,对引用的操作念的原因吧赋值操作符二.这个操作符象流操作符一样,与对变量直接操作完全一样是可以连续使用的,例如x二j=10;或者x=10=100;引用的声明方法类型标识符引用名二目标变量名;赋值操作符的返回值必须是一个左值,以便可以被继续赋【例1】int a;intra=a;〃定义引用ra,它是变量值因此引用成了这个操作符的惟一返回值选择a的引用,即别名例3说明#i ncludeiostream.h11在此不是求地址运算,而是起标识作用int putint n;2类型标识符是指目标变量的类型int vals
[10];3声明引用时,必须同时对其进行初始化int error=-l;4引用声明完毕后,相当于目标变量名有两个名称,void main即该目标原名称和引用名,且不能再把该引用名作为其他put0=10;〃以put0函数值作为左值,等价于vals
[0]=10;变量名的别名put9=20;〃以put9函数值作为左值,等价于vals
[9]=20;ra=l;等价于a=l;coutvals
[0];coutvals
[9];5声明一个引用,不是新定义了一个变量,它只表示int putint n该引用名是目标变量名的一个别名,它本身不是一种数据if n=0n=9return vals[n];类型,因此引用本身不占存储单元,系统也不给引用分配else{coutz,subscript error”;return error;}}存储单元故对引用求地址,就是对目标变量求地址5在另外的一些操作符中,却千万不能返回引用:与a相等+-*/四则运算符它们不能返回引用,Effective回引1]的6不能建立数组的引用因为数组是一个由若干个元Item23详细的讨论了这个问题主要原因是这四个操作符没素所组成的集合,所以无法建立一个数组的别名有side effect,因此,它们必须构造一个对象作为返回值,
二、引用应用可选的方案包括返回一个对象、返回一个局部变量的引L引用作为参数用,返回一个new分配的对象的引用、返回一个静态对象引引用的一个重要作用就是作为函数的参数以前的C语用根据前面提到的引用作为返回值的三个规则,第
2.3言中函数参数传递是值传递,如果有大块数据作为参数传两个方案都被否决了静态对象的引用又因为a+b=二递的时候,采用的方案往往是指针,因为这样可以避免将c+d会永远为true而导致错误所以可选的只剩下返回整块数据全部压栈,可以提高程序的效率但是现在C++一个对象了中又增加了一种同样有效率的选择在某些特殊情况下又..
6.“引用”与多态的关系?是必须的选择,就是引用引用是除指针外另一个可以产生多态效果的手段这【例2】意味着,一个基类的引用可以指向它的派生类实例void swapint pl,int p2//此处函数的形参pl,p2都例4是引用Class A;Class B:Class A{...};B b;A ref=b;.7“引{int p;p=pl;pl=p2;p2=p;}用”与指针的区别是什么?为在程序中调用该函数,则相应的主调函数的调用点指针通过某个指针变量指向一个对象后,对它所指向处,直接以变量作为实参进行调用即可,而不需要实参变的变量间接操作程序中使用指针,程序的可读性差;而量有任何的特殊要求如对应上面定义的swap函数,相引用本身就是目标变量的别名,对引用的操作就是对目标应的主调函数可写为main变量的操作此外,就是上面提到的对函数传ref和pointerint a,b;的区别cin»a〉b;〃输入a,b两变量的值
8.什么时候需要“引用”?swap a,b;〃直接以变量a和b作为实参调用swap函数流操作符《和〉、赋值操作符二的返回值、拷贝构造函数couta b;〃输出结果的参数、赋值操作符二的参数、其它情况都推荐使用引用上述程序运行时,如果输入数据1020并回车后,则输引用是C++引入的新语言特性,是C++常用的一个重要内容出结果为2010o之一,正确、灵活地使用引用,可以使程序简洁、高效由[例2]可看出我在工作中发现,许多人使用它仅仅是想当然,在某些微1传递引用给函数与传递指针的效果是一样的这时,妙的场合,很容易出错,究其原由,大多因为没有搞清本被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作产生被返回值的副本就是对其相应的目标对象在主调函数中的操作【例5】以下程序中定义了一个普通的函数fnl它用2使用引用传递函数的参数,在内存中并没有产生实返回值的方法返回函数值,另外一个函数fn2,它以引用的参的副本,它是直接对实参操作;而使用一般变量传递函方法返回函数值数的参数,当发生函数调用时,需要给形参分配存储单元,ttinclude iostream.h形参变量是实参变量的副本;如果传递的是对象,还将调float temp;〃定义全局变量temp用拷贝构造函数因此,当参数传递的数据较大时,用引float fnlfloat r;//声明函数fnl用比用一般变量传递参数的效率和所占空间都好float fn2float r;〃声明函数fn23使用指针作为函数的参数虽然也能达到与使用引float fnlfloat r〃定义函数fnl,它以返回值的方法返用的效果,但是,在被调函数中同样要给形参分配存储单回函数值元,且需要重复使用〃*指针变量名〃的形式进行运算,这{很容易产生错误且程序的阅读性较差;另一方面,在主调函temp=floatr*r*
3.14;数的调用点处,必须用变量的地址作为实参而引用更容return temp;易使用,更清晰如果既要利用引用提高程序的效率,又要保护传递给float fn2float r〃定义函数fn2,它以引用方式返回函函数的数据不在函数中被改变,就应使用常引用数值
2.常引用常引用声明方式const类型标识符引用名二目标变量名;temp=floatr*r*
3.14;用这种方式声明的引用,不能通过引用对目标变量的return temp;值进行修改,从而使引用的目标成为const,达到了引用的安}全性void main//主函数【例3】:int a;float
10.0;〃第1种情况,系统生成要返回值的副本const intra=a;即临时变量ra=l;〃错误a=l;//正确float b=fnl
10.0;〃第2种情况,可能会出错不同这不光是让代码更健壮,也有些其它方面的需要C++系统有不同规定【例4】假设有如下函数声明〃不能从被调函数中返回一个临时变量或局部变量的引string foo;用void barstrings;那么下面的表达式将是非法的float c=fn
210.0;〃第3种情况,系统不生成返回值barfoo;的副本barz,hello world;〃可以从被调函数中返回一个全局变量的引用原因在于foo和〃hello world〃串都会产生一个临时float d=fn
210.0;//第4种情况,系统不生成返回值的对象,而在C++中,这些临时对象都是const类型的因此副本上面的表达式就是试图将一个const类型的对象转换为非〃可以从被调函数中返回一个全局变量的引用const类型,这是非法的cout«acd;引用型参数应该在能被定义为const的情况下,尽量定义为const o引用作为返回值,必须遵守以下规则1不能返回局部变量的引用这条可以参照Effective
三、引用总结例如cout«/,hello/,«endl;因此这两个操作符的返回值应1在引用的使用中,单纯给某个变量取个别名是毫无该是一个仍然支持这两个操作符的流引用可选的其它方意义的,引用的目的主要用于在函数参数传递中,解决大案包括返回一个流对象和返回一个流对象指针但是对块数据或对象的传递效率和空间不如意的问题于返回一个流对象,程序必须重新拷贝构造一个新的流2用引用传递函数的参数,能保证参数传递中不产生对象,也就是说,连续的两个〈〈操作符实际上是针对不副本,提高传递的效率,且通过const的使用,保证了引用同对象的!这无法让人接受对于返回一个流指针则不能传递的安全性连续使用*操作符因此,返回一个流对象引用是惟一选择3引用与指针的区别是,指针通过某个指针变量指向这个唯一选择很关键,它说明了引用的重要性以及无可替代一个对象后,对它所指向的变量间接操作程序中使用指性,也许这就是C++语言中引入引用这个概念的原因吧赋针,程序的可读性差;而引用本身就是目标变量的别名,值操作符这个操作符象流操作符一样,是可以连续使用的,〜对引用的操作就是对目标变量的操作例如:x=j=10;或者x=10=100;赋值操作符的返回值必须4使用引用的时机流操作符《〈和〉、赋值操作符是一个左值,以便可以被继续赋值因此引用成了这个操二的返回值、拷贝构造函数的参数、赋值操作符二的参数、作符的惟一返回值选择其它情况都推荐使用引用【例6】测试用返回引用的函数值作为赋值表达式的
9.结构与联合有和区别?左值.
1.结构和联合都是由多个不同的数据类型成员组成.但在ttinclude〈iostream.h intputint n;任何同一时刻.联合中只存放了一个被选中的成员所有成int vals
[10];员共用一块地址空间.而结构的所有成员都存在不同成员int error=-l;的存放地址不同void main.
2.对于联合的不同成员赋值.将会对其它成员重写,.原来成员的值就不存在了.而对于结构的不同成员赋值是互不影响的put0=10;〃以put0函数值作为左值,等价于vals
[0]=10;・
10.下面关于“联合”的题目的输出?put9=20;〃以put9函数值作为左值,等价于vals
[9]=20;acoutvals
[0];coutvals
[9];#i ncludestdio.h}unionint putint n ifn=0n=9return vals[n];else{coutz,subscript error”;return error;}}int i;5在另外的一些操作符中,却千万不能返回引用+-*/char x
[2];四则运算符它们不能返回引用,Effective C++[l]的Item23}a;详细的讨论了这个问题主耍原因是这四个操作符没有side void main effect,因此,它们必须构造一个对象作为返回值,可选的方案包括返回一个对象、返回一个局部变量的引用,返a.x
[0]=10;回一个new分配的对象的引用、返回一个静态对象引用根a x
[1]=1;据前面提到的引用作为返回值的三个规则,第
2、3两个方printf〃%d〃,a.i;案都被否决了静态对象的引用又因为a+b=c+d会永远为true而导致错误所以可选的只剩下返回一个对象了
4.引用和多态答案266低位低地址,高位高地址,内存占用情况是OxOlOA String const Stringanother;//拷贝构造函数bp StringO;//析构函数mainStringoperater=const Stringrhs;//赋值函数private:char*m_data;//用于保存字符串union{;/*定义一个联合*/int i;尝试写出类的成员函数实现文章来源草根IT网www.struct{caogenit.com/*在联合中定义一个结构*/答案charString::Stringconst char*str first;ifstr==NULL〃strlen在参数为NULL时会抛char second;异常才会有这步判断}half;}number;mdata=new char
[1];number.i=0x4241;/*联合成员赋值*/m_data
[0]=\0;printf〃%c%c\n〃,number,half,first,mumber.half,second;number.half,first=a;/*联合中结构成员赋值*/number,half,second=b,;printf〃%x\n〃,number,i;getch;答案AB0x41对应A,是低位;0x42对应B,是高位6261number,i和number,half共用一块地址空间.
11.已知strcpy的函数原型cha.*strcpycha.*strDest.cons.cha.*strSrc其中strDes.是目的字符串,strSr.是源字符串不调用C++/.的字符串库函数,请编写函.strcpy.答案char*strcpychar*strDest,const char*strSrc{ifstrDest二二NULL||strSrc二二NULLreturn NULL;ifstrDest二二strSrcreturn strDest;char*tempptr=strDest;ivhile*strDest++=*strSrc++!=\0*return tempptr;.
12.已知String类定义如下:.class Stringpublic:String const char*str=NULL;//通用构造函数Stringfe String::operator=const Stringrhselseifthis==rhs return*this;m data=new char[strlen str+1];strcpymdelete[]m_data;〃删除原来的数据,新开一块内data,str;存m_data=new char[strlenrhs.m_data+1];strcpym data,rhs.m data;String::Stringconst Stringfeanother return*this;m data=new char[strlen another,m data+String::String;n delete[]m data;strcpym_data,other.m_data;
13.
1.头文件中的ifndef/define/endi.的作用?String String::operator=const Stringrhs答防止该头文件被重复引用ifthis二二rhs return*this;#
14.#・ncludefile.h..nclud.file,h”的区别?delete[]ni_data;//删除原来的数据,新开一块内.答前者是从Standar.Library的路径寻找和引用file.h,存而后者是从当前工作路径搜寻并引用file.h.
15.在C+.程m data=new char[strlenrhs.m data+序中调用被.编译器编译后的函数,为什么要加exter.C”?;H首先,作为extern是C/C++语言中表明函数和全局变量作strcpym data,rhs.m data;用范围可见性的关键字,该关键字告诉编译器,其声明return*this;的函数和变量可以在本模块或其它模块中使用通常,在模块的头文件中对本模块提供给其它模块引用String:「String|的函数和全局变量以关键字extern声明例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块Adelete[]m_data;的头文件即可这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它String::Stringconst char*str会在连接阶段中从模块A编译生成的目标代码中找到此函数{extern〃C〃是连接申明ifstr二二NULL〃strlen在参数为NULL时会抛linkage declaration,被extern〃C”修饰的变量和函数异常才会有这步判断是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持函数被C++编译后在符m data=new char
[1];号库中的名字与C语言的不同例如,假设某个函数的原型m_data
[0]=\0;为void fooint x,int y;}该函数被C编译器编译后在符号库中的名字为而C++编译else器则会产生像_foo_int_int之类的名字不同的编译器可能{生成的名字不同,但是都采用了相同的机制,生成的新名m data=new char[strlen str+1];strcpy字称为mangled name”m data,str;_foo_int_int这样的名字包含了函数名、函数参数数量及}类型信息,C++就是靠这种机制来实现函数重载的例如,在C++中,函数void fooint x,int y与void foointString::Stringconst Stringfeanotherx,float y编译生成的符号是不相同的,后者为_foo_int_float.同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量用户所编写程序的类成员m data=new char[strlen another,m data变量可能与全局变量同名,我们以〃.〃来区分而本质上,+1];编译器在进行编译时,与函数的处理相似,也为类中的变strcpy m data,other,mdata;量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同/*c语言头文件cExample.h*/Bifndef C_EXAMPLE_H^define C_EXAMPLE_H extern int add int未加extern〃C〃声明时的连接方式假设在C++中,模x,int y;ttendif块A的头文件如下/*c语言实现文件cExample.c*///模块A头文件moduleA.h#include cExample.h〃int add int x,int yreturnttifndef MODULE_AJIx+y;^define MODULE_A Hint foo int x,int y;//c++实现文件,调用addcppFile.cpp extern〃C〃ftendif#i nclude〃cExample.h在模块B中引用该函数//模块B实现文件moduleB.cpp int mainint argc,char*argv[]#i ncludemoduleA.h〃add2,3;return0;foo2,3;/*c语言头文件cExample.h*/ftifndef C_EXAMPLE_H实际上,在连接阶段,连接器会从模块A生成的目标文^define C_EXAMPLE_H extern int add int x,int y;ttendif件moduleA.obj中寻找_foo_int_int这样的符号!/*c语言实现文件cExample.c*/加extern〃C〃声明后的编译和连接方式#i ncludecExample.h int add int x,int yreturn加extern〃C〃声明后,模块A的头文件变为//模块x+y;A头文件moduleA.h ttifndefMODULE_AJI^define M0DULE_A_Hextern〃C〃intfooint x,int y;//c++实现文件,调用add:cppFile.cpp extern〃C〃Bendif#i ncludecExample.h在模块B的实现文件中仍然调用foo2,3,其结果是1模块A编译生成fo的目标代码时,没有对其名字int mainint argc,char*argv[]{进行特殊处理,采用了C语言的方式;add2,3;2连接器在为模块B的目标代码寻找fo2,3调用时,return0;寻找的是未经修改的符号名_foo.如果在模块A中函数声明了foo为extern〃C〃类型,而模块B中包含的是extern intfooint x,inty,/*c语言头文件cExample.h*/则模块B找不到模块A中的函数;反之亦然Bifndef C_EXAMPLE_H^define C_EXAMPLE_H extern int addint所以,可以用一句话概括extern“C”这个声明的真实x,int y;目的任何语言中的任何语法特性的诞生都不是随意而为Bendif的,来源于真实世界的需求驱动我们在思考问题时,不/*c语言实现文件:cExample.c*/能只停留在这个语言是怎么做的,还要问一问它为什么要#i ncludecExample.h〃int addint x,int y这么做,动机是什么,这样我们可以更深入地理解许多问return x+y;题实现C++与C及其它语言的混合编程明白了C++中extern〃C〃的设立动机,我们下面来具//c++实现文件,调用addcppFile.cpp extern〃C〃体分析extern〃C〃通常的使用技巧extern〃C〃的惯用#i ncludecExample.h〃}法1在C++中引用C语言中的函数和变量,在包含C语言int mainint argc,char*argv[]{头文件假设为cExample.h时,需进行下列处理add2,3;return0;〃八〃extern C}#i ncludecExample.h如果C++调用一个C语言编写的DLL时,当包括DLL的头文件或声明接口函数时,应加extern C〃{}.而在C语言的头文件中,对其外部函数只能指定为extern2在C中引用C++语言中的函数和变量时,C++的头文类型,C语言中不支持extern〃C〃声明,在c文件中包含件需添加extern〃C〃,但是在C语言中不能直接引用声明了extern〃C〃时会出现编译语法错误了extern〃C〃的该头文件,应该仅将C文件中将C++中定义的extern〃C〃函数声明为extern类型C++引用C函数例子工程中包含的三个文件的源代码如下C引用C++函数例子工程中包含的三个文件的源代码如下通常,在模块的头文件中对模块提供给其他模块引用〃C++头文件cppExample.h ttifndef CPP_EXAMPLE_H^define的函数和全局变量以关键字extern声明例如,如果模块BCPP_EXAMPLE_H extern〃C〃int addint x,int y;欲引用该模块A中定义的全局变量和函数时只需包含模块Affendif的头文件即可这样,模块B中调用模块A中的函数时,在〃C++实现文件cppExample.cpp文章来源草根IT编译阶段,模块B虽然找不到该函数,但是并不会报错,它网www.caogenit.com会在连接阶段中从模块A编译生成的目标代码中找到此函数#i ncludecppExample.h〃int addint x,int y{与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用因此,一个函数或变量只可return x+y;能被本模块使用时,其不可能被extern〃C〃修饰2被extern〃C〃修饰的变量和函数是按照C语言方式编译和连/*C实现文件cFile.c接的/*这样会编译出错:#include cExample.h〃*/extern intaddint x,int y;作为一种面向对象的语言,C++支持函数重载,而过程int mainint argc,char*argv[]式语言C则不支持函数被C++编译后在符号库中的名字与C语言的不同例如,假设某个函数的原型为void foointadd2,3;x,int y;return0;该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像之类的名字不同的编译器可能产生的名字//C++头文件cppExample.h不同,但是都采用了相同的机制_foo_int_int这样的名Sifndef CPP_EXAMPLE_H字包含了函数名、函数参数数量及类型信息,C++就是靠这#define CPP_EXAMPLE_H种机制来实现函数重载的例如,在C++中,函数void foointextern〃C〃int addint x,int y;x,int y与void fooint x,float y编译产生的符号是不相ttendif同的,后者为_f oo_int_floato//C++实现文件cppExample.cpp文章来源草根ITexteim〃C〃作用实现C++与C及其它语言的混合编程网www.caogenit.com3extern〃C〃的惯用法#i nclude“cppExample.h〃A在C++中引用C语言中的函数和变量,在包含C语言头文int addintx,int y件假设为cExample.h时,需进行下列处理extern〃C〃{return x+y;ttinclude〃cExample.h〃/*C实现文件cFile.c而在C语言的头文件中,对其外部函数只能指定为/*这样会编译出错#i ncludecExample.h〃*/externintextern类型,C语言中不支持extern〃C〃声明,在.c文件addintx,int y;中包含了extern〃C〃时会出现编译语法错误int mainint argc,char*argv[]{例如add2,3;/*c语言头文件cExample.h*/return0;ttifndefC_EXAMPLE_H#define C_EXAMPLE_Hextern int addintx,int y;
15.extern C”含义#endifextern〃C〃包含双重含义,其一被它修饰的目标是/*c语言实现文件cExample.c*/ttinclude cExample.“extern”的;其二被它修饰的目标是“C”的h〃int addintx,int y1被extern限定的函数或变量是extern类型的;return x+y;extern是C/C++语言中表明函数和全局变量作用范围}可见性的关键字,该关键字告诉编译器,其声明的函数〃c++实现文件,调用add:cppFile.cpp extern〃C〃和变量可以在本模块或其他模块中使用注意externint a;仅仅是在声明一个变量,并不是定义变量a,并未为a ttinclude〃cExample.h〃分配内存空间变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误int mainintargc,char*argv[]{实现滞后到子类实现前两种类继承和后一种对象组add2,3;合=>接口继承以及纯虚函数构成了功能复用的两种方式return0;・.
3.多态是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作简单的说,就是一句B在C中引用C++语言中的函数和变量时,C++的头文件需添话允许将子类类型的指针赋值给父类类型的指针加extern〃C〃,但是在C语言中不能直接引用声明了extern〃C〃的头文件,应该仅将•C文件中将C++中定义的extern〃・・
18.重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?C〃函数声明为extern类型常考的题目从定义上来说重载是指允许存在多例如个同名函数,而这些函数的参数表不同(或许参数个数不〃C++头文件cppExample.h同,或许参数类型不同,或许两者都不同)ttifndef CPP_EXAMPLE_H重写是指子类重新定义复类虚函数的方法ttdefine CPP_EXAMPLE_H从实现原理上来说重载编译器根据函数不同的参extern〃C〃int addintx,int y;数表,对同名函数的名称做修饰,然后这些同名函数就成#endif了不同的函数(至少对于编译器来说是这样的)如,有两〃C++实现文件cppExample.cpp个同名函数function func(p:integer):integer;和functionttinclude cppExample.h〃func(p:string):integer;那么编译器做过修饰后的int addintx,int y函数名称可能是这样的int_func stjfunc.对于这两个函数的调用,在编译器间就已经确定了,是静态的也就是return x+y;说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!/*C实现文件cFile.c重写和多态真正相关当子类重新定义了父类的虚/*这样会编译出错ttinclude cExample.h〃*/externint函数后,父类指针根据赋给它的不同的子类指针,动态的addintx,int y;调用属于子类的该函数,这样的函数调用在编译期间是无int mainintargc,char*argv口法确定的(调用的子类的虚函数的地址无法给出)因此,这样的函数地址是在运行期绑定的(晚绑定).・19多态的作用add2,3;..主要是两个
1.隐藏实现细节,使得代码能够模块化;扩return0;展代码模块,实现代码重用;2,接口重用为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时
16.关联、聚合Aggregation以及组合Composition的区的正确调用别?・.
20.Ado与Ado.net的相同与不同?涉及到UML中的一些概念关联是表示两个类的一般性联系,比如“学生”和“老师”就是一种关联关系;聚合表除了“能够让应用程序处理存储于DBMS中的数据”这一基示has-a的关系,是一种相对松散的关系,聚合类不需要对本相似点外,两者没有太多共同之处但是Ad使用OLE DB被聚合类负责,如下图所示,用空的菱形表示聚合关系接口并基于微软的COM技术,而ADO.NET拥有自己的AD
一、选择题(每小题2分,共12分)负责,采用实心的菱形表示组合关系1C++源文件的缺省扩展名为()A A.cpp实现的形式是B.execlass A{...}class B{A a;...}C.obj D.lik
17.面向对象的三个基本特征,并简单叙述之?2程序运行中需要从键盘上输入多于一个数据时,各数据之・.
1.封装将客观事物抽象成类,每个类对自身的数据和方间应该使用()符号作为分隔符A法实行protection private,protected,public・.
2.继承A.空格或逗号广义的继承有三种实现形式实现继承指使用基类的属性B.逗号或回车C.逗号或分号D.空格或回车和方法而无需额外编码的能力、可视继承子窗体使用父3在每个C++程序中都必须包含有这样一个函数,该函数的窗体的外观和实现代码、接口继承仅使用属性和方法,名称为()A typedef intFUNC2int*,int*,int*;A.main voidshowFUNC2funjnt argl,int*arg2B.MAIN INCp=inc;C.name int temp=pargl;D.function funtemp,argl,arg2;4假定a为一个短整型(short int)数组名,则元素printf%d\n”,*arg2;a
[8]的地址为()B}main A.a+4inta;B.a+8showmulti,10,a;C.a+16return0;D.a+32}5假定AB为一个类,则执行“ABa
(4),b
[4],*p
[5]”语句时,答:110自动调用该类够造函数的次数为()B
12.请找出下面代码中的所以错误说明以下代码是把一个A.4字符串倒序,如“abed”倒序后变为“deba”以下是引用片B.5段C.
81.#include/zstring.h〃D.
132.main6当需要使用istrstream流类定义一个流类对象并联系一个
3.字符串时)应在文件开始使用include命令,使之包含()
4.char*src=,,hello,world”;文件A
5.char*dest=NULL;
6.int len=strlensrc;
7.dest=char*malloclen;
8.char*d=dest;
9.char*s=src[len];二填空题(每小题3分,共30分)
10.whilelen--!=
01.在C++中,函数的参数有两种传递方式,它们是值传
11.d++=s-;递和(址传递)
12.printf〃%s〃,dest;
2.当一个成员函数被调用时,该成员函数的(this指针)
13.return0;指向调用它的对象
14.
3.在公有继承的情况下,基类数据成员在派生类中的访答问权限(私有不可以访问,其他同基类一致)方法
14.用new申请某一个类的动态对象数组时,在该类中必以下是引用片段须能够匹配到(无参)构造函数,否则应用程序会产生一int main个编译错误
5.静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象(共享)char*sre=〃hello,world”;
6.面向对象的程序设计有四大特征,它们是(封装,多int len=strlensrc;态,继承,抽象)char*dest=char*malloclen+1;〃要为\0分配一个
7.在C++类中,有一种不能定义对象的类,这样的类只空间能被继承,称之为(虚基类),定义该类至少具有一个(虚char*d=dest;函数)char*s二src[lenT];〃指向最后一个字符
8.在C++类中,const关键字可以修饰对象和成员函数,while len--!=0const对象不能(作为左值)*d++=*s--;*d=0;〃尾部要加\
09.假定一个枚举类型的定义为enum printf%s\n”,dest;freedest;//使用完,应当释放RB{ab,ac adae}x=ad;贝!]x的值为
(2)空间,以免造成内存汇泄露//
10.若需要把一个类AB定义一个类CD的友元素,则应在类return0;CD的定义中加入一条语句为(friend class AB)方法2:typedef intFUNClint in;以下是引用片段ttinclude void mainttinclude{main char a=,a,b二,j;float x;char str口二〃hello,world”;x=b-a/FA;〃文章来源草根IT网int len=strlenstr;www.caogenit.comchar t;printf C%d\n,int
3.14*x;forint i=0;i
2.下面程序的运行结果是ot=str;ttinclude“iostream,h”str=str[len-i-1];str[len-i-l]=t;}void mainprintfstr;{return0;int i=l;}while i=15{
1.-12乙28〃126请问28和126中间那个数是什么为什么i++;第一题的答案应该是4八3-1二63if i%3!=2continue;规律是一3-1当n为偶数0,2,4n八3+1当n为奇数1,else cout〈“i=iendl;3,5答案
632.用两个栈实现一个队列的功能要求给出算法和思路!设2个栈为A,B,一开始均为空.i=2入队i=5将新元素push入栈A;i=8出队i=ll1判断栈B是否为空;i=142如果不为空,则将栈A中所有元素依次pop出并push
3.下面程序的运行结果是o到栈B;ttinclude“iostream,h”⑶将栈B的栈顶元素pop出;class test这样实现的队列入队和出队的平摊复杂度都还是01,{比上面的几种方法要好
3.在c语言库函数中将一个字符转private:换成整型的函数是atool吗,这个函数的原型是什么int num;函数名atolfloat fl;功能把字符串转换成长整型数用7i:long atolconst char*nptr;public:程序例test;以下是引用片段int getint{return num;}#include floatgetfloat{return fl;}#includetest;〜int mainvoid;test::testlong I;char*str=”98765432”;cout^Initalizing default”endl;I=atollstr;num=0;fl=
0.0;printfstring=%s integer=%ld\n,str,I;三给出下列程序运行后的输出结果每小题5分,共20分test::test〜
1.下面程序的运行结果是3ttinclude stdio.hcout^Desdtructor isactivevendl;A::“A called.
5.下面程序的运行结果是ovoid main^include stdio.hint a[]={1,3,5,7,9};test array
[2];int*p[]={a,a+1,a+2,a+3,a+4};coutarray
[1].getint”array
[1].void maingetfloatendl;printf%d\t%d\t%d\n,a
[4],*a+2,*p
[1];Initalizing defaulInitalizingdefaulprintf%d\t%d\t%d\n”,**p+l+a
[2],*p+4-*p+
00.00,*a+3%a
[4];Desdtructor isactiveDesdtructor isactive
4.下面程序的运行结果是o953847#include iostream.h
四、问答题每小题5分,共20分class A
1.若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题?public:浅拷贝问题,主要原因为类中如果有指针成员变量时,当A{cout A::A called.\nv;}调用拷贝构造函数时只拷贝地址从而使两个对象的指针变virtual A{cout A::A called.\n;}〜〜量指向了一个地址空间;
2.简述成员函数、全局函数和友元函数的差别class B:public A成员函数只能由该类所实例化的对象来进行调用[静态成员除外]public:全局函数可以在任意位置进行调用Bint i{友元函数可以让本类和友元类对象调用coutn B::B called.\nn;
3.简述结构化的程序设计、面向对象的程序设计的基本思buf=new char[i];}想virtual B〜结构化程序设计为从程序代码的开始处按照顺序方式执行至代码的结束位置是一种顺序的方式,函数与变量没有明显的联系delete[]buf;面向对象主要把处理事情的事物和方法结合为一体成为一cout B::B called.\n,;〜个类,一个类具备处理一件事情的数据变量和处理方法,把数据和方法有机的结合为了一体,使每一件事情都具备private:一定的独立性,形成一个模块增加了内聚性,降低了耦char*buf;合性同时也增加了代码的可读性以及代码的重用性;
4.结构struct和类class有什么异同?void funA*a在c语言中struct只能对数据进行聚合,而C++的class把数据以及对数据的处理方法也同时聚合为一体,增加了内delete a;聚性此外class拥有可再生性和可抽象性,实现的代码的复用void main集中体现在派生的功能和多态的功能同时class也比struct具备更好的封装性,体现在三种访问权限上A*a=new B15;在C++中的struct和class的结构基本一致,只是struct的funa;默认权限为Public而class为private五下列shape类o是一个表示形状的抽象类,area为求图形面积的函数,A::A called.total则是一个通用的用以求不同形状的图形面积总和的B::B called.函数请从shape类派生三角形类triangle、矩形类B::B called.〜Int Rectangle::arearectangle,并给出具体的求面积函数18分Class ShapeReturn m_nheigh*m_nwidth;}Public:威盛公司软件C++英文笔试题面试题Shape{}
1.How gooddo yousee yoursprogramming skillsPleasecircle~shape{}your answersVirtual intarea;C:Fair/Good/ExcellentC++:Fair/Good/Excellent/*求所有面积*/
2.Please estimateyour programmingexperince:Int totalVector Shape*〉vecshape;How manylines ofcode areyour biggestC ProgrameverVector Shape*〉vecShape;written excluding thestandard linked libraryInttotal VectorShape*〉vecshape{How manylines ofcode areyour biggestC++program everVectorShape*::iterator Veclt;written excluding theIntntotal=0;standardlinkedlibraryForVecIt=vecShape.begin;
3.Please explainthe followingtermsVeclt!=vecShape.end;Veclt++{Data Encapsulationntotal+=*VecIt-area;Inheritance}PolymorphismReturn ntotal;
4.What isa virtualbase classHow do you declare such a}classHow would youuseClass trangle:public shapeitin adesign
5.What isa templateor containerclassHow doyou declarePublic:sucha classTrangle{}
96.Which arethe accesscontrol levelsfor C++language^trangle{}
7.What isRTTIHow doyou achieveRTTI inyour designInt area;
8.What arethe majordifferences betweenstatic andPrivate:non-static memberf unctionsInt m_nheigh;
9.How doyou calla regularmember functionfrom astaticInt m_nwidth;member functionPlease usepsendo-code toprovide youranswer
10.Howdo/*求三角形面积*/youdeclare/define atype ofpointer to a classmember functiIntTrangle::area onPlease usepsendo-code toprovide youranswer
11.Please explainthe followingtyoes:Returnm_nheigh*m_nwidth/2;Here isa shortlise ofcombinations andtheir meanings:}
1.Reference-Can changethe referencedobjectClass rectangle:public shape
2.Const-ReferencePublic:
3.Const-Pointer-Rectangle{}
4.Pointer-Const-^rectangle{}
5.Const-Pointer-Const-Intarea;CFoo InstancePrivate:CFoo ReferenceToInstance=Instance;Intm_nheigh;//IInt m_nwidth;const CFoofeConstReferenceToInstance=]nstance;}//2/*求矩形面积*/const CFoo*pConstPointer=Instance;//3CFoo*const pPointerConst=Instance;//4const CFOO*const pPointerConst=Instance;//
512.What aretop-down andbottom-up approachHowdo youusuallyuse them9*
13.Please usepseudo-code todesign aset ofstack operationswithtemplate
14.Please usepseudo-code todesign aset ofdouble linkedlistoperations withtemplateOptionalQuestions:for extracredits
15.Please writea unixmakefile forQuestionl
316.Please explainthese commonsections:text,data,bss微软C,C++面试题大全版二
21.Ne.delet.与mallo.fre.的联系与区别?.答案都是在堆heap上进行动态的内存操作用malloc函数需要指定内存分配的字节数并且不能初始化对象,ne.会自动调用对象的构造函数delet.会调用对象的destructor,而fre.不会调用对象的destructor.
22.ttdefin.DOUBLEx.x+.,..5*D0UBLE5・.是多少?答案i为
30..
23.有哪几种情况只能用intializatio.lis.而不能用assignment答案当类中含有const、reference成员变量;基类的构造函数都需要初始化表.
24.C++是不是类型安全的?答案不是两个不同类型的指针之间可以强制转换用reinterpret castC#是类型安全的.
25.mai.函数执行以前,还会执行什么代码?答案全局对象的构造函数会在main函数之前执行.
26.描述内存分配方式以及它们的区别?1从静态存储区域分配内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在例如全局变量,static变量2在栈上创建在执行函数时,函数内局部变量的存储conversio.单元都可以在栈上创建,函数执行结束时这些存储单元自••♦♦动被释放栈内存分配运算内置于处理器的指令集}3从堆上分配,亦称动态内存分配程序在运行的时候I.contras,t.dynamic_cast.n.run-tim.chec.i.mad.o.th.用malloc或new申请任意多少的内存,程序员自己负责在static_cas.conversio.o.pb.Th.objec.pointe,t.b,p.何时用free或delete释放内存动态内存的生存期由程序ma.no.b.a.objec.o.typ.D.i.whic.cas.th.us.o.*p员决定,使用非常灵活,但问题也最多d.coul.b.disastrous.Fo.instance,callin..functio.tha.
28.当一个类A中没有生命任何成员变量与成员函数,这D*pdl=dynamic castD*pb;时sizeof A的值是多少,如果不是零,请解释一下编译器D*pd2=static_castD*pb;为什么没有让它为零Autodesk}答案肯定不是零举个反例,如果是零的话,声明一I.p.reall.point,t.a.objec.o.typ.D.the.pd.an.pd.个class A
[10]对象数组,而每一个对象占用的空间是零,w il.ge.th.sam.value.The.wil.als.ge.th.sam.valu.这时就没办法区分A
[0],A[l]…了i.p.=.
0..
29.在
808.汇编下,逻辑地址和物理地址是怎样转换的?I.p.point,t.a.objec.o.typ..an.no.t.th.complet..Intelc lass.the.dynamic_cas.wil.kno.enoug.t.retur.zero.答案通用寄存器给出的地址,是段内偏移地址,相应However.static_cas.relie.o.th.programmer.asser tio.tha.段寄存器地址*10H+通用寄存器内地址,就得到了真正要访p.point,t.a.objec.o.typ..an.simpl.return..pointe,问的地址t.tha.suppose..object.
30.比较C++中的4种类型转换方式?Consequently.static_cas.ca.d.th.invers.o.implici,
2.5;D*pd2=double dbl;static_castD*pb;//not safe,pb.c..static_castchari;//point tojust B,/.in.t.cha..B.pb..static_castB*pd;./.saf.may charch;.db..static_castdoublef;./.flo th.operan.expressio.t.a.objec.o.typ.type-i d.Th.a.t.doubl.type-i.mus.b..pointe,o..referenc.t..previou si.define,clas.typ.o..••••・・・static_castBYTEch.upointe,t.void”.Th.typ.o.expressio.mus.b..pointe.i.type-i.i..pointer,o.a.1-valu.i.type-i.i..re••••ference.SyntaxTh.static_cas.operato.ca.explicitl.conver.a.inte gra.dynamic casttype-idexpression valu.t.a.enumeratio.type.I.th.valu.o.th.inte gra.I.type-i.i..pointe,t.a.unambiguou.accessibl.dire c.typ.doe.no.fal.withi.th.rang.o.enumeratio.va.lues.o.indirec.bas.clas.o.expression..pointe,t.th.u niqu.th.resultin.enumeratio.valu.i.undefined.subobjec.o.typ.type-i.i.th.result.Fo.exampl e:The staticcast operator converts a null pointer value to theclas.......null pointervalue ofthe destinationtype.clas...publi....}.An.expressio.ca.b.explicitl.converte.t.typ.voi.b.th.clas...publi.....;static_cas.operator.Th.destinatio.voi.typ.ca.optional!,void fD*pdinclud.th.const,volatile,o.unaligne,attribute.The staticcast operator cannot castaway theconst,volatile,C*pc=dynamic_castC*pd;//ok:C isaor_unaligned attributes.direct baseclassstatic_cast在功能上基本上与C风格的类型转换一样强大,含义也一样它也有功能上限制例如,你不能用static_cast//pc pointsto Csubobject ofpd象用C风格的类型转换一样把struct转换成int类型或者.B.p..dynamic_castB*pd;./.ok..i.a.indirec.bas.把double类型转换成指针类型,另外,static_cast不能从clas.•表达式中去除const属性,因为另一个新的类型转换操作符,p.const_cast有这样的功能••••
3.dynamiccast Operator-id..run-tim.chec.i.mad.t.se.i.expressio.actual1,MSDN:point,t..complet.objec.o.th.typ.o.type-id.I.thi,Th.expressio.dynamic_casttype-id.expressio..co nvert.i.true.th.resul.i..pointe,t..complet.objec.o.th,换函数指针类型typ.o.type-id.Fo.example:clas.
31.分别写出BOOL,int,float,指针类型的变量a与“零”
4.reinterpretcast OperatorMSDN:的比较语句Th.reinterpret cas.operato.allow,an.pointe,t.b.c答案onverte.int.an.othe.pointe,type.I.als.allow,an.iBOOL:if!aor ifantegra.typ.t.b.converte.int.an.pointe.typ.an.vicint:ifa==0•versa.Misus,o.th.reinterpret_cas.operato.ca.eas il.float:const EXPRESSIONEXP=
0.000001b.unsafe.Unles.th.desire,conversio.i.inherent
1.ifaEXPa-EXP pointer:iflow-level,yo.shoul.us.on.o.th.othe.cas.operato rs.a!=NULL orifa==NULLSyntax
32.请说出const与#€10门血相比,有何优点?reinterpret_casttype-idexpression答案1const常量有数据类型,而宏常量没有数据类The reinterpretcastoperatorcanbeusedfor conversionssuch型编译器可以对前者进行类型安全检查而对后者只进as char*to int*,or One_class*to Unrelated_class*,which行字符替换,没有类型安全检查,并且在字符替换可能会are inherentlyunsafe.产生意料不到的错误Th.resul.o..reinterpret_cas.canno.safel.b.use.2有些集成化的调试工具可以对const常量进行调试,但fo.anythin,othe.tha.bein.cas.bac.t.it.origina.是不能对宏常量进行调试type.Othe.use.are.a.best,nonportable.
33.简述数组与指针的区别?The reinterpretcastoperatorcannot castaway theconst,数组要么在静态存储区被创建如全局数组,要么在栈volatile,or_unaligned attributes.上被创建指针可以随时指向任意类型的内存块使用这个操作符的类型转换,其的转换结果几乎都是执行期定义implementation-defined因此,使用1修改内容上的差别reinterpret_casts的代码很难移植char a[]=hello”;reinterpret_casts的最普通的用途就是在函数指针类型之a
[0]=X,;间进行转换char*p=world;//注意p指向常量字符串p
[0]=X,;〃比如转换函数指针的代码是不可移植的C++不保证所有的编译器不能发现该错误,运行时错误函数指针都被用一样的方法表示,在一些情况下这样的转换会产生不正确的结果参见条款M31,所以你应该避免转2用运算符sizeof可以计算出数组的容量字节数sizeof p,p为指针得到的是一个指针变量的字节数,而给出说明?不是P所指的内存容量C++/C语言没有办法知道指针所指答案可以,可以用_onexit注册一个函数,它会在lain之的内存容量,除非在申请内存时记住它注意当数组作为后执行int fnlvoid,fn2void,fn3void,fn4void;函数的参数进行传递时,该数组自动退化为同类型的指针voi.main.voi.char a[]=hello world”;char*p=a;Strin.str,/zhanglin,9;cout sizeof aendl;//12字节onexit.fn.;cout sizeofpendl;//4字节onexit.fn.;计算数组和指针的内存容量________________________onexit.fn.;void Funcchara
[100]_onexit.fn.;printf.z,Thi.i.execute,first.\n.;cout sizeofaendl;//4字节而不是100字-Hj-in.fnl}printf.〃next・\n.;
34.类成员函数的重载、覆盖和隐藏区别?retur.0;答案a.成员函数被重载的特征in.fn21相同的范围在同一个类中;2函数名字相同;3printf.execute・;参数不同;4virtual关键字可有可无retur.0;b.覆盖是指派生类函数覆盖基类函数,特征是1不同的范围分别位于派生类与基类;2函数名字in.fn3相同;3参数相同;4基类函数必须有virtual关键字printf.i・・;c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函retur.0;数,规则如下1如果派生类的函数与基类的函数同名,但是参数不in.fn4同此时,不论有无virtual关键字,基类的函数将被隐藏printf.z,Thi..;注意别与重载混淆retur.0;2如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字此时,基类的函Th.onexi.functio.i.passe,th.addres.o..functio.func.数被隐藏注意别与覆盖混淆t.b.calle.whe.th.progra.terminate,normally.Successiv..
35.Ther.ar.tw.in.variables..an.b.don us.if”.call.t._onexi.creat..registe.o.functio n・tha.ar..“switch”execute,i.LIF.last-in-first-out.order.Th.function,o.othe.judgemen.statements.fin.ou.th.bigges.on.o.th.passe,t.onexi.canno.tak.parameters,void mainvoid tw.numbers.答案a+b+absa-b/2String str〃zhanglin〃;
36.如何打印出当前源文件的文件名以及源文件的当前行onexitfnl;号?onexitfn2;答案onexitfn3;cout_FILE—;_onexitfn4;cout_LINE—;printfThis isexecuted first.\n/z;_FILE_和_LINE_是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的int fnl{cout_FILE_;printf next.\n〃;cout_LINE—;return0;_FILE_和_LINE_是系统预定义宏,这种宏并不是在某个文件中定义的,而是由编译器定义的int fn2{printf executed〃;.
37.niai.主函数执行完毕后,是否可能会再执行一段代码,1|return0;intemp;int fn3{data,push backtemp;printf〃is〃;in.close.〃关闭输入文件流Orderdata;return0;ofstrea.out/zc:\\result.txt〃;int fn4printf This〃;return0;
1.
38.如何判断一段程序是由.编译程序还是由C++编译程
40.链表题一个链表的结点结构struc.Node序编译的?答案{tiifdef cpluspluscout〈〈〃c++”;in.dat.;else cout〈〃c〃;tfendifNod.*nex.;
1.;data[j+l..tem.;♦p2-nex..p.;hea..p.;i..!ta.brea.;retur.hea.;#i ncludeiostreamvoi.main.voi.vectorintdata;#i ncludefstreamifstrea.in z,c:\\data.txt〃;using namespacestd;
1..!invoid Ordervectorint data//bubble sortint count=data,size;cout,zfil.error!,z;int tag二false;//设置是否需要继续冒泡的标志位exit1;forint i=0;icount;i++in.temp;forint j=0;jcount-i-1;j++whil.!in.eof ifdata[j]data[j+1]tag=true;int temp=data[j];data[j]=data[j+1];data[j+1]=temp;if!tagbreak;void mainvoid vectorintdata;ifstream in〃c:\\data.txt〃;if!incout,zfile error!/z;exit1;int temp;while!in.eof intemp;data,push backtemp;in.closeO;〃关闭输入文件流Orderdata;ofstream outCc:\\result.txt/z;iflout break;cout,zfile error!z,;exit1;void mainvoid fori=0;idata,size;i++outdata/z〃;vectorintdata;put.close;〃关闭输出文件流ifstream in〃c:\\data.txt〃;if!in
40.链表题一个链表的结点结构struct Node int dataNode*next;cout,zfile error!/z;;exit1;typedef structNode Node;}1已知链表的头结点head,写一个函数把这个链表逆序int temp;Intelwhile!in.eof Node*ReverseList Node*head〃链表逆序{ifhead==NULL|head-next二二NULLreturn head;intemp;Node*pl=Node*p2=Node*p3二pl-next=whilep3{data,push backtemp;p2-next二pl=p2;p2=p3;in.closeO;〃关闭输入文件流p3=p3-next;Orderdata;ofstream out〃c:\\result.txt〃;}head;if!outp2-next=pl;pl-next;{head二p2;p2-next;return head;coutz,file error!,z;NULL;exit1;!=NULL#includeiostreamfori=0;idata,size;i++outdatazz〃;pl;#iout.close;//关闭输出文件流ncludefstreamusing namespacestd;void Ordervectorint data//bubble sort
40.链表题一个链表的结点结构int count=data,size;struct Nodeinttag=false;//设置是否需耍继续冒泡的标志位forint i=0;icount;i++intdata;forint j=0;jcount-i-1;j++Node*next;;ifdata[j]data[j+1]tag=true;inttemp=data[j];data[j]=data[j+1];data[j+1]=temp;if!tag returnO;aQ][k]=O;}把循环语句内外换一.
13.对于一个频繁使用的短小函数,在C语言中应用什
26.么实现,在C++中应用什么实现#defin.Max_C.5O.c用宏定义,C++用inlinevoi.LmiQueryCSmdStruc.MSgC..pmsg.
14.直接链接两个信令点的一组链路称作什么■PPP点到点连接unsigne.cha.ucCmdNum.
15.接入网用的是什么接口V5接口
16.voip都用了那些协议forucCmdNum=0;ucCmdNumMax_CB;ucCmdNum++.H.323协议簇、SIP协议、Skype协议、H.248和MGCP协议
17.软件测试都有那些种类黑盒针对系统功能的测试白合测试函数功能,各函数接口死循环,unsigne.int的取值范围是0~
25.
18.确定模块的功能和模块的接口是在软件设计的那
27.以下是求一个数的平方的程序,请找出错误.个队段完成的#defin.SQUAREaa*a.概要设计阶段in.a=
5.
19.in.b.enum stringb=SQUAREa++;{xl,x2,x3=10,x4,x5,}x;答:结果与编译器相关,得到的可能不是平方值.
28.问x=0x801005,0x8010f4;typede.unsigne.cha.BYT.in.examply_funBYT.gt_len.BYT.*gt_code.
20.{.unsigned char*pl;BYT.*gt_buf.unsigned long*p2;gt_buf=BYT.*MALLOCMax_GT_Length.pl=unsignedchar*0x801000;p2=unsigned long*0x810000;ifgt_lenMax_GT_Length.请问pl+5=;p2+5=;retur.GT_Length_ERROR;.选择题
21.Ethternet链接到Internet用到以下那个协议A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
22.属于网络层协议的是
23.Windows消息调度机制是问答题.A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
29.LPhone的原理是什么.I.电话又称I.PHONE或VoIP是建立在IP技术上的分组化、
24.数字化传输技术,其基本原理是通过语音压缩算法对语unsigned shorthashunsigned shortkey音数据进行压缩编码处理,然后把这些语音数据JP等相关协议进行打包,经过IP网络把数据包传输到接收地,再把这return key»%256些语音数据包串起来,经过解码解压处理后,恢复成原来}的语音信号,从而达到由IP网.传送语音的目的
30.TCP/IP请问hash16,hash256的值分别是通信建立的过程怎样,端口有什么作用.三次握手,确定是哪个应用程序使用该协.找错题3L1号信令和7号信令有什么区别,我国某前广泛使用的是
25.请问下面程序有什么错误.那一种?in.a
[60]
[250]
[1000],i,j,k.1号信令接续慢,但是稳定,可靠fork=0;k=1000;k++.7号信令的特点是信令速度快,具有提供大量信令的潜力,forj=0;j250;j++.具有改变和增加信令的灵活性,便于开放新业务,在通话fori=0;i60;i++.时可以随意处理信令,成本低目前得到广泛应用32,列举5种以上的电话新业.Autodesktypedef structNode Node;答案⑴已知链表的头结点head,写一个函数把这个链表逆序Node*MergeRecursiveNode*hoadl,Node*head2Intelifheadl=NULL Node*ReverseList Node*head〃链表逆序return head2;ifhead二二NULL|head-〉next二二NULLreturn head;ifhead2==NULL return headl;Node*pl=head;Node*head=NULL;Node*p2=pl-next;ifheadl-datahead2-〉dataNode*p3=p2-next;head=headl;pl-next=NULL;head-next=MergeRecursiveheadl-next,head2;whilep3!=NULLp2-next=pl;pl=p2;elsep2=p3;p3=p3-next;head=head2;p2-next=pl;head-next=MergeRecursiveheadl,head2-next;head=p2;return head;}return head;2已知两个链表headl和head2各自有序,请把它们合
41.分析一下这段程序的输,Autodesk,class B并成一个链表依然有序保留所有结点,即便大小相同Node*MergeNode*headl,Node*head2ifheadl二二NULL returnhead2;ifhead2二二NULL returnheadl;Node*head=NULL;Node*pl=NULL;Node*p2=NULL;ifheadl-datahead2-datahead=headl;pl=headl-next;p2二head2;elsehead=head2;p2二head2-next;pl=headl;Node*pcurrent=head;whilepl!=NULLp2!=NULLifpl-data=p2-〉datapcurrent-next=pl;pcurrent=pl;〃文章来源草根IT网www.caogenit.com pl=pl-next;elsepcurrent-next=p2;pcurrent=p2;p2=p2-next;ifpl!=NULLpcurrent-〉next=pl;ifp2!二NULL pcurrent-next=p2;returnhead;3已知两个链表headl和head2各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行public:.
42.写一个函数找出一个整数数组中,第二大的.B{coutz,default construe tor,zendl;microsoft答案、B{cout,,destructed/,endl;const intMINNUMBER=-32767;int find_sec_max intdata口,int countBint i:datai//Bint worksas aconverterint-〉int maxnumber=data
[0];instance ofB{int sec_max=MINNUMBER;cout,,constructed by parameter〃data endl;forint i=1;icount;i++ifdatamaxnumberprivate:intdata;secmax=maxnumber;;maxnumber二data;B PlayB b{return b;}else{ifdatasec_maxsec_max=data;〃文章来1results源草根IT网www.caogenit.comreturn sec_max;int mainint argc,char*argv[]constructed by parameter5KMP算法效率最好,时间复杂度是0n+m{destruc.
44.多重继承的内存分配问题比如有ted B5形参析构clas...publi.clas.B.publi.clas..{}那么A的内存结构B tl=Play5;B t2=大致是怎么样的?Playtl;destructed tl形参析构这个是compiler-dependent的,不同的实现其细节可能不return0;destructed t2注意顺序!destructed tl同2如果不考虑有虚函数、虚继承的话就相当简单;否则的results:int mainintargc,话,相当复杂char*argv[]constructed by parameter5可以参考《深入探索C++对象模型》,或者http:〃blog.csdn.net/wfwd/archive/2006/05/30/
763797.aspxdestructed B5形参析构.
45.如何判断一个单链表是有环的?注意不能用标志位,B tl=Play5;B t2=Play10;constructed最多只能用两个额外指针byparameter10return0;struct node{char val;node*next;}destructed B10形参析构}bool checkconst node*head{}//return false:无环;destructed t2注意true:有环一种0n的办法就是搞两个指针,一个每次递增一tl constructed byparameter5{destruc步,一个每次递增两步,如果有环的话两者必然重合,反ted B5形参析构之亦然B tl=Play5;B t2二bool checkconstnode*headPlay tl;destructed tl形参析构return0;destructed t2注意顺序!}destructed tl2results:ifhead二二NULL return false;int mainintargc,char*node*low=head,*fast=head-〉next;argv[]constructedbyparameter5whilefast!=NULLfast-next!=NULL destructed B5形参析构low=low-next;B tl=Play5;B t2=Play10;constructed fast二fast-next-next;byparameter10return0;iflow==fast returntrue;destructedB10形参析构}destructed t2注意顺序!returnfalse;destructed tl顺序!.
43.写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数printf〃%3d〃,a[j];printf〃\n〃;
46.输入一个n,然后在屏幕上打印出NxN的矩阵!例如,}输入一个3,则123894选择排序、快速排序、希尔排序、堆排序不是稳定的排765序算法,输入一个4,则冒泡排序、插入排序、归并排序和基数排序是稳定的排序1234算法12131451116156冒泡法10987这是最原始,也是众所周知的最慢的算法了他的名字的参考答案由来因为它的工作看来象是冒泡复杂度为0n*n当数#includestdio.h据为正序,将不会有交换复杂度为0#includeconio.h直接插入排序0n*nttdefine N10选择排序0n*nvoid printCubeinta[][N],intn;快速排序平均时间复杂度log2n*n,所有内部排序方法中最高好的,大多数情况下总是最好的voidmain归并排序log2n*n堆排序log2n*ninta[N][N],n;希尔排序算法的复杂度为n的
1.2次幕printfinput n:\n〃;scanf〃%d〃,n;这里我没有给出行为的分析,因为这个很简单,我们直接printCubea
[0],n;来分析算法getchO;首先我们考虑最理想的情况}L数组的大小是2的累,这样分下去始终可以被2整除假void printCubeinta[][N],intn设为2的k次方,即k=log2n
2.每次我们选择的值刚好是中间值,这样,数组才可以被inti,j,round=l;等分intm=l;第一层递归,循环n次,第二层循环2*n/
[0]=m++;文章来源草根IT网www.caogenit.comn+n+n+・・・+n=k*n=log2n*nfor i=n-l;i=n/2;i--所以算法复杂度为0log2n*n其他的情况只会比这种情况差,最差的情况是每次选择到的middle都是最小值或最大值,那么他将变成交换法由于for j=round;j=i;j++使用了递归,情况更糟但是你认为这种情况发生的几率a[j]=m++;有多大??呵呵,你完全不必担心这个for j=i;j=round;j一问题实践证明,大多数的情况,快速排序总是最好的如a[j-l]=m++;果你担心这个问题,你可以使用堆排序,这是一种稳定的forj=i;jround;j—0log2n*n算法,但是通常情况下速度要慢于快速排序a[j-1][round-1]=m++;因为要重组堆for j=round;ji;j++a[round][j]=m++;这几天笔试了好几次了,连续碰到一个关于常见排序算法round++;稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果fori=0;in;i++{你笔试之前已经记住了数据结构书上哪些是稳定的,哪些for j=0;jn;j++不是稳定的,做起来应该可以轻松搞定本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定走,当a[j]a[center_index]如果i和j都走不动了,i=o的人准备的j,交换a[i]和a不],重复上面的过程,直到ijo交换a[j]首先,排序算法的稳定性大家应该都知道,通俗地和a[center_index],完成一趟快速排序在中枢元素和a[j]讲就是能保证排序前2个相等的数其在序列的前后位置顺交换的时候,很有可能把前面的元素的稳定性打乱,比如序和排序后它们两个的前后位置顺序相同在简单形式化序列为53343891011,现在中枢元素5和3第5个元素,一下,如果Ai二Aj,Ai原来在位置前,排序后Ai还是要在下标从1开始计交换就会把元素3的稳定性打乱,所以快Aj位置前速排序是一个不稳定的排序算法,不稳定发生在中枢元素其次,说一下稳定性的好处排序算法如果是稳定的,和a[j]交换的时刻那么从一个键上排序,然后再从另一个键上排序,第一个⑸归并排序键排序的结果可以为第二个键排序所用基数排序就是这归并排序是把序列递归地分成短序列,递归出口是短样,先按低位排序,逐次按高位排序,低位相同的元素其序列只有1个元素认为直接有序或者2个序列1次比较顺序再高位也相同时是不会改变的另外,如果排序算法和交换,然后把各个有序的段序列合并成一个有序的长序稳定,对基于比较的排序算法而言,元素交换的次数可能列,不断合并直到原序列全部排好序可以发现,在1个会少一些个人感觉,没有证实或2个元素时,1个元素不会交换,2个元素如果大小相等回到主题,现在分析一下常见的排序算法的稳定性,也没有人故意交换,这不会破坏稳定性那么,在短的有每个都给出简单的理由序序列合并的过程中,稳定是是否受到破坏?没有,合并1冒泡排序过程中我们可以保证如果两个当前元素相等时,我们把处冒泡排序就是把小的元素往前调或者把大的元素在前面的序列的元素保存在结果序列的前面,这样就保证往后调比较是相邻的两个元素比较,交换也发生在这两了稳定性所以,归并排序也是稳定的排序算法个元素之间所以,如果两个元素相等,我想你是不会再⑹基数排序无聊地把他们俩交换一下的;如果两个相等的元素没有相基数排序是按照低位先排序,然后收集;再按照高位排邻,那么即使通过前面的两两交换把两个相邻起来,这时序,然后再收集;依次类推,直到最高位有时候有些属候也不会交换,所以相同元素的前后顺序并没有改变,所性是有优先级顺序的,先按低优先级排序,再按高优先级以冒泡排序是一种稳定排序算法排序,最后的次序就是高优先级高的在前,高优先级相同⑵选择排序的低优先级高的在前基数排序基于分别排序,分别收集,选择排序是给每个位置选择当前元素最小的,比如所以其是稳定的排序算法给第一个位置选择最小的,在剩余元素里面给第二个元素⑺希尔排序shell选择第二小的,依次类推,直到第n-1个元素,第n个元素希尔排序是按照不同步长对元素进行插入排序,当刚不用选择了,因为只剩下它一个最大的元素了那么,在开始元素很无序的时候,步长最大,所以插入排序的元素一趟选择,如果当前元素比一个元素小,而该小的元素又个数很少,速度很快;当元素基本有序了,步长很小,插出现在一个和当前元素相等的元素后面,那么交换后稳定入排序对于有序的序列效率很高所以,希尔排序的时间性就被破坏了比较拗口,举个例子,序列58529,我们复杂度会比orf2好一些由于多次插入排序,我们知道知道第一遍选择第1个元素5会和2交换,那么原序列中2一次插入排序是稳定的,不会改变相同元素的相对顺序,个5的相对前后顺序就被破坏了,所以选择排序不是一个稳但在不同的插入排序过程中,相同的元素可能在各自的插定的排序算法入排序中移动,最后其稳定性就会被打乱,所以shell排序⑶插入排序是不稳定的插入排序是在一个已经有序的小序列的基础上,一次8堆排序插入一个元素当然,刚开始这个有序的小序列只有1个我们知道堆的结构是节点i的孩子为2*i和2*i+l节点,元素,就是第一个元素比较是从有序序列的末尾开始,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父也就是想耍插入的元素和已经有序的最大者开始比起,如节点小于等于其2个子节点在一个长为n的序列,堆排序果比它大则直接插入在其后面,否则一直往前找直到找到的过程是从第n/2开始和其子节点共3个值选择最大大顶它该插入的位置如果碰见一个和插入元素相等的,那么堆或者最小小顶堆,这3个元素之间的选择当然不会破插入元素把想插入的元素放在相等元素的后面所以,相坏稳定性但当为n/2-1,n/2-2,...1这些个父节点选择元等元素的前后顺序没有改变,从原无序序列出去的顺序就素时,就会破坏稳定性有可能第n/2个父节点交换把后面是排好序后的顺序,所以插入排序是稳定的一个元素交换过去了,而第n/2T个父节点把后面一个相同4快速排序的元素没有交换,那么这2个相同的元素之间的稳定性就快速排序有两个方向,左边的i下标一直往右走,当a[i]被破坏了所以,堆排序不是稳定的排序算法=a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素而右边的j下标一直往左1快速排序Quicksort快速排序是一个就地排序,分而治之,大规模递归的算法发展的初级阶段,在实际中使用较少从本质上来说,它是归并排序的就地版本快速排序可以8基数排序RadixSort由下面四步组成基数排序和通常的排序算法并不走同样的路线它是一种1如果不多于1个数据,直接返回比较新颖的算法,但是它只能用于整数的排序,如果我们2一般选择序列最左边的值作为支点数据要把同样的办法运用到浮点数上,我们必须了解浮点数的3将序列分成2部分,一部分都大于支点数据,另外一部存储格式,并通过特殊的方式将浮点数映射到整数上,然分都小于支点数据后再映射回去,这是非常麻烦的事情,因此,它的使用同4对两边利用递归排序数列样也不多而且,最重要的是,这样算法也需要较多的存快速排序比大部分排序算法都要快尽管我们可以在某些储空间特殊的情况下写出比快速排序快的算法,但是就通常情况9总结而言,没有比它更快的了快速排序是递归的,对于内存下面是一个总的表格,大致总结了我们常见的所有的排序非常有限的机器来说,它不是一个好的选择算法的特点2归并排序MergeSort排序法平均时间最差情形稳定度额外空间备注归并排序先分解要排序的序列,从1分成2,2分成4,依次冒泡0n2On2稳定01n小时较好分解,当分解到只有1个一组的时候,就可以排序这些分交换On2On2不稳定01n小时较好选择0n2On2不稳定01n小时较好组,然后依次合并回原来的序列中,这样就可以排序所有插入0n2On2稳定01大部分已排序时较好数据合并排序比堆排序稍微快一点,但是需要比堆排序B是真数0-9,多一倍的内存空间,因为它需要一个额外的数组基数OlogRB OIOQRB稳定0n3堆排序HeapSortR是基数个十百堆排序适合于数据量非常大的场合百万数据Shell Onlogn Ons ls2不稳定01s是所选分组堆排序不需要大量的递归或者多维的暂存数组这对于数快速OnlognOn2不稳定Onlogn n大时较好据量非常巨大的序列是合适的比如超过数百万条记录,归并Onlogn Onlogn稳定01n大时较好因为快速排序,归并排序都使用递归来设计算法,在数据Onlogn Onlogn堆不稳定01n大时较好量非常大的时候,可能会发生堆栈溢出错误堆排序会将浙大网新C/C++面试,笔试题所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数
1.写一个“标准”宏MIN,这个宏输入两个参数并返回较小据和序列的最后一个数据交换接下来再次重建堆,交换的一个数据,依次下去,就可以排序所有的数据itdefine MINA,B A=B A:B这个测试是为下4Shell排序ShellSort面的目的而设的Shell排序通过将数据分成不同的组,先对每一组进行排序,
1.标识#define在宏中应用的基本知识这是很重耍的,然后再对所有的元素进行一次插入排序,以减少数据交换因为直到嵌入inline操作符变为标准C的一部分,宏是方和移动的次数平均效率是Onlogn其中分组的合理性会便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了对算法产生重要的影响现在多用D.E.Knuth的分组方法能达到要求的性能,嵌入代码经常是必须的方法Shell排序比冒泡排序快5倍,比插入排序大致快2倍
2.三重条件操作符的知识这个操作符存在C语言中的原Shell排序比起Quicksort,MergeSort,HeapSort慢很多因是它使得编译器能产生比if-then-else更优化的代码,了但是它相对比较简单,它适合于数据量在5000以下并且速解这个用法是很重要的度并不是特别重要的场合它对于数据量较小的数列重复
3.懂得在宏中小心地把参数用括号括起来排序是非常好的
4.我也用这个问题开始讨论宏的副作用,例如当你写下5插入排序InsertSort面的代码时会发生什么事?插入排序通过把序列中的值插入一个已经排序好的序列中,least=MIN*p++,b;直到该序列的结束插入排序是对冒泡排序的改进它比
3.预处理器标识#0仃0「的目的是什么?冒泡排序快2倍一般不用在数据大于1000的场合下使用如果你不知道答案,请看参考文献1这问题对区分一个正插入排序,或者重复排序超过200数据项的序列常的伙计和一个书呆子是很有用的只有书呆子才会读C6冒泡排序BubbleSort语言课本的附录去找出象这种冒泡排序是最慢的排序算法在实际运用中它是效率最低问题的答案当然如果你不是在找一个书呆子,那么应试的算法它通过一趟又一趟地比较数组中的每一个元素,者最好希望自己不要知道答案使较大的数据下沉,较小的数据上升它是0^2的算法死循环Infinite loops7交换排序ExchangeSort和选择排序SelectSort这两种排
4.嵌入式系统中经常要用到无限循环,你怎么样用C编写序方法都是交换方法的排序算法,效率都是0n2在实际应o死循环呢?〃文章来.草根IT网www.caogenit.com用中处于和冒泡排序基本相同的地位它们只是排序算法这个问题用几个解决方案我首选的方案是又能为什么出准备呢?while1{}Static一些程序员更喜欢如下方案
6.关键字static的作用是什么.for;;{}这个简单的问题很少有人能回答完全在C语言中,关键这个实现方式让我为难,因为这个语法没有确切表达到底字static有三个明显的作用怎么回事如果一个应试者给出这个作为方案,我将用这
1.在函数体,一个被声明为静态的变量在这一函数被调用个作为一个机会去探究他们这样做的过程中维持其值不变基本原理如果他们的基本答案是“我被教着这样做,但
2.在模块内但在函数体外,一个被声明为静态的变量可从没有想到过为什么”这会给我留下一个坏印象第三以被模块内所用函数访问,但不能被模块外其它函数访问个方案是用goto它是一个本地的全局变量Loop:••goto Loop;应试者如给出上面的方案,这说明♦
3.在模块内,一个被声明为静态的函数只可被这一模块内或者他是一个汇编语言程序员这也许是好事或者他是一的其它函数调用那就是,这个函数被限制在声明它的模个想进入新领域的BASIC/FORTRAN程序员块的本地范围内使用数据声明Data declarations大多数应试者能正确回答第一部分,一部分能正确回答第
5.用变量a给出下面的定义二部分,同是很少的人能懂得第三部分这是一个应试者a一个整型数An integer的严重的缺点,因为他显然不懂得本地化数据和代码范围b一个指向整型数的指针A pointer to an integer c一的好处和重要性个指向指针的的指针,它指向的指针是指向一个整型数AConstpointer to apointerto an integer d一个有10个整型数
7.关键字const是什么含意?的数组An array of10integers我只要一听到被面试者说“const意味着常数”,我就知e一个有10个指针的数组,该指针是指向一个整型数的An道我正在和一个业余者打交道去年Dan Saks已经在他的array of10pointers tointegers文章里完全概括了const的所有用法,因此ESP译者f一个指向有10个整型数数组的指针A pointerto anarrayEmbedded SystemsProgramniing的每一位读者应该非常熟悉of10integersconst能做什么和不能做什么如果你从没有读到那篇文章,g一个指向函数的指针,该函数有一个整型参数并返回一只要能说出const意味着“只读”就可以了尽管这个答案个整型数A pointertoafunction that takes an integer as不是完全的答案,但我接受它作为一个正确的答案如果an argument and returns an integer h一个有10个指针的你想知道更详细的答案,仔细读一下Saks的文章吧如果数组,该指针指向一个函数,该函数有一个整型参数并返应试者能正确回答这个问题,我将问他一个附加的问题回一个整型数Anarray often pointers to functionsthattake下面的声明都是什么意思?const inta;an integer argument and return aninteger答案是int const a;const int*a;int*consta;int const*a const;a inta;//An integer前两个的作用是一样,a是一个常整型数第三个意味着ab int*a;//A pointerto aninteger是一个指向常整型数的指针也就是,整型数是不可修改的,c int**a;//A pointertoapointerto anintegerdint但指针可以第四个意思a是一个指向整型数的常指针也a
[10];//An arrayof10integers就是说,指针指向的整型数是可以修改的,但指针是不可eint;//An arrayof10pointers to修改的最后一个意味着a是一个指向常整型数的常指针integers也就是说,指针指向的整型数是不可修改的,同时指针也fint*a
[10];//A pointertoanarrayof10integers是不可修改的如果应试者能正确回答这些问题,那么他g int*a int;//A pointertoafunction athat takes就给我留下了一个好印象顺带提一句,也许你可能会问,anintegerargumentandreturnsanintegerhint即使不用关键字const,也还是能很容易写出功能正确的程*a
[10]int;//An arrayof10pointerstofunctionsthat序,那么我为什么还要如此看重关键字const呢?我也take anintegerargumentandreturn aninteger人们经常声如下的几下理由称这里有几个问题是那种要翻一下书才能回答的问题,我
1.关键字const的作用是为给读你代码的人传达非常有用同意这种说法当我写这篇文章时,为了确定语法的正确的信息,实际上,声明一个参数为常量是为了告诉了用户性,我的确查了一下书这个参数的应用目的如果你曾花很多时间清.其它人留下但是当我被面试的时候,我期望被问到这个问题或者相近的垃圾,你就会很快学会感谢这点多余的的问题因为在被面试的这段时间里,我确定我知道这个信息当然,懂得用const的程序员很少会留下的垃圾让问题的答案应试者如果不知道别人来清理的所有的答案或至少大部分答案,那么也就没有为这次面
2.通过给优化器一些附加的信息,使用关键字const也许试做准备,如果该面试者没有为这次面试做准备,那么他能产生更紧凑的代码
3.合理地使用关键字const可以使编译器很自然地保护那a=*ptr;些不希望被改变的参数,防止其被无意的代码修改简而return a*a;言之,这样可以减少bug的出现Volatile位操作Bit manipulation
8.关键字volatile有什么含.并给出三个不同的例子一
9.嵌入式系统总是要用户对变量或寄存器进行位操作给个定义为volatile的变量是说这变量可能会被意想不到地定一个整型变量a,写两段代码,第一个设置a的bi.3,第二改变,这样,编译器就不会去假设这个变量的值了精确个清除•的bi.3在以上两个操作中,要保持其它位不变地说就是,优化器在用到这个变量时必须每次都小心地重对这个问题有三种基本的反应新读取这个变量的值,而不是使用保存在寄存器里的备份
1.不知道如何下手该被面者从没做过任何嵌入式系统的下面是volatile变量的几个例子:1,并行设备的硬件寄存工作器如状态寄存器2,用bi.fieldso Bi.fields是被扔到C语言死角的东西,
2.一个中断服务子程序中会访问到的非自动变量它保证你的代码在不同编译器之间是不可移植的,同时也Non-automati.variables保证了的你的代码是不可重用的我最近不幸看.Infineon
3.多线程应用中被几个任务共享的变量为其较复杂的通信芯片写的驱动程序,它用到了bi.fields回答不出这个问题的人是不会被雇佣的我认为这是区分C因此完全对我无用,因为我的编译器用其它的方式来实现程序员和嵌入式系统程序员的最基本的问题嵌入式系统bi.fields的从道德讲永远不要让一个非嵌入式的家伙程序员经常同硬件、中断、RTOS等等打交道,所用这些都粘实际硬件的边要求volatile变量不懂得volatile内容将会带来灾难
3..#def ine..bi.mask.操作这是一个有极高可移植性假设被面试者正确地回答了这是问题嗯,怀疑这否会是这的方法,是应该被用到的方法最佳的解决方案如下:样,我将稍微深究一下,看一下这家伙是不是直正懂得#define BIT3OX1«3static inta;volatile完全的重要性void set_bit3void
1.一个参数既可以是const还可以是volatile吗?解释a|=BIT3;为什么
2.一个指针可以是volatil.吗?解释为什么
3.下面的函数有什么错误void clear_bit3voidint squarevolatile int*ptr{return*ptr**ptr;a二BIT3;〜下面是答案一些人喜欢为设置和清除值而定义一个掩码同时定义一些
1.是的一个例子是只读的状态寄存器它是volatile因说明常数,这也是可以接受的我希望看到几个要点说为它可能被意想不到地改变它是const因为程序不应该试明常数、I二和二~操作图去修改它访问固定的内存位置Accessing fixedmemory locations
2.是的尽管这并不很常见一个例子是当一个中服务子
10.嵌入式系统经常具有要求程序员去访问某特定的内存位程序修该一个指向一个buffer的指针时置的特点在某工程中,要求设置一绝对地址为0x67a9的
3.这段代码的有个恶作剧这段代码的目的是用来返指针整型变量的值为0xaa66编译器是一个纯粹的ANSI编译器*ptr指向值的平方,但是,由于*ptr指向一个volatile型写代码去完成这一任务.参数,编译器将产生类似下面的代码int squarevolatile这一问题测试你是否知道为了访问一绝对地址把一个整型int*ptr数强制转换typecast为一指针是合法的这一问题的实现方式随着个人风格不同而不同典型的类似代码如下{int*ptr;inta,b;ptr二int*0X67a9;a=*ptr;*ptr=0xaa55;b=*ptr;一个较晦涩的方法是returna*b;*int*const0X67a9=0xaa55;由于*ptr的值可能被意想不到地该变,因此a和b可能是即使你的品味更接近第二种方案,但我建议你在面试时使不同的结果,这段代码可能返不是你所期望的平方值!用第一种方案正确的代码如下中断Interruptslong squarevolatileint*ptr
11.中断是嵌入式系统中重要的组成部分,这导致了很多编inta;译开发商提供一种扩展一让标准C支持中断具代表事实是,产生了一个新的关键.—interrupto下面的代码就使用下面的追加问题,这些问题是比较难的,我想仅仅非常优了—interrupt关键字去定义了一个中断服务子程序ISR,秀的应试者能做得不错提出这些问题,我希望更多看到应请评论一下这段代码的〃文章来.草根IT网www.caogenit.试者应付问题的方法,而不是答案不管如何,你就当是com这个娱乐吧…动态内存分配Dynamic memoryallocation
14._interrupt doublecompute_area doubleradius{尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从double area二PI*radius*radius;堆heap中动态分配内存的过程的那么嵌入式系统中,动printfn Area二,area;态分配内存可能发生的问题是什么?这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等return area;这个主题已经在ESP杂志中被广泛地讨论过了主要.P.J.}Plauger.他的解释远远超过我这里能提到的任何解释,所这个函数有太多的错误了,以至让人不知从何说起了有回过头看一下这些杂志吧!让应试者进入一种虚假的安
1.IS.不能返回一个值如果你不懂这个,那么你不会被全感觉后,我拿出这么一个小节目下面的代码片段的.出雇用的是什么,为什么?char*ptr;
2.IS.不能传递参数如果你没有看到这一点,你被雇用if ptr二char*mallocO==NULL putsnGot anull的机会等同第一项pointern;
3.在许多的处理器/编译器中,浮点一般都是不可重入的else有些处理器/编译器需要让额处的寄存器入栈,有些处理器puts vGot avalid pointer;/编译器就是不允许在ISR中做浮点运算此外,ISR应该这是一个有趣的问题最近在我的一个同事不经意把0值传是短而有效率的,在ISR中做浮点运算是不明智的给了函数malloc,得到了一个合法的指针之后,我才想到这
4.与第三点一脉相承,printf经常有重入和性能上的问个问题这就是上面的代码,该代码的输出是“Got avalid题如果你丢掉了第三和第四点,我不会太为难你的不pointer我用这个来开始讨论这样的一问题,看看被面试者o用说,如果你能得到后两点,那么你的被雇用前景越来越是否想到库例程这样做是正确得到正确的答案固然重要,光明了但解决问题的方法和你做决定的基本原理更重要些代码例子Code examplesTypedefL.下面的代码输出是什么,为什么?void foovoid
15.Typede.在C语言中频繁用以声明一个已经存在的数据类型的同义字也可以用预处理器做类似的事例如,思考{一下下面的例子unsigned inta=6;int b=-20;#define dPSstruct s*a+b6puts6:puts“〈二6;typedef struct s*tPS;以上两种情况的意图都是要定义dPS和tPS作为一个指向结构s指针哪种方法更好呢?如果有的话为什么?这个问题测试你是否懂得C语言中的整数自动转换原则,我这是一个非常微妙的问题,任何人答对这个问题正当的发现有些开发者懂得极少这些东西不管如何,这无符号原因是应当被恭喜的答案是typedef更好思考下面整型问题的答案是输出是“6”原因是当表达式中存在有的例子符号类型和无符号类型时所有的操作数都自动转换为无符dPS pl,p2;号类型因此-20变成了一个非常大的正整数,所以该表达tPS p3,p4;式计算出的结果大于6这一点对于应当频繁用到无符号数第一个扩展为据类型的嵌入式系统来说是丰常重要的如果你答错了这structs*pl,p2;个问题,你也就到了得不到这份工作的边缘上面的代码定义pl为一个指向结构的指,P2为一个实际
13.评价下面的代码片断unsigned intzero=0;unsigned int的结构,这也许不是你想要的第二个例子正确地定义了compzero二OxFFFF;/*1s complementof zero*/对于一个p3和p4两个指针int型不是16位的处理器为说,上面的代码是不正确的晦涩的语法应编写如下unsigned intcompzero=0;
16.C语言同意一些令人震惊的结构,下面的结构是合法的这一问题真正能揭露出应试者是否懂得处理器字长的重要吗,如果是它做些什么?性在我的经验里,好的嵌入式程序员非常准确地明白硬inta=5,b=7,c;件的细节和它的局限,然而PC机程序往往把硬件作为一个c=a+++b;无法避免的烦恼这个问题将做为这个测验的一个愉快的结尾不管你相不到了这个阶段,应试者或者完全垂头丧气了或者信心满满相信,上面的例子是完全合乎语法的问题是编译器如何志在必得如果显然应试者不是很好,那么这个测试就在处理它?水平不高的编译作者实际上会争论这个问题,根这里结束了但如果显然应试者做得不错,那么我就扔出据最处理原则,编译器应当能处理尽可能所有合法的用法计算sizeof的值10分因此,上面的代码被处理成char str[]=Hello”;c=a+++b;char*p=str;因此,这段代码持行后a=6,b=7,c=12intn=10;o如果你知道答案,或猜出正确答案,做得好如果请计算你不知道答案,我也不把这个当作问题我发现这sizeof str=62分个问题的最大好处是:这是一个关于代码编写风格,sizeofp=42分代码的可读性,代码的可修改性的好的话题sizeofn=42分如“闹钟服务”、“免干扰服务”、“热线服务”、“转移void Funcchar str
[100]呼叫、“遇忙回叫”、“缺席用户服务”、“追查恶意呼叫”、“三方通话”、“会议电话”、“呼出限制”、“来电显示”、“虚拟网电话”等请计算sizeofstr=42分in.b;b=SQUAREa++;答:结果与编译器相关,得到的可能不是平方值.void*p=malloc100;
一、请填写BOOL,float,指针变量与“零值”比请计算较的if语句10分sizeofp=42分请写出BOOL flag与“零值”比较的if语句
三、简答题25分3分标准答案1•头文件中的ifndef/define/endif干什么ifflag用?5分if!flag答防止该头文件被重复引用如下写法均属不良风格,不得分if flag==TRUE
2.ttinclude filename.h和itincludeif flag==1“filename,h”有什么区别?5分if flag==FALSE答对于#1!1311113〈filename.h,编译器从if flag==0标准库路径开始搜索filename.h请写出float x与“零值”比较的if语句4分对于#include filename,h”,编译器从用标准答案示例:户的工作路径开始搜索filename,hconst floatEPSINON=
0.00001;if x=-EPSINONx=EPSINON
3.const有什么用途?请至少说明两种5分不可将浮点变量用或“!二”与数字比较,应该设答1可以定义const常量法转化成“=”或此类形式2const可以修饰函数的参数、返回值,甚至函如下是错误的写法,不得分数的定义体被const修饰的东西都受到强制保护,if x==
0.0可以预防意外的变动,能提高程序的健壮性if x!=
0.0请写出char*p与“零值”比较的if语句3分
4.在C++程序中调用被C编译器编译后的函数,为什么要加extern?5分标准答案答C++语言支持函数重载,C语言不支持函数重载if p==NULL函数被C++编译后在库中的名字与C语言的不同if p!=NULL假设某个函数的原型为void foointx,int y;如下写法均属不良风格,不得分该函数被C编译器编译后在库中的名字为_foo,而if p==0C++编译器则会产生像_foo_int_int之类的名字if p!=0C++提供了C连接交换指定符号extern“C”来解决if p名字匹配问题.if!
5.请简述以下两个for循环的优缺点5分for
二、以下为Windows NT下的32位C++程序,请i=0;iN;i++if conditionvoid TestvoidDoSomething|elsechar*str=NULL;DoOtherthingO;str=GetMemory;printf str优点程序简洁缺点多执行了N-1次逻辑判断,并且打断了循环请问运行Test函数会有什么样的结果?“流水线”作业,使得编译器不能对循环进行优化答可能是乱码处理,降低了效率因为GetMemory返回的是指向“栈内存”的指针,该if condition指针的地址不是NULL,但其原先的内容已经被清除,|新内容不可知for i=0;iN;i++DoSomethingO;void GetMemory2char**p,int numelse*p=char*mallocnum;|for i=0;iN;i++DoOtherthingO;void Testvoid优点循环的效率高char*str=NULL;GetMemorystr,100;缺点程序不简洁strcpystr,hello;C/C++经典面试试题及标准答案printf str
四、有关内存的思考题每小题5分,共20分void GetMemorychar*p请问运行Test函数会有什么样的结果?答1能够输出hellop=char*malloc100;2内存泄漏void Testvoidvoid Testvoidchar*str=char*malloclOO;strcpystr,hello”;char*str=NULL;free str;GetMemorystr;ifstr!=NULLstrcpystr,hello world;printfstr;strcpystr,world”;printf str请问运行Test函数会有什么样的结果?答.程序崩溃.请问运行Test函数会有什么样的结果?因为GetMemory并不能传递动态内存,答篡改动态内存区的内容,后果难以预料,非常Test函数中的str一直都是NULL危险strcpy str,hello world;将使程序崩溃因为free str;之后,str成为野指针,if str!=NULL语句不起作用char*GetMemoryvoid{
五、编写strcpy函数10分.char p[]=hello world;已知strcpy函数的原型是return p;char*strcpychar*strDest,constchar*strSrc;其中strDest是目的字符串,strSrc是源字符串1不调用C++/C的字符串库函数,请编写函数strcpychar*strcpychar*strDest,constchar*strSrc;assertstrDest!=NULL一strSrc!=NULL;〃2分char*address=//String的普通构造函strDest;数//2分String::String constcharwhile*strDest++=*strSrc++!=*str〃6分\0’〃2分NULL;if str==NULLreturnaddress;....//2分m_data=new char
[1];.//若能加NULL判断贝『更好2strcpy能把strSrc的内容复制到strDest,为*m_data=什么还要char*类型的返回值?;一答为了实现链式表达式,...//2分例如..int length=strlen strcpystrDest,“hello world;
六、else编写类String的构造函数、析构函数和赋值函数25分int length=strlenstr;已知类String的原型为..m_data=new charElength+1];//若class String能加NULL判断贝丁更好public:strcpym_data,str;Stringconstchar*str=NULL;//普通构造函数Stringconst String//拷贝构造函数other;.//拷贝构造函数String::Stringconst Stringother〃3分Stringvoid;{//析构函数int length=strlenother.m_data;Stringoperate=constm_data=newString other;//赋值函数char[1ength+1];//若能加NULLprivate:判断则更好..char*m_data;strcpym_data,other.m_data;.//用于保存李符串};//赋值函数请编写String的上述4个函数StringString::operate=const String标准答案other//13分//String的析构函数//1检查自赋.String::^Stringvoid值〃3分.//4分|delete口return*this;〃文章来源草根IT网www.caogenit.com//由于m_data是内部数据类型,也可以写成deletem_data;m_data;ifthis==other//2释放原有的内存资destructin.CBas.class源.〃3分D.constructin.CSu.class.delete[]m_data;constructin.CBas.classdestructin.CBas.class〃3分配新的内存资源,并复制内容destructin.CSu.class//3分
4.在一个cpp文件里面,定义int length=strlenother.m_data;了一个static类型的全局变m_data=new量,下面一个正确的描述是char[length+l];//若能力口A.只能在该cpp所在的编译模NULL判断则更好块中使用该变量strcpym_data,other.m_data;B.该变量的值是不可改变的.//4应回本对象的引C.该变量不能在类的成员函数中引用用.〃3分D.这种变量只能是基本类型如int,char不能是C++类型return*this;
5.观察下面一段代码clas.ClassA{public:一・・单选题每题4分,15题,共60分virtua..ClassA{};virtua.voi.FunctionAO{};;
1.考虑函数原型voi.helloin.a,in.b=7,char.pszO”clas.ClassB{public:*”,下面的函数调用钟,属于不合法调用的是.hello
5.virtua.voi.FunctionBO{};};B.hello5,
8.C.hello6,vclas.Class..publi.ClassA,publi.ClassBpublic:};#”.D.hello0,0,#ClassC aObject;
2.下面有关重载函数的说法中正确的是ClassA*pA=aObject;A.重载函数必须具有不同的返回值类型.B,重载函数形参个ClassB*pB=aObject;数必须不同ClassC*pC=aObject;C.重载函数必须有不同的形参列表.D.重载关于pA,pB,pC的取值,下面的描述中正确的是函数名可以不同A.pA,pB,pC的取值相同.
3.分析一下程序的运行结果B.pC=pA+pB#includeiostream.hC.pA和pB不相同clas.CBaseD.pC不等于pA也不等于pB
6.参照
1.5的代码,假设定义了ClassA*pA2,下面正确的代public:码是CBase{cout constructin.CBas.classv endl;}A.pA2=static_castClassA*pB;CBase{cout^destructin.CBas.class^endl;};B.void*pVoid=static_castvoid*pB;clas.CSu..publi.CBase pA2=static_castClassA*pVoid;public:C.pA2=pB;CSub{cout〈constructin.CSu.class^endl;}~CSub D.pA2=static_castClassA*static_castClassC*pB;{cout〈destructin.CSu.class^endl;};
7.参照
1.5的代码,下面那一个语句是不安全的voi.mainA.delete pAB.delete pBC.delete pCCSu.obj;
8.下列程序的运行结果为#includeiostream.hvoid mainA.constructin.CSu.class.B.constructin.CBas.class constructin.CBas.class.con{structin.CSu.classint a=2;destructin.CSu.class.dint b=++a;estructin.CBas.classcouta/6endl;destructin.CBas.class.deiJstructin.CSu.classA.
0.5B.0CO.7D.
0.6666666-C.constructin.CBas.class
9.有如下一段代码constructin.CSu.class#define ADDx,y x+ydestructin.CSu.classint m=3;m+=m*ADDm,m;返回1;若单词遇文件尾,已无单词可读时,则返回
0.则m的值为ttinclude stdio.h ttincludemalloc.h^include ctype.hA.15B.12C.18D.58ttinclude string.h
10.如下是一个带权的图,图中结点A到结点D的关键路径ttdefine SOURCE_FILE text,in”的长度是ttdefine OUTPUTSILE“word,out”ttdefine MAX_WORD_LEN128typedef struct treenode{A.13B.15C.28D.
5811.下面的模板声明中,正确的是char szWord[MAX_WORD^LEN];int nCount;A.templatetypename Tl,T2struct treenode*pLeft;B.templateclass Tl,T2structtreenode*pRight;C.templateclass Tl,class T2}BNODE;D.templatetypename T1;typename T2int getwordFILE*pFile,char*pasWordBuffer,int
12.在Windows编程中下面的说法正确的是nBufferLen;A.两个窗口,他们的窗口句柄可以是相同的B.void binary_treeBNODE**ppNode,char*pszWord两个窗口,他们的处理函数可以是相同的C.两个窗口,他们的窗口句柄和窗口处理函数都不可以相同.ifppNode!=NULLpszWord!=NULL
13.下面哪种情况下,B不能隐式转换为ABNODE*pCurrentNode=NULL;A.class B:public A{BNODE*pMemoNode=NULL;B.class A:public B{}int nStrCmpRes=0;C.class B{operator A;}1;pCurrentNode=*ppNodeD.classA{A constB;}whilepCurrentNode
14.某公司使用包过滤防火墙控制进出公司局域网的数据,{在不考虑使用代理服务器的情况下,下面描述错误的是”/*寻找插入位置*/该防火墙能够”.nStrCmpRes=strcmp pszWord,2A.使公司员工只能访问Internet上与其业务联系的公司的___;pCurrentNode-nCount if!nStrCmpRes IP地址.___3;pCurrentNode-nCount++return;B.仅允许HTTP协议通过,不允许其他协议通过,例如TCP/UDP.else{C.使员工不能直接访问FTP服务器端口号为21的FTP地址.___4___;pMemoNode=pCurrentNodeD.仅允许公司中具有某些特定IP地址的计算机可以访问外pCurrentNode=nStrCmpRes0pCurrentNode-pRight:部网络pCurrentNode-pLeft;
15.数字字符0的ASCH值为48,若有以下程序main}}}pCurrent=new BNODE;chara=1,b=2;ifpCurrentNode!=NULL{printf%c,”,b++;memsetpCurrentNode,0,sizeofBNODE;printf%d\n,b-a;strncpy pCurrentNode-szWord,pszWord,MAX_WORD_LE N-l;}pCurrentNode-nCount=l;程序运行之后的输出结果是}A.3,2B.50,2C.2,2D.2,50if pMemoNode==NULL二.填空题共40分___5___;*ppNode=pCurrentNode本程序从正文文件text,in读入一篇英文短文,统计该短文else ifnStrCmpRes0中不同单词和它的出现次数,并按词典编辑顺序将单词及它pMemoNode-pRight=pCurrentNode;的出现次数输出到正文文件word,out中.else程序用一棵有序二叉树存储这些单词及其出现的次数,一pMemoNode-pLef t=pCurrentNode;边读入一边建立.然后中序遍历该二叉树,将遍历经过的二叉树上的节点的内容输出.}程序中的外部函数void midorderFILE*pFile,BNODE*pNode intgetwordFILE*pFile,char*pszWordBuffer,int if___6___return;!pNode||IpFilenBufferLen;midorder pFile,pNode-pLeft;从与pFile所对应的文件中读取单词置入pszWordBuffer,并fprintf pFile,%s%d\n,,pNode-szWord,pNode-n Count;midorderpFile,pNode-〉pRight;}voidmain{FILE*pFile=NULL;BNODE*pRootNode=NULL;char szWord[MAX_WORD_LEN]={0};pFile=fopenSOURCE_FILE,r”;if pFile==NULL printfC Cant openfile%s\n,,SOURCE_FILE;return;}while getwordpFile,szWord,MAX WORDLEN==1binary_tree_____7___;//pRootNode,szWordfclosepFile;pFile=fopenOUTPUT_FILE,w;midorderpFile,pRootNode;fclose pFile;三.附加题每题30分,2题,共60分
1...从程序健壮性进行分析,下面的FillUserlnfo函数和Main函数分别存在什么问题?^include iostreamttincludestringttdefine MAX_NAME LEN20struct USERINFOint nAge;char szName[MAX_NAME_LEN];;void FillUserlnfoUSERINFO*parUserlnfo stu::cout«,,请输入用户的个数”;int nCount=0;std::cinnCount;forint i=0;inCount;i++std::cout〈”请输入年龄”;std::cinparUserInfo[i]-nAge;std::string strName;std::cout«^请输入姓名”;std::cinstrName;strcpyparUserlnfo[i].szName,strName.c_str;}}int mainintargc,char*argv[]USERINFO arUserInfos
[100]={0};FillUserlnfoarUserlnfos;printfn Thefirst nameis:;printf arUserlnfos
[0].szName;printf\n;return0;。
个人认证
优秀文档
获得点赞 0