C/C++笔试题

morusjin 2010-08-12

C/C++:

1.C与C++的异同,优劣;

2.C,C++,VC,BC,TC的区别;

3.C++中try…catch关键字的用法与优点;

4.枚举的用法,以及它与宏的区别;

5.const的用法,以及声明const变量与宏的区别;

const的用法有四种:

区别:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类型

安全检查。而且字符替换可能会带来料想不到的边界效应。

有些集成化工具可以对const常量进行调试,但不能对宏量进行调试。

6.C++中引用与指针的区别;

答:1引用实际上是所引用的对象或变量的别名,而指针是包含所指向对象或变量的地址的变量。

2引用在定义时必须初始化,而指针在定义时不初始化。

3不可以有努NULL的引用,而可以有指向NULL的指针。

4引用在初始化后不可以改变引用关系,而指针可以随时指向其他对象(非const指针)。

7.C++中virtual与inline的含义分别是什么?

答:在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。

inline与函数的定义体放在一起,使该函数称为内联。inline是一种用于实现的关键字,而不是用于声明的关键字。

虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。

内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数

的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。

一个函数能否即是虚函数又是内联函数?

8.以下关键字的含义与用法:

extern,extern“C”,static,explicit,register,#undef,#ifndef

9.什么是函数重载与覆盖?

为什么C不支持函数重载?

为什么C++能支持函数重载?

10.VC中,编译工具条内的Debug与Release选项是什么含义?

11.编写my_memcpy函数,实现与库函数memcpy类似的功能,不能使用任何库函数;

void*mymemcpy(void*pvTo,constchar*pvFrom,size_tsize)

{

assert((dest!=NULL)&&(src!=NULL));

byte*psTo=(byte*)pvTo;

byte*psFrom=(byte*)pvFrom;

while(size->0)

{

*psTo++=*psFrom++;

}

returnpvTo;

}

12.编写my_strcpy函数,实现与库函数strcpy类似的功能,不能使用任何库函数;

答:char*my_strcpy(char*strdest,constchar*strsrc)

{

assert(strdest!=NULL)&&(strsrc!=NULL))

char*address=strdest;

while((*strdest++=*strsrc++)!=NULL)

returnaddress;

}

13.编写gbk_strlen函数,计算含有汉字的字符串的长度,汉字作为一个字符处理;

已知:汉字编码为双字节,其中首字节<0,尾字节在0~63以外;(如果一个字节是-128~127)

14.函数assert的用法?

答:断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个

在任何系统状态下都可以安全使用的无害测试手段。

15.为什么在头文件的最前面都会看到这样的代码:

#ifndef_STDIO_H_

#define_STDIO_H_

16.为什么数组名作为参数,会改变数组的内容,而其它类型如int却不会改变变量的值?

答:当数组名作为参数时,传递的实际上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调

函数内部对形参的改变并不影响实参的值。

1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数。

2.写一个函数,将其中的\t都转换成4个空格。

3.Windows程序的入口是哪里?写出Windows消息机制的流程。

4.如何定义和实现一个类的成员函数为回调函数?

5.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。

6.C++里面如何声明constvoidf(void)函数为C程序中的库函数?

7.下列哪两个是等同的

intb;

Aconstint*a=&b;

Bconst*inta=&b;

Cconstint*consta=&b;

Dintconst*consta=&b;

8.内联函数在编译时是否做参数类型检查?

voidg(base&b){

b.play;

}

voidmain(){

sons;

g(s);

return;

}

3、WinMain

while((bRet=GetMessage(&msg,NULL,0,0))!=0)

{

if(bRet==-1)

{

//handletheerrorandpossiblyexit

}

else

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

MSRAInterviewWrittenExam(December2003,Time:2.5Hours)

1写出下列算法的时间复杂度。

(1)冒泡排序;

(2)选择排序;

(3)插入排序;

(4)快速排序;

(5)堆排序;

(6)归并排序;

2写出下列程序在X86上的运行结果。

structmybitfields

{

unsignedshorta:4;

unsignedshortb:5;

unsignedshortc:7;

}test

voidmain(void)

{

inti;

test.a=2;

test.b=3;

test.c=0;

i=*((short*)&test);

printf(”%d\n”,i);

}

3写出下列程序的运行结果。

unsignedinti=3;

cout<<i*-1;

4写出下列程序所有可能的运行结果。

inta;

intb;

intc;

voidF1()

{

b=a*2;

a=b;

}

voidF2()

{

c=a+1;

a=c;

}

main()

{

a=5;

//StartF1,F2inparallel

F1();F2();

printf(”a=%d\n”,a);

}

相关推荐