腾讯笔试题精选一

这些题目来自国嵌嵌入式培训视频《语言的艺术-笔试专题班》,特地整理下以便学习,如有错误欢迎指正

1. 32 位机上根据下面的代码,问哪些说法是正确的? (C ) 
signed char a = 0xe0; 
unsigned int b = a; 
unsigned char c = a; 
A. a>0 && c>0 为真 
B. a == c 为真 
C. b 的十六进制表示是:0xffffffe0 
D. 上面都不对 

解析: 

* a=0xe0 二进制为11100000 最高位为符号位 1代表负数,因此a>0为假

* a为负数,c为无符号是正数,那么a==c为假

* 负的高位用1补齐,正的高位用0补齐


2. 下面哪些选项能编译通过? (A ) 
int i; 
char a[10]; 
string f(); 
string g(string & str); 
A. if(!!i){f();} 
B. g(f()); 
C. a=a+1; 
D. g("abc"); 
解析:

*  答案是A ,但是本人用GCC编译时提示f()只声明未定义的错误

* f()返回的是一个临时变量,只有g()的参数是const引用时才能传入临时变量

* 数组名不能被赋值

* 不能将非const引用初始化为const char*


3. int a[10]; 问下面哪些不可以表示 a[1] 的地址? (A ) 
A. a+sizeof(int) 
B. &a[0]+1 
C. (int*)&a+1 
D. (int*)((char*)&a+sizeof(int)) 
解析:

* a+4显然错误

* &a[0]+1即a+1 正确

* 数组地址强制转化为int*,即a[1]地址

* 数组地址被转化为char* 然后加4,向前步进了4*sizeof(char),然后又转化为int*,即a[1]的地址


4. 问下面的数据都存放在哪些存储区? (BC )
int main() 
{ 
 char *p = "hello,world"; 
 return 0; 
} 
A. 代码段 
B. 栈 
C. 常量区 
D. 堆 

解析:

* p为一个局部变量,存放在栈,“hello,world”为字符串常量,存放在常量区

*main函数是在代码段,但题目问的是数据


5. 下面哪些函数调用必须进入内核才能完成? (AB ) 
A. fopen 
B. exit 
C. memcpy 
D. strlen
解析:

* fopen是打开文件函数,文件是可以看成一个设备的,打开一个设备就会给设备所属的驱动程序发送一个IRP,而与真实硬件相关的驱动都运行与内核

* 结束进程需要访问PCB进程控制块)和TCB(线程控制块)等等数据结构,而它们都存在于内核

* memcpy和strlen两函数为普通函数,跟内核无关


6. 死锁发生的必要条件? (ABCD ) 
A. 互斥条件 
B. 请求和保持 
C. 不可剥夺 
D. 循环等待

不解释


7. 有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 
值? (BCD ) 
A. 1 
B. 2 
C. 3 
D. 4 

解析:

*  n++; n++                2

* n++; n+=2               3

* n++; n++; n+=2;     4

 

8. 下面哪些说法正确? (B )
A. 数组和链表都可以随机访问 
B. 数组的插入和删除可以达到 O(1) 
C. 哈希表无法法进行范围检查 
D. 二叉树无法进行线性访问
解析:

* 数组可以随机访问,链表是不能随机访问的

* 二叉树可以前序遍历 中序遍历 后序遍历,都是线性访问

9. 基于比较的排序的时间复杂度下限是多少? (C ) 
A. O(n) 
B. O(n^2) 
C. O(nlogn) 
D. O(logn) 


10. 对于下列程序,在一个 big endian 的 32 位的计算机上,b 的结果是? (C ) 
unsigned int a = 0x1234; 
char b = *((char*)&a); 
A. 0x12 
B. 0x34 
C. 0x00 
D. 程序崩溃

解析:

* 大端模式节存放在低地址处,a=0x00001234,b为char型占两个字节,即0x00


11. 编写函数求两个整数 a 和 b 之间的较大值。要求不能使用 if, while, switch, for, ?: 以
及任何的比较语句。
/*
 * test.c
 *
 *  Created on: 2015年3月29日
 *      Author: wind
 */
#include <stdio.h>

int min(int a, int b)
{
	int c = a - b;
	int flag = ((unsigned int)c) >> 31;
	int array[] = {b, a};

	return array[flag];
}

int main(int argc, char **argv)
{
	printf("%d\n", min(1,2));
	printf("%d\n", min(10,23));
	return 0;
}











  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值