- 相關(guān)推薦
騰訊實(shí)習(xí)筆試題
1)32位機(jī)上根據(jù)下面的代碼,問哪些說法是正確的?(C)
signed char a = 0xe0;
unsigned int b = a;
unsigned char c = a;
A. a>0 && c>0 為真
B. a == c 為真
C. b 的十六進(jìn)制表示是:0xffffffe0
D.上面都不對(duì)
解析:這個(gè)題目涉及到 有符號(hào)數(shù)和無符號(hào)數(shù)之間的轉(zhuǎn)換0xe0的最高位是1,因此作為有符號(hào)數(shù)就是負(fù)數(shù),作為無符號(hào)數(shù)就是正數(shù)
所以 A 肯定是錯(cuò)的, B也錯(cuò),c = 0xe0是正數(shù),原因是正數(shù)和負(fù)數(shù)怎么可能相等呢,C是對(duì)的 負(fù)數(shù)的高位用1補(bǔ)齊,這樣分析的話 D 自然不會(huì)對(duì)
2)問下面的數(shù)據(jù)都存放在哪些存儲(chǔ)區(qū)?
int main()
{
char *p = "hello,world";
return 0;
}
解析:根據(jù)C語言中的特性和定義p是一個(gè)局部變量,而C語言中局部變量存在于棧中,"hello wrold"是一個(gè)字符串字面常量,因此存儲(chǔ)于程序的只讀存儲(chǔ)區(qū)中,p在這里其實(shí)只是指向了"hello wrold"在只讀存儲(chǔ)區(qū)中的地址而已,
騰訊實(shí)習(xí)筆試題
。3)關(guān)于 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. a+sizeof(int)
解析:
A. a+sizeof(int)
// 不正確, 在32位機(jī)器上相當(dāng)于指針運(yùn)算 a + 4
B. &a[0]+1
// 正確,數(shù)組首元素地址加1,根據(jù)指針運(yùn)算就是a[1]的地址
C. (int*)&a+1
// 正確,數(shù)組地址被強(qiáng)制類型轉(zhuǎn)換為int*,然后加1,這樣和B表示的一個(gè)意思
D. (int*)((char*)&a+sizeof(int))
// 正確,數(shù)據(jù)地址先被轉(zhuǎn)換為char*,然后加4,根據(jù)指針運(yùn)算公式,向前移動(dòng)4 * sizeof(char),之后被轉(zhuǎn)換為int*,顯然是a[1]的地址
4)下面哪些說法正確?(B)
A. 數(shù)組和鏈表都可以隨機(jī)訪問
B. 數(shù)組的插入和刪除可以 O(1)
C. 哈希表沒有辦法做范圍檢查
D. 以上說法都不正確
解析:數(shù)組可以直接通過下標(biāo)得到存儲(chǔ)的值 因此支持隨機(jī),訪問鏈表是鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)時(shí)無法支持隨機(jī)訪問,要訪問一個(gè)指定位置的元素必須從頭開始做指針移動(dòng)。哈希表支持直接通過關(guān)鍵碼得到值 其實(shí)數(shù)組就是一種哈希表 下標(biāo)就是關(guān)鍵碼 通過下標(biāo)直接得到值 因此哈希表肯定需要做范圍檢查也有辦法做范圍檢查的
5)基于比較的排序的時(shí)間復(fù)雜度下限是多少?(C)
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(1)
解析:大家記住這個(gè)結(jié)論就好 在當(dāng)前計(jì)算機(jī)科學(xué)界對(duì)于基于比較的排序 最快只是O(n*logn)
6)有兩個(gè)線程,最初 n=0,一個(gè)線程執(zhí)行 n++; n++; 另一個(gè)執(zhí)行 n+=2; 問,最后可能的 n 值?(BCD)
A. 1
B. 2
C. 3
D. 4
解析:大家要知道 C語言中的 ++ 和 += 并不是原子操作,而是通過多條微程序組成的,因此 ++ 和 += 在執(zhí)行過程中可能被中斷的
第一種可能情況:現(xiàn)在假設(shè)兩個(gè)線程沒有并行順序執(zhí)行的那么結(jié)果顯然是 4,
資料共享平臺(tái)
《騰訊實(shí)習(xí)筆試題》(http://www.oriental01.com)。第二種可能情況:再假設(shè)現(xiàn)在第一個(gè)n++ 已經(jīng)執(zhí)行完了 但是結(jié)果還沒有寫回內(nèi)存 這個(gè)時(shí)候 n+=2 已經(jīng)全部執(zhí)行完 2 寫進(jìn)了內(nèi)存 結(jié)束 然后回到n++的寫回操作 這個(gè)時(shí)候內(nèi)存就從2被改回1了,后面再來一次n++ 結(jié)果就為2。
第三種可能情況: 第n+=2 先讀取n的值到寄存器 即0入寄存器 這個(gè)時(shí)候被中斷 第一個(gè)n++開始執(zhí)行 并直到結(jié)束 內(nèi)存被改成了1 ,然后 n+=2 繼續(xù)執(zhí)行 結(jié)束后內(nèi)存變?yōu)? 第二個(gè)n++再執(zhí)行 結(jié)果就是3了。
我個(gè)人認(rèn)為 不可能得到1的執(zhí)行結(jié)果
7)下面哪些函數(shù)調(diào)用必須進(jìn)入內(nèi)核才能完成?(AB)
A. fopen
B. exit
C. memcpy
D. strlen
解析:我覺得這題 肯定是 fopen 和 exit
fopen是打開文件的函數(shù),文件也可以看成是一個(gè)設(shè)備,打開一個(gè)設(shè)備將導(dǎo)致給設(shè)備所屬的驅(qū)動(dòng)程序發(fā)送一個(gè)IRP,而與真實(shí)硬件相關(guān)的驅(qū)動(dòng)程序都運(yùn)行于內(nèi)核.
exit函數(shù)是結(jié)束進(jìn)程的函數(shù),結(jié)束進(jìn)程需要訪問PCB(進(jìn)程控制塊)和TCB(線程控制塊)等等一些數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)都存在于內(nèi)核中.原因很簡單 memcpy 和 strlen 我們可以直接不調(diào)用任意函數(shù)寫出來這種函數(shù)肯定不會(huì)實(shí)現(xiàn)在內(nèi)核的
8)死鎖發(fā)生的必要條件?(ABCD)
A. 互斥條件
B. 請(qǐng)求和保持
C. 不可剝奪
D. 循環(huán)等待
解析:互斥條件,請(qǐng)求和保持,不可剝奪 ,循環(huán)等待,這些都可能發(fā)生死鎖 所以以后大家在做多線程程序時(shí)一定要注意了。
9)填空題
#include
#include
#define M 3
#define N 4
int get(int *a, int i, int j)
{
return *(a+i*N+j);
}
int main()
{
int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int v;
v = get(a, 2, 1);
printf("a[2][1] == %d\n", v );
return 0;
}
解析:大家注意原型中的指針是int* a,所以必須用二維數(shù)組在內(nèi)存中是一維排布這個(gè)知識(shí)點(diǎn)來做,直接 return *(a+i*N+j);
而不是 return *(*(a+i)+j);
【騰訊實(shí)習(xí)筆試題】相關(guān)文章:
騰訊實(shí)習(xí)生筆試題09-13
騰訊運(yùn)營筆試題10-08
騰訊實(shí)習(xí)生筆試題目07-09
騰訊實(shí)習(xí)生筆試題目09-20
騰訊校招筆試題08-08
騰訊技術(shù)綜合筆試題09-15
騰訊校招筆試題目08-07
騰訊游戲策劃筆試題目07-21
騰訊技術(shù)類模擬筆試題09-09
騰訊軟件測(cè)試常見筆試題07-21