第1课 - 腾讯笔试题精选一
- 32位机上根据下面的代码,问哪些说法是正确的()
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
- a>0 && c>0 为真
- a == c 为真
- b的十六进制表示为:0xffffffe0
- 上面都不对
解析:0xe0的十六进制表示为10进制为224,二进制表示为11100000,开头是1,在有符号数里面开头是1表示负数,a的实际值是-32,c的实际值的224;用a1去初始化无符号整型,将一个符号位的数赋值4个符号位的数,需要补符号位,a被解释为-32,符号位是1,将b的空白位置都补充为1,b变成0xffffffe0。
正确选C。
考点:数据类型,符号位,补符号位
- 下面哪些选项能编译通过()
int i;
char a[10];
string f();
string g(string & str);
- If(!!i){f();}
- g(f());
- a = a+1;
- g(“abc”);
解析:数组名可以进行加法运算,但是不能进行赋值运算的,C选项错误;“abc”是const char*是字符指针类型,这种类型转换不成string引用,D选项错误;只有const引用才能被临时变量或者临时对象所初始化,B选项不正确;
正确选A
考点:C++中的引用,标准库
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;
【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名。
- int a[10];问下面哪些不可以表示a[1]的地址()
- a+sizeof(int)
- &a[0]+1
- (int*)&a+1
- (int*)((char*)&a+sizeof(int))
解析:指针运算的规律是:type* a; a + n; (unsigned int)a + n * sizeof(type)。
&a[1]表示为(unsigned int)a + 4;A选项中表示为:(unsigned int)a + 4 * sizeof(int)表示的不是a[1]的地址;B选项表示为:(unsigned int)( &a[0]) + 1 * sizeof(int),首字母的地址与数组名的地址是一样的,正确。C选项中,&a和a的值是一样的,都是数组的地址,但是他们的类型不一样,&a的类型是int(*)[10], a的类型是int*,C正确;D选项中(char*)&a+sizeof(int)表示为(unsigned int)a+4*sizeof
(char),正确。
正确选A
考点:数组地址运算
- 问下面的数据存放在哪些存储区()
int main()
{
char *p = “hello,world”;
return 0;
}
- 代码段
- 栈
- 常量区
- 堆
解析:函数体存放在代码段,代码中的数据有“hello,world”,存放在常量区,char *p存放在栈。
正确选BC
考点:编译语言,C语言
- 下面哪些函数调用必须进入内核才能完成()
- fopen
- exit
- memcpy
- strlen
解析:这四个函数都是C语言开发使用的函数,fopen是打开设备文件的,同时会出发驱动程序,驱动程序在内核;exit结束当前的进程,只有内核才能完成。Memcpy、strlen在用户空间就可以完成
正确选AB
考点:C语言,操作系统,应用经验
- 死锁发生的必要条件()
- 互斥条件
- 请求和保持
- 不可剥夺
- 循环等待
解析:互斥条件指的是一个资源一次只能被一个任务所占有,任务往往指的是一个线程,另一个任务不能使用;另一个程序要使用就是请求,使用的进程在保持,同时使用的进程不可波段,需要循环等待。
正确选ABCD
考点:操作系统,线程
- 有两个线程,最初n=0,一个线程执行n++,n++;另一个执行n+=2;问,最后可能的n的值()
- 1
- 2
- 3
- 4
解析:第一个执行完执行第二个,n的值为4;n++在汇编语言中分为三条语句,分别是(1)取n值(2)加1(3)写n值到内存,当线程1执行完一次n++,第二个执行步骤(2)时,执行线程2,线程2将3写为内存,之后线程1继续执行,将2存在内存,将3冲掉,此时n的值是2;线程1执行完一次n++,执行线程2,执行到(2)时,执行线程1,线程1结束执行线程2,此时n的值是3;这两个线程都加2,两个线程无论怎么交替都不会是1。
正确选BCD
考点:多线程编程,编程原理
8.下面哪些说法是正确的()
A. 数组和链表都可以随机访问
B. 数组的插入和删除可以达到O(1)
C. 哈希表无法进行范围检查
D. 二叉树无法进行线性访问
解析:只有数据才可以随机访问,链表只能顺序访问;数组元素的删除,需要将临近的元素前移,复杂度大于O(1);二叉树不是线性结构,但是二叉树可以进行线索化,之后就可以进行线性访问,D用词不准确。哈希表示一个键和值的结构,无法进行范围检查。
正确选C
考点:数据结构
9. 基于比较的排序的时间复杂度是下限多少()
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(logn)
正确选C
考点:数据结构
10. 对于下列程序,在一个big endian的32位计算机上,b的结果是()
unsigned int a = 0x1234;
char b = *((char)&a);
- 0x12
- 0x34
- 0x00
- 程序崩溃
解析:大端模式是数据的高位放在低地址里面,小端模式是数据的高位放在高地址里面。0x1234在大端模式中的存放方式是:00 00 12 34,在小端模式中的存放方式是34 12 00 00。大端迷失中取的是第一个字节00。
正确选C
考点:网络,字节序
11. 编写函数求两个整数a和b之间的较大值。要求不能使用if, while, switch, for, ?以及任何的比较语句。
解析:
方法一:使用符号位的用法进行,返回较小的值。
#include <cstdlib>
#include <iostream>
#include <string>
using namespace std;
int min(int a, int b)
{
int d = a - b;
int flag = ((unsigned int)d) >> 31;//将原本32位的开头的符号移到开头
int array[] = {b, a};
//若a大于b,符号位是0,意味b较小
return array[flag];
}
int main(int argc, char *argv[])
{
cout<< min(1, 2) <<endl;
cout<< min(2, 1) <<endl;
cout<< min(2, 10000)<<endl;
cout << "Press the enter key to continue ...";
cin.get();
return EXIT_SUCCESS;
}
方法二:数学运算
int min(int a, int b)
{
int d = abs(a-b);
return (a+b-d)/2;
}
但是由于不知道abs函数中是否有用题目中的语句,所以解法二中的算法不完善。