您好,欢迎访问三七文档
一、请填写BOOL,float,指针变量与“零值”比较的if语句。(10分)提示:这里“零值”可以是0,0.0,FALSE或者“空指针”。例如int变量n与“零值”比较的if语句为:if(n==0)if(n!=0)以此类推。请写出BOOLflag与“零值”比较的if语句:标准答案:if(flag)if(!flag)如下写法均属不良风格,不得分。if(flag==TRUE)if(flag==1)if(flag==FALSE)if(flag==0)请写出floatx与“零值”比较的if语句:标准答案示例:constfloatEPSINON=0.00001;if((x=-EPSINON)&&(x=EPSINON)不可将浮点变量用“==”或“!=”与数字比较,应该设法转化成“=”或“=”此类形式。如下是错误的写法,不得分。if(x==0.0)if(x!=0.0)请写出char*p与“零值”比较的if语句:标准答案:if(p==NULL)if(p!=NULL)如下写法均属不良风格,不得分。if(p==0)if(p!=0)if(p)if(!)二、以下为WindowsNT下的32位C++程序,请计算sizeof的值(10分)charstr[]=“Hello”;char*p=str;intn=10;sizeof(str)=6sizeof(p)=4sizeof(n)=4voidFunc(charstr[100]){请计算sizeof(str)=4}void*p=malloc(100);请计算sizeof(p)=4三、简答题(25分)1、头文件中的ifndef/define/endif干什么用?防止该头文件被重复引用2、#includefilename.h和#include“filename.h”有什么区别?答:对于#includefilename.h,编译器从标准库路径开始搜索filename.h对于#include“filename.h”,编译器从用户的工作路径开始搜索filename.h3、const有什么用途?(请至少说明两种)答:(1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”声明?答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。5、请简述以下两个for循环的优缺点for(i=0;iN;i++){if(condition)DoSomething();elseDoOtherthing();}//第二个if(condition){for(i=0;iN;i++)DoSomething();}else{for(i=0;iN;i++)DoOtherthing();}优点:程序简洁缺点:多执行了N-1次逻辑判断,并且打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。优点:循环的效率高缺点:程序不简洁四、有关内存的思考题(20分)voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,helloworld);printf(str);}请问运行Test函数会有什么样的结果?答:程序崩溃,getmemory中的malloc不能返回动态内存,free()对str操作很危险博主:getmemory中p是形参,是一个指针变量,getmemory(str)调用后,传入的是指针变量保存的对象地址,p=(char*)malloc(100)实际上是把申请的动态内存空间的首地址付给p指向的地址(即str指向的地址null),这个是错误的。应该修改成指向指针的指针voidgetmemory(char**p),这样malloc返回的地址付给*p(即str变量本身)。char*GetMemory(void){charp[]=helloworld;returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}请问运行Test函数会有什么样的结果?答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原现的内容已经被清除,新内容不可知。RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的,打印的应该是str的地址VoidGetMemory2(char**p,intnum){p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,hello);printf(str);}请问运行Test函数会有什么样的结果?答:(1)能够输出hello(2)内存泄漏voidTest(void){char*str=(char*)malloc(100);strcpy(str,“hello”);free(str);if(str!=NULL){strcpy(str,“world”);printf(str);}}请问运行Test函数会有什么样的结果?答:篡改动态内存区的内容,后果难以预料,非常危险。因为free(str);之后,str成为野指针,if(str!=NULL)语句不起作用。五、已知strcpy函数的原型是char*strcpy(char*strDest,constchar*strSrc);其中strDest是目的字符串,strSrc是源字符串。(1)不调用C++/C的字符串库函数,请编写函数strcpy答:char*my_strcpy(char*strdest,constchar*strsrc){assert(strdest!=NULL)&&(strsrc!=NULL))char*address=strdest;while((*strdest++=*strsrc++)!=NULL)returnaddress;}(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?答:为了实现链式表达式。//2分例如intlength=strlen(strcpy(strDest,“helloworld”));六、编写类String的构造函数、析构函数和赋值函数(25分)已知类String的原型为:classString{public:String(constchar*str=NULL);//普通构造函数String(constString&other);//拷贝构造函数~String(void);//析构函数String&operate=(constString&other);//赋值函数private:char*m_data;//用于保存字符串};请编写String的上述4个函数。//普通构造函数String::String(constchar*str){if(str==NULL){m_data=newchar[1];//得分点:对空字符串自动申请存放结束标志'\0'的空//加分点:对m_data加NULL判断*m_data='\0';}else{intlength=strlen(str);m_data=newchar[length+1];//若能加NULL判断则更好strcpy(m_data,str);}}//String的析构函数String::~String(void){delete[]m_data;//或deletem_data;}//拷贝构造函数String::String(constString&other)//得分点:输入参数为const型{intlength=strlen(other.m_data);m_data=newchar[length+1];//加分点:对m_data加NULL判断strcpy(m_data,other.m_data);}//赋值函数String&String::operate=(constString&other)//得分点:输入参数为const型{if(this==&other)//得分点:检查自赋值return*this;delete[]m_data;//得分点:释放原有的内存资源intlength=strlen(other.m_data);m_data=newchar[length+1];//加分点:对m_data加NULL判断strcpy(m_data,other.m_data);return*this;//得分点:返回本对象的引用}编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。voidResetTheTime(int*year,int*month,int*date,int*hour,int*minute,int*second){intdayOfMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};if(*year0||*month1||*month12||*date1||*date31||*hour0||*hour23||*minute0||*minute59||*second0||*second60)return;if(*year%400==0||*year%100!=0&&*year%4==0)dayOfMonth[1]=29;if(*second=60){*second=0;*minute+=1;if(*minute=60){*minute=0;*hour+=1;if(*hour=24){*hour=0;*date+=1;if(*datedayOfMonth[*month-1]){*date=1;*month+=1;if(*month12){*month=1;*year+=1;}}}}}return;}1.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈2.static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域不能做switch()的参数类型是:switch的参数不能为实型。如何引用一个已经定义过的全局变量?答:extern可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?答:可以,在不同的C文件中以static形式来声明同名全局变量。可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错char*ss=0123456789;sizeof(ss)结果4===》ss是指向字符串常量的字符指针,sizeof获得的是一个指针的之所占的空间,应该是长整型的,所以是4sizeof(*ss)结果1===》*ss是第一个字符其实就是获得了字符串的第一位'0'所占的内存空间,是char类型的,占了1位请找出下面代码中的所以错误说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”1、#includestring.h2、main()3、{4、
本文标题:C软件工程师笔试题
链接地址:https://www.777doc.com/doc-2908686 .html