一、单选题
下列for循环的循环体执行次数为
for(int i=10, j=1; i=j=0; i++, j--)
A 0
B 1
C 无限
D 以上都不对
A
这个问题可以这样理解,在for(string1;string2;string3)中,string1用于设定循环变量处置,string2用于循环判断,string3用于改变循环变量到调节,一般情况下,我们采用逻辑判断表达式来决定循环是否执行,而如果在这里采用赋值语句,其逻辑值始终为假,导致循环不执行
下面程序的输出结果是
char *p1= “123”, *p2 = “ABC”, str[50]= "xyz";
strcpy(str+2,strcat(p1,p2));
cout << str;
A xyz123ABC
B z123ABC
C xy123ABC
D 出错
D
strcat(p1,p2)出错,因为p1只被分配了4个字节的地址空间,将p2拼接在p1后面会引起内存溢出。
下面函数的执行结果是输出
char str[ ] = “xunlei”;
char *p = str;
int n = 10;
printf(“%d, %d, %d/n”, sizeof(str), sizeof(p), sizeof(n));
A 4, 4, 4
B 7, 4, 4
C 6, 4, 4
D 6, 6, 4
B
指针和int、float类型均占4个字节,而sizeof(str)包括'\0'所以是7个字节
char *p, *q;
p = (char*) malloc(sizeof(char) * 20);
q = p;
scanf(“%s %s”, p, q);
printf(“%s %s/n”, p, q);
若从键盘输入:abc def, 则输出结果是
A def def
B abc def
C abc d
D d d
A
分析:q=p;因此p,q指向的是同一段内存.scanf先是把abc写到p指向的空间,再把def写到q指向的空间,也就是同一段空间,因此abc被def覆盖了。
现在有以下语句:
struct _THUNDER{
int iVersion;
char cTag;
char cAdv;
int iUser;
char cEnd;
}Thunder;
int sz = sizeof(Thunder);
则执行后,变量sz的值将得到
A 11
B 12
C 13
D 16
D
结构体默认对齐方式为8,则iVersion取4字节对齐,CTag、CAdv和cEnd取2字节对齐,结构体大小为14,14不为4的整数倍,补空字节,增至16时符合所有条件,则sizeof(Thunder)为16。
有如下程序段:
void GetMemeory(char* p)
{
p = (char*) malloc (100);
}
void test()
{
char *str=NULL;
GetMemory(str);
strcpy(str,”Thunder”);
strcat(str+2, “Downloader”);
printf(str);
}
请问运行Test函数结果是:
A Thunder Downloader
B under Downloader
C Thunderownloader
D 程序崩溃
D
分析:在函数中给指针分配空间,实际上是给指针的临时变量分配空间,函数结束后,这个临时变量也消亡,而str仍然为NULL,没有为其分配空间,此时strcpy()是肯定会出错的。
p是指向类X的成员m的指针,s是类X的一个对象。现要给m赋值,()是正确的。
A s.p = 5
B s->p = 5
C s.*p = 5
D *s.p = 5
C
函数
fun(char* p) {
return p;
}
的返回值是
A 无确切值
B 行参p中存放的地址值
C 一个临时存储单元的地址
D 行参p自身的地址值
B
分析:可参考找工作笔试面试那些事儿(3)---内存管理那些事,返回的是形参p中存放的地址值。
a,b均为不等于0的整形变量,以下关系式恒成立的是:
A a*b/a*b == 1
B a/b*b/a == 1
C a/b*b + a%b == a
D a/b*b == a
C
a/b得到的是去除余数后的值,再加上a%b取摸的值就等于a了,
选C
设有如下说明:
typedef struct ST{
long a; int b; char c[2];
} NEW;
则下面叙述中正确的是:
A 以上的说明形式非法
B ST是一个结构体类型
C NEW是一个结构体类型
D NEW是一个结构体变量
C
struct ST 等价于 NEW,为同一个结构类型
二、不定项选择
下列表达式中,不合法的是()
已知:double d = 3.2; int n = 3;
A d<<2;
B d/n
C !d && (n-3)
D (d-0.2)|n
A D
(1)float、double、long double等类型不允许直接进行位与操作符啊,可用间接的方法变通,如float取地址(也是&符号)转换为unsigned int类型,再用取值操作符(*),这样编译器会以为是unsigned int类型。
(2)使用int、short、long移位时最好加上unsigned,这样就是汇编中逻辑移位(即全部移位),如果不加unsigned情况就较为复杂,正数全是逻辑移位,负数左移时保持符号位为1、右边补0,负数右移时保持符号位为1,左边补1,所以-1不管怎么右移都是-1。
(3)位与操作符就是将两个数进行与操作,&0x01就相当于掩码取出最后一位,其他位置成0
(4)位与操作符&的操作优先级小于移位操作符,但移位操作符小于取地址操作符&(取值操作符*),所以上面代码不会出错
下面描述正确的是()
A while循环语句的循环体至少执行1次
B do-while循环可以写成while循环的格式
C continue语句可以出现在各种循环体中
D break语句不可以出现在循环体内
BC
break语句可以出现在switch语句块中,while循环体可能不会执行
关于内联函数正确的是()
A 类的私有成员函数不能作为内联函数
B 在所有类说明中内部定义的成员函数都是内联函数
C 类的保护成员函数不能作为内联函数
D 使用内联函数的地方会在运行阶段用内联函数体替换掉
B
A是可以的,私有成员函数可以内联
C也可以
D应该是在编译阶段替换
下面模板声明中,哪些是非法的()
A template<class Type>class C1;
B template<class T, U, class V>class C2;
C template<class C1, ypename C2>class C3{};
D template<typename myT, class myT>class C4{};
B D
解释: B选项的U参数没有指定类型, D选项的 2个形参名同名。
函数模板的格式:
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}
类模板的格式为:
template<class 形参名 ,class 形参名,…> class 类名
{ ... };
在使用浏览器打开一个网页的过程中,浏览器会使用的网络协议包括()
A DNS
B TCP
C HTTP
D Telnet
ABC
思路:使用DNS去获得域名的主机ip,使用HTTP去获得报文交互,而HTTP是基于TCP协议的
三、问答题
有n个文件的长度记载在一个无符号64位整数数组中unsigned__int64 file_length[n],把这n 个文件从逻辑上按序首尾拼接在一起形成一个逻辑上的大文件,然后以每块长度为unsigned block_length把这个逻辑上的大文件划分成大小相等的数据块(当然,最后一块有可能比block_length小),请定义和实现一个函数,把边界块的序号集合返回给函数的调用者(第一个数据块序号为0)。
注:边界块指的是跨多个文件的数据块。
vector<int> findSeq(unsigned __int64* file_length,int n, unsigned block_length)
{
vector<int> seqnums;
unsigned __int64 totalSize = 0;
int preSeq=-1;
for(int i=0; i<n;i++){
totalSize += file_length[i];
int seq = totalSize/block_length;
if(!(totalSize%block_length)){
seq--;
}
if(preSeq==seq){
if(seqnums.empty()||seqnums.back()!=seq){
seqnums.push_back(seq);
}
}
preSeq = seq;
}
return seqnums;
}
请实现一个函数,把两个从大到小的有序链表合并成一个链表,新的链表是一个从小到大的有序链表。
struct list
{
int value;
list* next;
};
list * merge (list *list1_head, list*list2_head);
list *merge(list *list1_head,list *list2_head)
{
list *newlist = NULL;
list *current = NULL;
while(NULL!=list1_head && NULL!=list2_head)
{
if(list1_head->value > list2_head->value)
{
current = list1_head->next;
list1_head->next = newlist;
newlist = list1_head;
list1_head = current;
}
else
{
current = list2_head->next;
list2_head->next = newlist;
newlist = list2_head;
list2_head = current;
}
}
while(NULL!=list1_head)
{
current = list1_head->next;
list1_head->next = newlist;
newlist = list1_head;
list1_head = current;
}
while(NULL!=list2_head)
{
current = list2_head->next;
list2_head->next = newlist;
newlist = list2_head;
list2_head = current;
}
return newlist;
}
如果两个英文单词,组成它们的字符集合相同,而且相同字符出现的次数也相同,则称这两个词匹配:比如说:同”abbc”与词 ”babc”是匹配的。有一个词典,存储在字符串数组const char* dictionary[n]中,数组的每一个元素是一个词。对于任意给出的句子。句子中的单词使用空格分割。请实现以下函数,判断句子中是否有词和词典中的词匹配。
bool is_matching( const char* dictionary[],int n, const char* sentence);
abbc 和 babc 同的话, 即词语单个字符的ascii码和相同即词语相同。 把字符串比较转换成 int 型数字比较。
数组中所有词转换成int 放入 int数组。
比较大小