CC++程序员应聘常见面试题.docx

上传人:you****now 文档编号:61506395 上传时间:2022-11-21 格式:DOCX 页数:16 大小:46.16KB
返回 下载 相关 举报
CC++程序员应聘常见面试题.docx_第1页
第1页 / 共16页
CC++程序员应聘常见面试题.docx_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《CC++程序员应聘常见面试题.docx》由会员分享,可在线阅读,更多相关《CC++程序员应聘常见面试题.docx(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C/C+程序序员应聘聘常见面面试题作者:宋宋宝华 发布时时间:220066-2-20 13:43:21 | 【字字体:大大中小】 1.引言 本本文的写写作目的的并不在在于提供供C/CC+程程序员求求职面试试指导,而而旨在从从技术上上分析面面试题的的内涵。文中的的大多数数面试题题来自各各大论坛坛,部分分试题解解答也参参考了网网友的意意见。许多多面试题题看似简简单,却却需要深深厚的基基本功才才能给出出完美的的解答。企业要要求面试试者写一一个最简简单的sstrccpy函函数都可可看出面面试者在在技术上上究竟达达到了怎怎样的程程度,我我们能真真正写好好一个sstrccpy函函数吗?我们都都觉得自自己能

2、,可可是我们们写出的的strrcpyy很可能能只能拿拿到100分中的的2分。读者可可从本文文看到sstrccpy函函数从22分到110分解解答的例例子,看看看自己己属于什什么样的的层次。此外,还还有一些些面试题题考查面面试者敏敏捷的思思维能力力。 分析析这些面面试题,本本身包含含很强的的趣味性性;而作作为一名名研发人人员,通通过对这这些面试试题的深深入剖析析则可进进一步增增强自身身的内功功。2.找找错题试题题1:void test1()char string10;char* str1 = 0123456789;strcpy( string, str1 );试题题2:void test2()ch

3、ar string10, str110;int i;for(i=0; i10; i+)str1i = a;strcpy( string, str1 );试题题3:void test3(char* str1)char string10;if( strlen( str1 ) = 10 )strcpy( string, str1 );解答答:试题11字符串串strr1需要要11个个字节才才能存放放下(包包括末尾尾的0),而而strringg只有110个字字节的空空间,sstrccpy会会导致数数组越界界;对试题题2,如如果面试试者指出出字符数数组sttr1不不能在数数组内结结束可以以给3分分;如果果

4、面试者者指出sstrccpy(strringg, sstr11)调用用使得从从strr1内存存起复制制到sttrinng内存存起所复复制的字字节数具具有不确确定性可可以给77分,在在此基础础上指出出库函数数strrcpyy工作方方式的给给10分分;对试题题3,iif(sstrllen(strr1) = 10)应改为为if(strrlenn(sttr1) = - EPSINON) & (x =”或“=”形式。如果写成if (x = 0.0),则判为错,得0分。试题2:以下为Windows NT下的32位C+程序,请计算sizeof的值void Func ( char str100 )sizeof

5、( str ) = ?void *p = malloc( 100 );sizeof ( p ) = ?解答答:sizeof( str ) = 4sizeof ( p ) = 4剖析析:Funnc ( chhar strr1000 )函数数中数组组名作为为函数形形参时,在在函数体体内,数数组名失失去了本本身的内内涵,仅仅仅只是是一个指指针;在在失去其其内涵的的同时,它它还失去去了其常常量特性性,可以以作自增增、自减减等操作作,可以以被修改改。数组名名的本质质如下:(11)数组组名指代代一种数数据结构构,这种种数据结结构就是是数组;例例如:char str10;cout sizeof(str) e

6、ndl;输出出结果为为10,sstr指指代数据据结构ccharr100。(22)数组组名可以以转换为为指向其其指代实实体的指指针,而而且是一一个指针针常量,不不能作自自增、自自减等操操作,不不能被修修改;char str10; str+; /编译出错,提示str不是左值(33)数组组名作为为函数形形参时,沦沦为普通通指针。WWinddowss NTT 322位平台台下,指指针的长长度(占占用内存存的大小小)为44字节,故故sizzeoff( sstr ) 、sizzeoff ( p ) 都为为4。试题题3:写写一个“标标准”宏宏MINN,这个个宏输入入两个参参数并返返回较小小的一个个。另外外,

7、当你你写下面面的代码码时会发发生什么么事?least = MIN(*p+, b);解答答:#define MIN(A,B) (A) = (B) ? (A) : (B)MIIN(*p+, bb)会产产生宏的的副作用用剖剖析:这个个面试题题主要考考查面试试者对宏宏定义的的使用,宏宏定义可可以实现现类似于于函数的的功能,但但是它终终归不是是函数,而而宏定义义中括弧弧中的“参参数”也也不是真真的参数数,在宏宏展开的的时候对对“参数数”进行行的是一一对一的的替换。程程序员对对宏定义义的使用用要非常常小心,特特别要注注意两个个问题:(11)谨慎慎地将宏宏定义中中的“参参数”和和整个宏宏用用括括弧括起起来。

8、所所以,严严格地讲讲,下述述解答:#define MIN(A,B) (A) = (B) ? (A) : (B)#define MIN(A,B) (A = B ? A : B )都应应判0分分;(2)防防止宏的的副作用用。宏定义义#deefinne MMIN(A,BB) (A) = (BB) ? (AA) : (BB)对对MINN(*pp+, b)的作用用结果是是:(*p+) = (b) ? (*pp+) : (*pp+)这个表表达式会会产生副副作用,指指针p会会作三次次+自自增操作作。除此之之外,另另一个应应该判00分的解解答是:#define MIN(A,B) (A) = (B) ? (A)

9、 : (B); 这个个解答在在宏定义义的后面面加“;”,显显示编写写者对宏宏的概念念模糊不不清,只只能被无无情地判判0分并并被面试试官淘汰汰。试题44:为什什么标准准头文件件都有类类似以下下的结构构? #ifndef _INCvxWorksh#define _INCvxWorksh #ifdef _cplusplusextern C #endif /*.*/ #ifdef _cplusplus#endif #endif /* _INCvxWorksh */解答答:头文文件中的的编译宏宏#ifndef_INCvxWorksh#define_INCvxWorksh#endif 的作作用是防防止被重

10、重复引用用。作为一一种面向向对象的的语言,CC+支支持函数数重载,而而过程式式语言CC则不支支持。函函数被CC+编编译后在在symmboll库中的的名字与与C语言言的不同同。例如如,假设设某个函函数的原原型为: void foo(int x, int y);该函函数被CC编译器器编译后后在syymbool库中中的名字字为_ffoo,而而C+编译器器则会产产生像_fooo_innt_iint之之类的名名字。_fooo_innt_iint这这样的名名字包含含了函数数名和函函数参数数数量及及类型信信息,CC+就就是考这这种机制制来实现现函数重重载的。为了了实现CC和C+的混混合编程程,C+提供供了C

11、连连接交换换指定符符号exxterrn C来来解决名名字匹配配问题,函函数声明明前加上上extternn CC后,则则编译器器就会按按照C语语言的方方式将该该函数编编译为_fooo,这样样C语言言中就可可以调用用C+的函数数了。试题题5:编编写一个个函数,作作用是把把一个ccharr组成的的字符串串循环右右移n个个。比如如原来是是“abbcdeefghhi”如如果n=2,移移位后应应该是“hhiabbcdeefghh” 函数数头是这这样的:/pStr是指向以0结尾的字符串的指针/steps是要求移动的nvoid LoopMove ( char * pStr, int steps )/请填充.解

12、答答:正确解解答1:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = 0;strcpy( pStr, tmp );正确确解答22:void LoopMove ( char *pStr, int steps )int n = strlen( pStr ) - steps;char tmpMAX_LEN; me

13、mcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); 剖析析:这个试试题主要要考查面面试者对对标准库库函数的的熟练程程度,在在需要的的时候引引用库函函数可以以很大程程度上简简化程序序编写的的工作量量。最频繁繁被使用用的库函函数包括括:(11) sstrccpy(22) mmemccpy(33) mmemsset试题题6:已已知WAAV文件件格式如如下表,打打开一个个WAVV文件,以以适当的的数据结结构组织织WAVV文件头头并解析析WAVV格式的的各项信信息。WAAVE文文

14、件格式式说明表表偏移地址字节数数据类型内 容文件头 00H4 CharRIFF标志04H4int32文件长度08H4CharWAVE标志0CH4Charfmt标志10H4过渡字节(不定)14H2int16格式类别16H2int16通道数18H2int16 采样率(每秒样本数),表示每个通道的播放速度1CH4int32波形音频数据传送速率20H2int16数据块的调整数(按字节算的)22H2每样本的数据位数24H4Char数据标记符data28H4int32语音数据的长度解答答:将WAAV文件件格式定定义为结结构体WWAVEEFORRMATT: typedef struct tagWaveFor

15、mat char cRiffFlag4; UIN32 nFileLen; char cWaveFlag4; char cFmtFlag4; char cTransition4; UIN16 nFormatTag ; UIN16 nChannels; UIN16 nSamplesPerSec; UIN32 nAvgBytesperSec; UIN16 nBlockAlign; UIN16 nBitNumPerSample; char cDataFlag4; UIN16 nAudioLength; WAVEFORMAT;假设WAAV文件件内容读读出后存存放在指指针buuffeer开始始的内存存单元

16、内内,则分分析文件件格式的的代码很很简单,为为:WAVEFORMAT waveFormat;memcpy( &waveFormat, buffer,sizeof( WAVEFORMAT ) ); 直接接通过访访问waaveFFormmat的的成员,就就可以获获得特定定WAVV文件的的各项格格式信息息。剖析:试试题6考考查面试试者组织织数据结结构的能能力,有有经验的的程序设设计者将将属于一一个整体体的数据据成员组组织为一一个结构构体,利利用指针针类型转转换,可可以将mmemccpy、memmsett等函数数直接用用于结构构体地址址,进行行结构体体的整体体操作。 透过过这个题题可以看看出面试试者的

17、程程序设计计经验是是否丰富富。试题题7:编编写类SStriing的的构造函函数、析析构函数数和赋值值函数,已已知类SStriing的的原型为为:class String public: String(const char *str = NULL); / 普通构造函数 String(const String &other); / 拷贝构造函数 String(void); / 析构函数 String & operate =(const String &other); / 赋值函数 private: char *m_data; / 用于保存字符串 ;解答答:/普通构造函数String:String(

18、const char *str) if(str=NULL) m_data = new char1; / 得分点:对空字符串自动申请存放结束标志0的空/加分点:对m_data加NULL 判断*m_data = 0; elseint length = strlen(str); m_data = new charlength+1; / 若能加 NULL 判断则更好 strcpy(m_data, str); / String的析构函数String:String(void) delete m_data; / 或delete m_data;/拷贝构造函数String:String(const String

19、 &other) / 得分点:输入参数为const型 int length = strlen(other.m_data); m_data = new charlength+1; /加分点:对m_data加NULL 判断strcpy(m_data, other.m_data); /赋值函数String & String:operate =(const String &other) / 得分点:输入参数为const型 if(this = &other) /得分点:检查自赋值return *this; delete m_data; /得分点:释放原有的内存资源int length = strlen(

20、 other.m_data ); m_data = new charlength+1; /加分点:对m_data加NULL 判断strcpy( m_data, other.m_data ); return *this; /得分点:返回本对象的引用剖析析:能够准准确无误误地编写写出Sttrinng类的的构造函函数、拷拷贝构造造函数、赋值函函数和析析构函数数的面试试者至少少已经具具备了CC+基基本功的的60%以上!在在这个类类中包括括了指针针类成员员变量mm_daata,当当类中包包括指针针类成员员变量时时,一定定要重载载其拷贝贝构造函函数、赋赋值函数数和析构构函数,这这既是对对C+程序员员的基本

21、本要求,也也是EEffeectiiveC+中特特别强调调的条款款。仔细学学习这个个类,特特别注意意加注释释的得分分点和加加分点的的意义,这这样就具具备了660%以以上的CC+基基本功!试题8:请说出出staaticc和coonstt关键字字尽可能能多的作作用解答:sstattic关关键字至至少有下下列n个个作用:(11)函数数体内sstattic变变量的作作用范围围为该函函数体,不不同于aautoo变量,该该变量的的内存只只被分配配一次,因因此其值值在下次次调用时时仍维持持上次的的值;(22)在模模块内的的staaticc全局变变量可以以被模块块内所用用函数访访问,但但不能被被模块外外其它函函

22、数访问问;(3)在在模块内内的sttatiic函数数只可被被这一模模块内的的其它函函数调用用,这个个函数的的使用范范围被限限制在声声明它的的模块内内;(4)在在类中的的staaticc成员变变量属于于整个类类所拥有有,对类类的所有有对象只只有一份份拷贝;(55)在类类中的sstattic成成员函数数属于整整个类所所拥有,这这个函数数不接收收thiis指针针,因而而只能访访问类的的staaticc成员变变量。coonstt关键字字至少有有下列nn个作用用:(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;(2)

23、对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。例如:const classA operator*(const classA& a1,const classA& a2);opperaatorr*的返返回结果果必须是是一个cconsst对象象。如果果不是,这这样

24、的变变态代码码也不会会编译出出错:classA a, b, c;(a * b) = c; / 对a*b的结果赋值操作作(a * bb) = c显显然不符符合编程程者的初初衷,也也没有任任何意义义。剖析:惊惊讶吗?小小的的staaticc和coonstt居然有有这么多多功能,我我们能回回答几个个?如果果只能回回答12个,那那还真得得闭关再再好好修修炼修炼炼。这个题题可以考考查面试试者对程程序设计计知识的的掌握程程度是初初级、中中级还是是比较深深入,没没有一定定的知识识广度和和深度,不不可能对对这个问问题给出出全面的的解答。大多数数人只能能回答出出staaticc和coonstt关键字字的部分分功

25、能。44.技巧巧题试题11:请写写一个CC函数,若若处理器器是Biig_eendiian的的,则返返回0;若是LLitttle_enddiann的,则则返回11解解答:int checkCPU()union w int a;char b; c;c.a = 1;return (c.b = 1);剖析析:嵌入式式系统开开发者应应该对LLitttle-enddiann和Biig-eendiian模模式非常常了解。采用LLitttle-enddiann模式的的CPUU对操作作数的存存放方式式是从低低字节到到高字节节,而BBig-enddiann模式对对操作数数的存放放方式是是从高字字节到低低字节。例如

26、,116biit宽的的数0xx12334在LLitttle-enddiann模式CCPU内内存中的的存放方方式(假假设从地地址0xx40000开始始存放)为为:内存地址存放内容0x40000x340x40010x12而在在Bigg-enndiaan模式式CPUU内存中中的存放放方式则则为:内存地址存放内容0x40000x120x40010x34322bitt宽的数数0x11234456778在LLitttle-enddiann模式CCPU内内存中的的存放方方式(假假设从地地址0xx40000开始始存放)为为:内存地址存放内容0x40000x780x40010x560x40020x340x400

27、30x12而在在Bigg-enndiaan模式式CPUU内存中中的存放放方式则则为:内存地址存放内容0x40000x120x40010x340x40020x560x40030x78联合合体unnionn的存放放顺序是是所有成成员都从从低地址址开始存存放,面面试者的的解答利利用该特特性,轻轻松地获获得了CCPU对对内存采采用Liittlle-eendiian还还是Biig-eendiian模模式读写写。如果果谁能当当场给出出这个解解答,那那简直就就是一个个天才的的程序员员。试题22:写一一个函数数返回11+2+3+n的的值(假假定结果果不会超超过长整整型变量量的范围围) 解答答:int Sum( int n ) return ( (long)1 + n) * n / 2;/或return (1l + n) * n / 2;剖析析:对于这这个题,只只能说,也许最简单的答案就是最好的答案。下面的解答,或者基于下面的解答思路去优化,不管怎么“折腾”,其效率也不可能与直接return ( 1 l + n ) * n / 2相比! int Sum( int n )long sum = 0;for( int i=1; i=n; i+ )sum += i;return sum; 所以程程序员们们需要敏敏感地将将数学等等知识用用在程序序设计中中。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理手册

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