接著昨天的總結繼續。。。
題目11:#define double(x) x+x ,i = 5*double(5)。 i 是多少?
解答:這個題目和題目6是同乙個題型,這裡並不會出現i=5*(5+5)=50的結果,因為題目只是使用了x+x來替代double(x),注意x+x並沒有使用括弧,所以結果應該為:i=5*x+x=5*5+5=30。所以在寫巨集定義的時候一定要謹慎地將巨集定義中的「引數」和整個巨集用用括弧括起來。
題目12:在不用第三方引數的情況下,交換兩個引數的值。
解答:
很有意思的一道題目,有三種方法:
方法一:
a=a+b;
b=a-b;
a=a-b;
方法二:
i^=j;
j^=i;
i^=j;
方法三:
// 用加減實現,而且不會溢位
a = a+b-(b=a)
題目13:下列**段輸出cout<
union a ;
typedef struct
b;class c
;
解答:
考查對sizeof的理解,和題目8是同一題型。
一些基本資料型別的sizeof這裡就不在介紹了,下面重點講下結構體的sizeof:
先看乙個例子:
struct s1
;
問sizeof(s1)等於多少?聰明的你開始思考了,char佔1個位元組,int佔4個位元組,那麼加起來就應該是5。是這樣嗎?你在你機器上試過了嗎?也許你是對的,但很可能你是錯的!vc6中按預設設定得到的結果為8。
我們來好好琢磨一下sizeof的定義——sizeof的結果等於物件或者型別所佔的記憶體位元組數,好吧,那就讓我們來看看s1的記憶體分配情況:
s1 s1 = ;
0012ff78: 61 cc cc cc ff ff ff ff發現了什麼?怎麼中間夾雜了3個位元組的cc?看看msdn上的說明:
原來如此,這就是傳說中的位元組對齊啊!乙個重要的話題出現了。
為什麼需要位元組對齊,計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。
讓我們交換一下s1中char與int的位置:
struct s2
;
看看sizeof(s2)的結果為多少,怎麼還是8?這是因為有以下規則:
1)資料對齊原則----記憶體按結構成員的先後順序排列,當排到該成員變數時,其前面已擺放的空間大小必須是該成員型別大小的整倍數,如果不夠則補齊,以此向後類推;
2)結構體的總大小為結構體最寬基本型別成員大小的整數倍。
看雖然s1和s2結果是一樣的,但原因卻不一樣。s1是因為有第一條規則的存在,即c要和i對齊才在後面填充位元組補齊,而s2則是因為第二條規則的限制才在c後面填充位元組補齊。所以一定要注意當結構體裡面的成員順序不一樣的時候其結果也有可能不一樣。例如下面這個例子:
struct s1
;struct s2
;cout<
同樣是兩個char型別,乙個int型別,乙個double型別,但是因為對齊問題,導致他們的大小不同。計算結構體大小可以採用元素擺放法,我舉例子說明一下:首先,cpu判斷結構體的對界,根據上面的規則,s1和s2的對界都取最大的元素型別,也就是double型別的對界8。然後開始擺放每個元素。
對於s1,首先把a放到8的對界,假定是0,此時下乙個空閒的位址是1,但是下乙個元素d是double型別,要放到8的對界上,離1最接近的位址是8了,所以d被放在了8,此時下乙個空閒位址變成了16,下乙個元素c的對界是4,16可以滿足,所以c放在了16,此時下乙個空閒位址變成了20,下乙個元素d需要對界1,也正好落在對界上,所以d放在了20,結構體在位址21處結束。由於s1的大小需要是8的倍數,所以21-23的空間被保留,s1的大小變成了24。
題目14:輸出下面程式段的結果:
#include class a
解答:
這裡涉及到派生類建構函式的呼叫順序:
1)呼叫基類建構函式
2)呼叫成員建構函式
3)呼叫派生類本身的建構函式。
而析構函式剛好相反,即順序為3)2)1)。
所以其輸出結果為:
a::print()
b::print()
c::print()
a::print()
b::print()
c::print()
a::print()
a::print()
a::print()
題目15:當乙個類a 中沒有生命任何成員變數與成員函式,這時sizeof(a)的值是多少,如果不是零,請解釋一下編譯器為什麼沒有讓它為零。(autodesk)
解答:肯定不是零。舉個反例,如果是零的話,宣告乙個
class a[10]
物件陣列,而每乙個物件占用的空間是零,這時就沒辦法區分
a[0],a[1]…
了。題目16:.h標頭檔案中的ifndef/define/endif 的作用?
解答:防止該標頭檔案被重複引用。
題目17:#include與#include"file.h"的區別?
解答:
前者是從
standard library
的路徑尋找和引用
file.h
,而後者是從當前工作路徑搜尋並引用
file.h。
題目18:寫出下列演算法的時間複雜度:
(1)氣泡排序;
(2)選擇排序;
(3)插入排序;
(4)快速排序;
(5)堆排序;
(6)歸併排序;
解答:
這個題目需要引起重視,雖然很多題目不會以這種形式來出題,但是很多選擇題和填空題都直接或間接的考查了這些演算法的時間複雜度。具體如圖所示:
題目19:已知資料表a中每個元素距其最終位置不遠,為節省時間,應該採用的排序演算法是?
解答:快速排序
題目20:記憶體分配方式
解答:記憶體分配方式有三種:
(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。
(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
(3) 從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由程式設計師決定,使用非常靈活,但問題也最多。
好了,今天就到這吧,明天繼續更新!
C C 校招筆試面試經典題目總結三
題目21 求下面函式的返回值,輸入x 9999 微軟 int func x return countx 解答 其實這個程式的意思就是求9999的二進位制中有多少個1 別問我為什麼知道的,可以檢視劍指offer面試題10 知道了這個就很容易求解這個題目了!9 1024中含有1的個數為2 512中含有1...
C C 校招筆試面試經典題目總結六
解析 const int minnumber 32767 int find sec max int data int count else return sec max 解析 第一種 include using namespace std void main define int ptr int t...
C C 筆試經典題目
1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...