T 筆試題精選 (一)

2021-07-27 16:41:37 字數 4594 閱讀 3596

該筆試題對於c/c++的基礎細節比較重視。

1、 32 位機上根據下面的**,問哪些說法是正確的? ( )

signed char a = 0xe0;

unsigned int b = a;

unsigned char c = a;

a. a>0 && c>0 為真

b. a == c 為真

c. b 的十六進製制表示是:0xffffffe0

d. 上面都不對

解析:答案:c。變數a為有符號字元型變數,最高位為符號位,符號位為1,所以a<0。用a為c賦值,c為無符號字元型變數,最高位不是符號位,c>0,a為-32,c為224,因此a不等於c,ab選項都不對。用a為b賦值,b為無符號整形變數,使用a的符號位補充b中的高位3個位元組,用帶符號字元型給無符號整型賦值,高位補符號位,因此c選項正確。資料型別的

2、 下面哪些選項能編譯通過? ( )

int i;

char a[10];

string f();

string g(string & str);

a. if(!!i)

b. g(f());

c. a=a+1;

d. g(「abc」);

解析:答案:a。在bcd三個選項中,b中在c++中只有const引用才能被臨時變數或臨時物件所初始化,函式的返回值都是臨時變數,f()函式的返回值為臨時變數,只能賦值給const引用,b錯誤,如果有乙個已定義的string變數a,令a = f(); 然後g(a); 這樣就對了。c肯定不對,c中a為陣列名,a可以加1,但是不能直接給陣列這樣賦值,陣列名不可以做左值,c錯誤。d**引數為char*的字元指標型別**,string為類庫中的字元類,指標到類無法進行轉換,d錯誤。

臨時變數:由編譯器在程式需要的時候自動生成的臨時性變數,它們並不在**中出現,但是它們又是確實存在的,而臨時變數的生成時機通常是在函式引數傳遞時發生型別轉換,以及函式返回值時被建立。臨時變數不能初始化非const引用。

3、 int a[10]; 問下面哪些不可以表示 a[1] 的位址? ( )

a. a+sizeof(int)

b. &a[0]+1

c. (int*)&a+1

d. (int* ) ((char*)&a+sizeof(int))

解析:答案:a。a選項中中首位址加4,為首位址加上16個位元組之後的位址,即a[4]的位址。bcd選項都可以表示a[1]的位址。考察點:「&a 表示整個陣列的位址,在進行位址計算時,以整個陣列的大小為單位進行計算。而 a 則表示陣列首元素的位址,以首元素的型別int的大小為單位進行計算。

指標運算:a+n=(unsigned int)a + n * sizeof(type)

4、 問下面的資料都存放在哪些儲存區? ( )

int main()

a. **段

b. 棧

c. 常量區

d. 堆

解析:答案:bc注意審題,題目中問的是資料存放的位置,資料報括了指標p,字串常量,和0。指標p存放在中,其他的放在常量區。本程式還有**如main函式,函式體存放在**段中。

5、 下面哪些函式呼叫必須進入核心才能完成? ( )

a. fopen

b. exit

c. memcpy

d. strlen

解析:答案:ab。a選項,fopen開啟乙個檔案,開啟檔案必然使用它的驅動,驅動在核心之中。b選項,exit結束當前呼叫該函式的程序,只有作業系統才能決定程序的結束,必然進入核心。c為記憶體拷貝函式,d為獲取字串長度,都是在記憶體之中,都不會進入核心。

系統核心的呼叫型別:程序控制、檔案管理、裝置管理、資訊維護、通訊。

本題考察:c語言、作業系統以及看答題者是否有編寫應用程式的經歷。

6、 死鎖發生的必要條件? ( )

a. 互斥條件

b. 請求和保持

c. 不可剝奪

d. 迴圈等待

解析:答案:abcd。a,乙個資源一次只能被乙個任務或執行緒占有。b,d,資源已經被占有,其他執行緒進行請求,請求不到就要保持和等待。c,資源被乙個執行緒占用後不可剝奪,其他執行緒必須等待。

