32位机上根据下面的代码,问哪些说法是正确的?
signed char a = 0xe;
unsigned int b = a;
unsigned char c = a;
A. a > 0 && c > 0
B. a == c 为真
C. b 的十六进制表示为: 0xffffffE0
D. 上面都不对
答案: 【C】
输出:
a - dec: -32
b - hex: ffffffe0 // 高字节补符号位
c - dex: 224
说明:
有符号与无符号
下面哪些选项可以编译通过?
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】
说明:
B. 只有 const 引用才可以被临时变量(对象)初始化(string f() 将返回一个临时string对象)
C. 数组名可看作指向第一个元素的常量指针,无法进行赋值操作
D. "abc" ==> const char* 类型
int a[10]; 问下面哪些地址不可以表示a[1]的地址?
A. a + sizeof(int)
B. &a[0] + 1
C. (int*)&a + 1
D. (int*)((char*)&a + sizeof(int))
答案:【A】
说明:
Type* p;
p+n; <--> (unsigned int)p + n * sizeof(Type)
数组名可看作指向第一个元素的常量指针
a 类型 ==> int*
&a 类型 ==> int(*)[10]
a[0] 类型 ==> int
A. a + sizeof(int) ==> (unsigned int)a + 4 * sizeof(int)
B. &a[0] + 1 ==> (unsigned int)(&a[0]) + 1 * sizeof(int)
C. (int*)&a + 1 ==> a + 1 ==> (unsigned int)a + 1 * sizeof(int)
D. (int*)((char*)&a + sizeof(int)) ==> (int*)((unsigend int)a + 4 * sizeof(char))
下面的数据存放在哪些存储区?
int main()
{
char* p = "hello, word";
return 0;
}
A. 代码段
B. 栈
C. 常量取
D. 堆
答案:【B C】
说明:
栈: p
常量区:"hello, word"
下面哪些函数调用必须进入内核才能完成?
A. fopen
B. exit
C. memcpy
D. strlen
答案:【A B】
说明:
A. 打开设备、文件。将触发设备驱动程序的调用,驱动程序运行于内核中。
B. 退出进程。由内核管理。
C. 内核空间可完成。
D. 内核空间可完成。
死锁发生的必要条件?
A. 互斥条件
B. 请求和保持
C. 不可剥夺
D. 循环等待
答案:【A B C D】
有两个线程,最初 n=0, 一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?
A. 1
B. 2
C. 3
D. 4
答案:【B C D】
说明:
++ 非原子操作,实际会对应多条汇编语句,其中每一条汇编语句执行完成后都可能被打断。
例 n++ 分解三步:取n值,加1,写 n 值回内存。
B. 线程1 n++;线程1 n++ 将要写 n(2) 值回内存之前被线程2打断,此时线程2完成n++(1+2),回写内存3,线程1继续运行,回写内存2 ==> 2
C. 线程1 n++;线程2 n+=2, 将要回写n(3)值回内存之前被线程1打断,线程1 n++,回写内存2,线程2继续执行,回写内存3 ==>3
D. 线程1 n++, n++, 线程2 n+=2 ==> 4
下面哪些说法正确?
A. 数组和链表都可以随机访问
B. 数组的插入和删除可以达到 O(1)
C. 哈希表无法进行范围查找
D. 二叉树无法进行线性访问
答案:【C】
说明:
A. 链表只可以进行顺序访问
B. 数组的插入和删除伴随着相应元素的移动 O(n)
D. 二叉树可以进行线索化后进行线性访问
基于比较排序的时间复杂度下限是多少?
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(logn)
答案:【C】
说明:
排序算法 | 时间复杂度 | 稳定性 |
选择排序 | O(n2) | 不稳定 |
插入排序 | O(n2) | 稳定 |
冒泡排序 | O(n2) | 稳定 |
希尔排序 | O(n2/3) | 不稳定 |
归并排序 | O(nlogn) | 稳定 |
快速排序 | O(nlogn) | 不稳定 |
对于下列程序,在一个 big endia 的32位机器上, b 的结果是?
unsigned int a = 0x1234;
char b = *((char*)&a);
A. 0x12
B. 0x34
C. 0x00
D. 程序崩溃
答案:【C】
说明:
大端:数据高位,保存在低地址处;数据低位,保存在高地址处
编写函数求两个整数 a 和 b 之间的较大值。要求不能使用 if,while, switch, for, ?; 以及任何的比较语句。
int max(int a, int b)
{
int d = a - b;
int flag = ((unsigned int)d) >> 31;
int array[] = {a, b};
return array[flag];
}
(unsigned int)d 原因: 有符号整型数的右移操作,低位被移除,高位补符号位。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。