迅雷2007面试题
1.下列程序的输出结果为:(B)
#include﹤iostream.h﹥
voidmain()
{
char*a[]={"hello","the","world"};
char**pa=a;
pa++;
cout﹤﹤”*pa﹤﹤endl;
}
A)theworldB)theC)elloD)ellotheworld
2.已知二叉树后序遍历序列是bfegcda,中序遍历序列是badefcg,它的前序遍历序列是:(B)
A)abcdefgB)abdcefgC)adbcfegD)abecdfg
3.栈和队列的共同特点是:(C)
A)都是先进先出B)都是先进后出
C)只允许在短点处插入和删除元素D)没有共同点
4.下面程序的运行结果为:(A)
#include﹤iostream.h﹥
voidmain()
{span﹥
inta,x;
for(a=0,x=0;a﹤=1&&!x++;a++)
{
a++;
}
cout﹤﹤a﹤﹤x﹤﹤endl;
}
A)21B)22C)32D)41
5.下列选项,不正确的是:(B)while后没有分号
A)for(inta=1;a﹤=10;a++);
B)inta=1;
do
{
a++;
}while(a﹤=10)
C)inta=1;
while(a﹤=10)
{
a++;
}
D)for(inta=1;a﹤=10;a++)a++;
6.下面关于数组的初始化正确的是:(B)
A)charstr[2]={“a”,”b”};
B)charstr[2][3]={“a”,”b”}
;
C)charstr[2][3]={{‘a’,’b’},{‘e’,’d’},{‘e’,’f’}};
D)charstr[]={“a”,“b”};
7.下列说法正确的是:(B)
A)内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方
B)内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方
C)类的内联函数必须在类体内定义
D)类的内联函数必须在类体外通过关键字inline定义
8.下面对静态成员的描述中,正确的是:(D)
A)静态数据成员可以在类体内初始化
B)静态数据成员不可以被类的对象调用
C)静态数据成员不能受private控制符的作用
D)静态数据成员可以直接用类名调用
9.下列运算符中,在C++语言中不能重载的是:(C)
A)*B)﹥=C)::D)delete
10下面关于多态性的描述,错误的是:
"﹥(C)
A)C++语言的多态性分为编译时的多态性和运行时的多态性
B)编译时的多态性可通过函数重载实现
C)运行时的多态性可通过模板和虚函数实现//模板的是编译时多态性,而虚函数是运行时
D)实现运行时多态性的机制称为动态绑定
11.如果进栈序列为e1,e2,e3,e4,e5,则可能的出栈序列是:(D)
A)e3,e2,e5,e4,e1
B)e2,e3,e5,e4,e1
C)e3,e2,e4,e5,e1
D)以上都有可能
12下面关于类和对象的描述中,错误的是:(A)
A)类就是C语言中的结构体类型,对象就是C语言中的结构体变量
B)类和对象之间的关系是抽象和具体的关系
C)对象是类的实例,一个对象必须属于一个已知的类
D)类是具有共同行为的若干对象的统一描述体
13.下面关于数组的描述错误的是:(D)
A)在C++语言中数组的名字就是指向该数组第一个元素的指针
B)长度为n的数组,下标的范围是0-n-1
C)数组的大小必须在编译是确定
D)数组只能通过值参数和引用参数两种方式传递给函数
注释:
在把数组作为参数传递给函数时,有值传递(byvalue)和地址传递(byreference)两种方式。
在值传递方式中,要在数组参数的尾部加上一对方括号([]),调用函数时只需将数组的地址(即数组名)传递给函数。
例如:如果数组x被声明为:intx[10];
那麽函数被说明为:voidbyval_func(int[]);
参数int[]告诉编译程序byval_func()函数只有一个参数,即一个由int型值组成的数组。函数调用时只需将数组名传递给函数:byval_func(x);
#include﹤stdio.h﹥
voidbyval_func(int[]);
voidmain(void);
voidmain(void)
{
intx[10];
inty;
for(y=0;y﹤10;y++)
x[y]=y;
byval_func(x);
}
voidbyal_func(inti[])
{
inty;
for(y=0;y﹤10;y++)
printf("%d\n",i[y]);
﹥}
在值传递方式中,数组x将被复制一份,复制所得的数组将被存放在栈中,然后由byval_func()函数接收并打印出来。由於传递给byval_func()函数的是初始数组的一份拷贝,因此在byval_func()函数内部修改传递过来的数组对初始数组没有任何影响。
值传递方法的开销是很大的,因为首先它要完整地复制初始数组并将这份拷贝存放到栈中,这将耗费相当可观的运行时间,因而值传递方法效率较低;其次,初始化数组的拷贝需要占用额外的内存空间(栈中的内存);最后,编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。
地址传递方法克服了值传递方法的缺点。在地址传递方法中,传递给函数的是指向初始数组的指针,不用复制数组,因此程序变得简练,也节省了栈中的内存空间。在地址传递过程中,只需在函数原形中将函数的参数说明为指向数组元素数据类型的一个指针。
例如同样定义一个数组x:intx[10];
那麽函数被说明为:intconst_funt(constint*);
参数constint*告诉编译程序const_funt()函数只有一个参数,即指向一个int类型常量的指针。
函数调用时只需将数组的地址传递给函数:const_func(x);
#include﹤stdio.h﹥
voidconst_func(constint*);
voidmain(void);
voidmain(void)
{
intx[10];
inty;
for(y=0;y﹤10;y++)
x[y]=y;
constl_func(x);
}
voidconst_func(constint*i)
{
inty;
for(y=0;y﹤10;y++)
printf("%d\n",*(i+y));
}
在值传递方式中,没有复制初始数组并将其拷贝存放在栈中,const_func()函数只接收到指向一个int类型常量的指针,因此在编写程序时要保证传递给const_func()函数的是指向一个由int类型常量组成的数组的指针。const修饰符的作用是防止意外修改初始数组中的某一个元素。
14.引用标准库时,下面的说法你认为哪个是正确的:(B)
A)语句#include“stdlib.h”是正确的,但会影响程序的执行速度
B)语句#include﹤stdlib.h﹥是正确的,而去程序执行速度比#include“stdlib.h”要快
C)语句#include﹤stdlib.h﹥和#include“stdlib.h”都是正确的,
程序执行速度没有区别
D)语句#include“stdlib.h”是错误的
注释:include""是先从本地目录开始寻找,然后去寻找系统路径,而Include﹤﹥相反先从系统目录,后从本地目录,
15.设a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a﹥b)&&(n=c﹥d)运算后,n的值为:(C)
A)0B)1C)2D)7
16.不能作为重载函数的调用的依据是:(C)
A)参数个数B)参数类型
C)函数类型D)函数名称
17.下列程序的输出结果为:(D)
#include﹤iostream.h﹥
intfunc(intn)
{
if〔n﹤1)return1;
elsereturnn+func(n-1);
return0;
}
voidmain()
{
cout﹤﹤func(5)﹤﹤endl;
}
A)0B)10C)15D)16
18.建立派生类对象时,3种构造函数分别是a(基类的构造函数)、b(成员对象的构造函数)、c(派生类的构造函数)这3种构造函数的调用顺序为:(A)
A)abcB)acb
C)cabD)cba
19.如果友元函数重载一个运算符时,其参数表中没有任何参数则说明该运算符是:(D)
A)一元运算符B)二元运算符
C)选项A)和选项B)都可能D)重载错误
解析:C++中用友元函数重载运算符至少有一个参数,重载一目运算符要有一个参数,重载二目运算符要有两个参数。
20.有以下程序段:(D)?
#defineF(X,Y)(X)--;(Y)++(X)*(Y);
…
inti,a=3,b=4;
for(i=0;i﹤5;i++)F(a,b)
printf(“%d,%d”,a,b);
输出结果是:()
A)3,4B)3,5
C)-2,5D)-2,9
21.下列for循环的循环体执行次数为:(A)
for(inti(10),j(1);i=j=0;i++,j--)
A)0;B)1;C)无限;D)以上都不对
22.下面程序的输出结果是(D)
char*p1=“123”,*p2=“ABC”,str[50]="xyz";
strcpy(str+2,strcat(p1,p2));
cout﹤﹤str;
A)xyz123ABCB)z123ABC
C)xy123ABC D)出错
23.下面函数的执行结果是输出(B)
charstr[]=“xunlei”;
char*p=str;
intn=10;
printf(“%d,%d,%d\n”,sizeof(str),sizeof(p),sizeof(n));
A)4,4,4B)7,4,4
C)6,4,4D)6,6,4
33.有下列程序段:
char*p,*q;
p=(char*)malloc(sizeof(char)*20);
q=p;
scanf(“%s%s”,p,q);
printf(“%s%s\n”,p,q);
若从键盘输入:abcdef,则输出结果是(A)
A)defdefB)abcdef
C)abcdD)dd
解析:q=p;因此p,q指向的是同一段内存.scanf先是把abc写到p指向的空间,再把def写到q指向的空间,也就是同一段空间,因此abc被def覆盖了.
34.现在有以下语句:
struct_THUNDER{
intiVersion;
charcTag;
charcAdv;﹤BR﹥intiUser;
charcEnd;
}Thunder;
intsz=sizeof(Thunder);
则执行后,变量sz的值将得到(D)
A)11B)12C)13D)16
35.有如下程序段:
voidGetMemeory(char*p)
{
p=(char*)malloc(100);
}
voidtest()
{
char*str=NULL;
GetMemory(str);
strcpy(str,”Thunder”);
strcat(str+2,“Downloader”);
printf(str);
}
请问运行Test函数结果是:(D)
A)ThunderDownloaderB)underDownloader
C)ThunderownloaderD)程序崩溃
解析:在函数中给指针分配空间,实际上是给指针的临时变量分配空间,函数结束后,这个临时变量也消亡,而str仍然为NULL,没有为其分配空间,此时strcpy()是肯定会出错的。
36.函数调用exec((v1,v2),(v3,v4,v5),v6,v7);中,实参的个数是(A)
A)4B)5C)6D)7
37.p是指向类X的成员m的指针,s是类X的一个对象。现要给m赋值,(C)是正确的。
A)s.p=5B)s-﹥p=5
C)s.*p=5D)*s.p=5
38.函数fun(char*p){returnp;}的返回值是(B)
A)无确切值B)行参p中存放的地址值
C)一个临时存储单元的地址D)行参p自身的地址值
39.a,b均为不等于0的整形变量,以下关系式恒成立的是:(C)
A)a*b/a*b==1 B)a/b*b/a==1
C)a/b*b+a%b==aD)a/b*b==a
40.设有如下说明:
typedefstructST{longa;intb;charc[2];}NEW;
则下面叙述中正确的是:(C)
A)以上的说明形式非法B)ST是一个结构体类型
C)NEW是一个结构体类型D)NEW是一个结构体变量
41.下列表达式正确的是:(C)
A)9++B)(x+y)++C)c+++c+++c++D)++(a-b--)
42.在intb[][3]={{1},{3,2},{4,5,6},{0}};中,sizeof(b)=(D)。
A)4B)12C)28D)48
43.以下程序的输出结果是:(D)
#defineM(x,y,z)x*y+z
main()
{
inta=1,b=2,c=3;
printf(“%d\n”,M(a+b,b+c,c+a));
}
A)19B)17C)15D)12
44.若有以下定义和语句:
intu=010,v=0x10,w=10;
printf(“%d,%d,%d\n”,u,v,w);
则输出结果是:(A)
A)8,16,10B)10,10,10C)8,8,10D)8,10,10
45.下面程序段的输出结果是:(B)
inta=5,b=4,c=3,d=2;
if(a﹥b﹥c)
printf(“%d\n”,d);
elseif((c-1﹥=d)==1)
printf(“%d\n”,d+1);
else
printf(“%d\n”,d+1);
A)2B)3C)4D)编译错误
46.有如下程序段,
请问k的值是:(D)
enum{a,b=5,c,d=4,e}k;k=c;
A)3B)4C)5D)6
47.有如下程序段:
inti,n=0;
doublex=1,y1=2.1/1.9,y2=1.9/2.1;
for(i=1;i﹤22;i++)
x=x*y1;
while(x!=1.0)
{
x=x*y2;
n++;
}
printf(“%d\n”,n);
请问执行结果是:(A)
A)21B)22C)无限循环D)程序崩溃
48.用树形结构表示实体之间联系的模型是(C)
A)关系模型B)网状模型C)层次模型D)以上三个都是
49.有如下程序段:
charfun(char*);
main()
{
char*s=“one”,a[5]={0},(*f1)(char*)=fun,ch;
}
则对函数fun的调用语句正确的是(C)
A)*f1(&a);B)f1(*s);C)f1(&ch)D)ch=*f1(s);要改成(*f1)(s)才正确
50.有如下程序段:
intc=23;
printf(“%d\n”,c&c);
请问执行结果是:(C)
A)0B)46C)23D)以上都不对