考的是作業系統原理的知識。死鎖的四個必要條件:互斥、請求和保持、不可搶占(剝奪)、迴圈等待。

7、 有兩個執行緒,最初 n=0,乙個執行緒執行 n++; n++; 另乙個執行 n+=2; 問,最後可能的 n

值? ( )

a. 1

b. 2

c. 3

d. 4

解析:答案:bcd,同乙個程序的執行緒共享記憶體資料,2,3,4都有可能得到。cpu交替處理兩個執行緒,n每進行一次計算就被寫回記憶體。每個執行緒都會加上2,因此不能選a。

考的是作業系統原理中的多執行緒程式設計的知識。同時還考察了一點編譯原理,++操作不是原子操作,加法也不是原子操作,即++指令被分解成多行彙編指令:取n值、加1、寫n值,中間會被打斷,cpu被交替使用。

8、 下面哪些說法正確? ( )

a. 陣列和鍊錶都可以隨機訪問

b. 陣列的插入和刪除可以達到 o(1)

c. 雜湊表無法法進行範圍檢查

d. 二叉樹無法進行線性訪問

解析:答案:c。陣列可以實現隨機訪問,鍊錶不能實現隨機訪問。陣列在插入和刪除時,需要搬移其他元素,不能達到o(1)。二叉樹可以通過線索化二叉樹進行線性訪問。雜湊表是乙個鍵和值的關係,如果乙個鍵沒有值對應,則會返回空值,不會進行範圍檢查。

考察是否學習過資料結構。大公司的筆試題一定會考資料結構。

9、 基於比較的排序的時間複雜度下限是多少? ( )

a. o(n)

b. o(n^2)

c. o(nlogn)

d. o(logn)

解析:答案:c

以下6種排序都是基於比較的排序。

選擇排序,插入排序以及氣泡排序的演算法思想簡單,且演算法的時間複雜度同為o(n^2)量級。希爾排序,快速排序和歸併排序將排序演算法的時間複雜度提高到了o(n*logn)

10、 對於下列程式,在乙個 big endian 的 32 位的計算機上,b 的結果是? ( )

unsigned int a = 0x1234;

char b = * ((char*)&a);

a. 0x12

b. 0x34

c. 0x00

d. 程式崩潰

解析:答案:c

big endian:大端模式,高位位元組儲存在低位位址處。與閱讀習慣移植。

little endian:小端模式,高位位元組儲存在高位位址處。

大小位元組序與網路程式設計有關。說明考題對網路程式設計的要求比較高。

本題中,a的存放位置如下所示:

指標指向首位址,即低位址。因此,答案為c。

11、 編寫函式求兩個整數 a 和 b 之間的較大值。要求不能使用 if, while, switch, for, ?: 以及任何的比較語句。

解析:不能使用比較語句,可以採用減法和得到的差的正負來進行比較。判斷差的正負不能用if,計算機中表示正負數要看符號位,符號位的0和1,可以通過陣列的下標來找到相應的資料。

答案如下:

#include 

using

namespace

std;

//找到 a 和 b 中大的數。 要求不能使用 if, while, switch, for, ?: 以

//及任何的比較語句。

int max(int a, int b)

; return

array[flag];

}int main()

另一種解法:但是該方法可能會扣分,因為abs取絕對值函式內部可能會用到判斷語句和分支語句。

#include 

#include

using

namespace

std;

int max(int a, int b)

int main()

騰訊筆試題精選一

32 位機上根據下面的 問哪些說法是正確的?signed char a 0xe0 unsigned int b a unsigned char c a a.a 0 c 0 為真 b.a c 為真 c.b 的十六進製制表示是 0xffffffe0 d.上面都不對 下面哪些選項能編譯通過?int i c...

外企筆試題精選二

外企筆試題精選二 下面 是否有錯?如果有錯,錯在 struct test test int i void func int main 下面的 輸出什麼?為什麼?class test int geti int getj int main a c developer wants to handle a ...

筆試題集(三)C 精選

1 求解下列 的列印值 include class a virtual void dosth 列印如下 this is donull function this is donull function this is donull function 1 如果某個方法沒有使用任何成員變數,不需要this...