zhuwenfeng的专栏

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

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;}

要纠正别人之前,先反省自己有没有犯错

zhuwenfeng的专栏

相关文章:

你感兴趣的文章:

标签云: