程式設計師面試寶典第一部分

2021-05-07 12:55:25 字數 4834 閱讀 6113

1)答案為: a

note1:求值順序是自右至左;輸出順序還是從左至右.

note2: 如果把printf(「%d %d\n」, *ptr, *(++ptr) );換成printf(「%d %d\n」, *ptr, *(ptr++) );結果為c,雖然求值是從右向左的,但是表示式中的*ptr與*(ptr++)不是兩個語句,所以ptr的值相同

2) (int&)a 與 (int)&a 及(int)a有什麼區別

#include

using namespace std;

void main()

note1:

(int&)a 把a強制轉換成整形引用型別不經過轉換, 直接得到a在記憶體單元的值

(int)a 把a強制轉化為整型經過轉換了

(int)&a 把a的位址強制轉換成整型

note2:

float型別在記憶體中儲存的形式是 ,符號位指數尾數

由754標準:階碼採用增碼(該數補碼的反符號),尾數採用原碼

所以1.0f 在記憶體中的形式為

0011 1111 1000 0000 0000 0000 0000 0000符號位指數尾數

0000 0001 //原始碼

1111 1110+1=1111 1111//補碼=>取反加1

0111 1111//增碼=> 符號取反

所以輸出的是 0x3f800000

0 在記憶體中的的儲存形式

0000 0000 0000 0000 0000 0000 0000 0000

3) 單目 > 算數 > 移位( << >>) >關係( > >= < <> 邏輯

note1: 運算子的優先順序,所以是先對a求反,然後再右移5位

note2: 型別轉換,a會先被提公升到int型進行運算,最後取低8位

答案: c

4) 通過位運算求x與y的平均值

解析:(x&y)+((x^y)>>1)是用來求x和y的平均數的,即(x+y)/2.

(x&y)+((x^y)>>1),把x和y裡對應的每一位(指二進位制位)都分成三類,每一類分別計算平均值,最後彙總。其中,一類是x,y對應位都是1,用x&y計算其平均值;一類是x,y中對應位有且只有一位是1,用(x^y)>>1計算其平均值;還有一另是x,y中對應位均為0,無須計算。

下面分別說明一下前兩種情況是怎樣計算的:

x,y對應位均為1,相加後再除以2還是原來的數,如兩個***相加後除以2仍得00001111,這是第一部分。第二部分,對應位有且只有一位為1,用「異或」運算提取出來,然後》1(右移一位,相當於除以2),即到到第二部分的平均值。第三部分,對應位均為零,因為相加後再除以二還是0,所以不用計算。

三部分彙總之後就是(x&y)+((x^y)>>1)

順便解釋一下前面說到可以避免溢位。假設x,y均為unsigned char型資料(0~255,占用一位元組),顯然,x,y的平均數也在0~255之間,但如果直接x+y可能會使結果大於255,這就產生溢位,雖然最終結果在255之內,但過程中需要額外處理溢位的那一位,在彙編中就需要考慮這種高位溢位的情況,如果(x&y)+((x^y)>>1)計算則不會。

5) 通過位運算交換a與b的值

a=a^b; b=a^b; a=a^b; //無需擔心越界問題

6) c語言不支援函式過載

7) 巨集中的引數要注意加括號

答案:#define min(a,b) ( (a)<=(b) ? (a):(b) )

8) const相關說明

a. const與#define:作用域,有型別,方便除錯(c中只能用#define表示常量)

b. c與c++中的const

a) c中const的意思是」乙個不能被改變的普通變數」,所以下面的語句是錯誤的

const buffersize=100;

char buf[buffersize];//錯誤,buffersize不是常量

b) c中const預設是外部鏈結的,所以可以有如下的語句

const buffersize; //c認為它是乙個宣告,定義及初始化在其他地方了

而在c++中如果要做同樣的事情需要如下的語句

extern const buffersize; //c++預設const是內部鏈結的

c. c++中的const

void f() const如果想修改類中的非const變數,需要在該變數前加mutable(如mutable int i)

void f()與上面的函式過載

9) sizeof問題之資料對齊

a. char q2=」a\n」;

sizeof(q2); //應該為3

b. struct a;

sizeof(a); //6 short為2

c. struct b;

sizeof(b); //8 long為4

d. class d

sizeof(d); //4 sizeof計算棧中分配的大小,靜態變數是存放在全域性資料區的

e. class e

sizeof(e); //24 怎麼回事呢?????

note:

結構體預設的位元組對齊一般滿足三個準則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

10) sizeof小結

a. 對函式使用sizeof, 在編譯階段會被函式返回值的型別替代

例如: int fun(); sizeof( fun() )等同於sizeof( int )

b. sizeof不是函式也不是一元運算子,它是類似於巨集定義的特殊關鍵字,sizeof() 括號內的內容在編譯過程是不會被編譯的,而是被型別替代

