1
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】
说明:

大端:数据高位,保存在低地址处;数据低位,保存在高地址处

clipboard.png


编写函数求两个整数 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 原因: 有符号整型数的右移操作,低位被移除,高位补符号位。


TianSong
737 声望139 粉丝

阿里山神木的种子在3000年前已经埋下,今天不过是看到当年注定的结果,为了未来的自己,今天就埋下一颗好种子吧