int a=8;

sizeof( a=6 ); //結果等同於sizeof(int), 而且執行完a的值仍然是8,因為括號內的內容不會被編譯

11) sizeof與類

a. 空類所佔的空間為1,多重繼承的空類所佔的空間為1

b. 含有虛函式的類空間要加4

12) 常見錯誤1:使用前一定要將指標指向一塊記憶體

錯誤1:

int *pa;

*pa=5; //錯誤,pa還沒指向一塊記憶體

錯誤2:

該函式不能達到交換兩個數的效果,因為temp沒指向一塊記憶體就賦值了

13) 常見錯誤2:傳值與傳址

程式執行時會崩潰,str一直都是null,因為是傳值呼叫的

14) 各種指標,函式指標,陣列指標,指標陣列

15) 指標之間的強制轉換

問題1:

答案: 2 5

解析: &a:型別為int (*)[5],加1則整體加一行,&a+1指向陣列中5的後面

int *ptr=(int*)(&a+1):通過指標之間的強制轉換將&a+1(int (*)[5])轉化成(int*)

ptr-1:ptr是普通的指向int的指標,ptr-1指向陣列中的5

問題2:

int a[4]=;

char *pt=(char*)&a; //等價於char *pt=(char*)&a;

printf("%d %d",*(a+1),*(int*)(pt+4))

答案:2 2

解析:pt為指向陣列a首元素的char型指標,pt+4移動4個位元組

問題3:

巨集定義求結構體內變數的偏移(注意:不能以分號結束)

解析: ->的優先順序大於(type)的優先順序,所以要 ( (struc*)0 ) -> e

note:

a. 指標是什麼呢?一句話,指標其實就是位址。

只要有了乙個位址,就可以訪問到特定的記憶體。這就是指標。因為用途不同(可能指向乙個int啊,也可能指向乙個double啊),所以指標也分很多種。

這些指標本質上都是一樣的(都是記憶體的位址嘛),如果指向乙個地方,那麼值也是一樣的(同乙個地方的位址自然只有乙個咯)。可以通過強制轉換將一塊記憶體轉換成各種型別的指標

b. 如何將乙個指標強制轉化為指向陣列的指標

typedef int (*p)[3];

int(*ap)[3]=(p)ip; //這樣

int(*ap)[3]=(int(*)[3])ip;//或這樣

typedef int (*p)[3];

int(*ap)[3];

ap=(p)ip; //這樣

ap=(int(*)[3])ip;//或這樣

c. 指標強制轉換後的結果是臨時變數,不能作為左值

16) malloc/free與new/delete的區別

17) 智慧型指標

答案: b e

note: b,c格式不對, d是錯的,因為auto_ptr放在vector中是不合理的,

18) 深拷貝與淺拷問題

解析:a. vector *a1=new vector();

a1->push_back(d1); //會呼叫cdemo的預設拷貝建構函式,傳值呼叫時會呼叫拷貝建構函式進行形參與實參的賦值

b. delete a1; //釋放vector物件,vector所包含的所有元素也同時被釋放

c. 區域性變數cdemo d1在main函式退出時,也會釋放所佔的記憶體空間

d. 這樣str所指向的記憶體空間就會被釋放兩次了,引起記憶體錯誤

e. 採用深拷貝可以解決問題

19) 泛型程式設計1 template

20) 泛型程式設計2 函式指標

方法1:使用函式指標

方法2:使用靜態模板類

21) stl常用資料結構總結

22) 預設建構函式

作業 第一部分

第一部分投影基本知識 一 單選題 1 已知m點在n點正前方,則m和n兩點的 b 座標值不相等。a x方向 b y方向 c z方向 d 所有方向 2 已知點m座標 10,20,10 點n座標 10,20,0 則以下描述m n兩點相對位置關係的說法哪一種是正確的?a 點m位於點n正下方b 點m位於點n正...

第一部分概述

第一章良好農業規範 gap 的發展概況 第一節良好農業規範 gap 產生的背景和概念 一 良好農業規範產生的背景 近三 四十年,農業繁榮得益於化肥 農藥 良種 拖拉機等增產要素的產生,而隨著整個農業生產水平的提高和各種農業生產要素的日益成熟,這些要素對增產的貢獻率趨減。由於農業生產經營不當導致的生態...

第一部分專案策劃

專案管理手冊 電力工程事業部 2012年8月 目錄第一章專案定位 1 1.1 專案投標階段 1 1.2 專案中標後 1 1.3 專案定位的方法 1 1.4 專案定位與調整 2 第二章專案組織機構 3 2.1專案部組織機構 3 2.2 專案部組織機構圖 5 第三章專案經理崗位職責 6 3.1 崗位目的...