c c 筆試面試題 3

2021-04-09 10:34:00 字數 3297 閱讀 8141

1. 以下三條輸出語句分別輸出什麼?[c易]

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 ) << endl; // 輸出什麼?

cout << boolalpha << ( str3==str4 ) << endl; // 輸出什麼?

cout << boolalpha << ( str5==str6 ) << endl; // 輸出什麼?

答:分別輸出false,false,true。str1和str2都是字元陣列,每個都有其自己的儲存區,它們的值則是各儲存區首位址,不等;str3和str4同上,只是按const語義,它們所指向的資料區不能修改。str5和str6並非陣列而是字元指標,並不分配儲存區,其後的「abc」以常量形式存於靜態資料區,而它們自己僅是指向該區首位址的指標,相等。

2. 以下反向遍歷array陣列的方法有什麼錯誤?[stl易]

vector array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 3 );

for( vector::size_type i=array.size()-1; i>=0; --i ) // 反向遍歷array陣列

答:首先陣列定義有誤,應加上型別引數:vectorarray。其次vector::size_type被定義為unsigned int,即無符號數,這樣做為迴圈變數的i為0時再減1就會變成最大的整數,導致迴圈失去控制。

3. 以下兩條輸出語句分別輸出什麼?[c++難]

float a = 1.0f;

cout << (int)a << endl;

cout << (int&)a << endl;

cout << boolalpha << ( (int)a == (int&)a ) << endl; // 輸出什麼?

float b = 0.0f;

cout << (int)b << endl;

cout << (int&)b << endl;

cout << boolalpha << ( (int)b == (int&)b ) << endl; // 輸出什麼?

答:分別輸出false和true。注意轉換的應用。(int)a實際上是以浮點數a為引數構造了乙個整型數,該整數的值是1,(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)。因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。對b的兩種轉換意義同上,但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。

注意,程式的輸出會顯示(int&)a=1065353216,這個值是怎麼來的呢?前面已經說了,1以浮點數形式存放在記憶體中,按ieee754規定,其內容為0x0000803f(已考慮位元組反序)。這也就是a這個變數所佔據的記憶體單元的值。當(int&)a出現時,它相當於告訴它的上下文:「把這塊位址當做整數看待!不要管它原來是什麼。」這樣,內容0x0000803f按整數解釋,其值正好就是1065353216(十進位制數)。

通過檢視彙編**可以證實「(int)a相當於重新構造了乙個值等於a的整型數」之說,而(int&)的作用則僅僅是表達了乙個型別資訊,意義在於為cout《及==選擇正確的過載版本。

4. 以下**有什麼問題?[c++易]

struct test

test() {}

void fun() {}

};void main( void )

答:變數b定義出錯。按預設建構函式定義物件,不需要加括號。

5. 以下**有什麼問題?[c++易]

cout << (true?1:"1") << endl;

答:三元表示式「?:」問號後面的兩個運算元必須為同一型別。

6. 以下**有什麼問題?[stl易]

typedef vector intarray;

intarray array;

array.push_back( 1 );

array.push_back( 2 );

array.push_back( 2 );

array.push_back( 3 );

// 刪除array陣列中所有的2

for( intarray::iterator itor=array.begin(); itor!=array.end(); ++itor )

答:同樣有缺少型別引數的問題。另外,每次呼叫「array.erase( itor );」,被刪除元素之後的內容會自動往前移,導致迭代漏項,應在刪除一項後使itor--,使之從已經前移的下乙個元素起繼續遍歷。

8. 以下**能夠編譯通過嗎,為什麼?[c++易]

unsigned int const size1 = 2;

char str1[ size1 ];

unsigned int temp = 0;

cin >> temp;

unsigned int const size2 = temp;

char str2[ size2 ];

答:str2定義出錯,size2非編譯器期間常量,而陣列定義要求長度必須為編譯期常量。

9. 以下**中的輸出語句輸出0嗎,為什麼?[c++易]

struct cls

cls()

};cls obj;

cout << obj.m_i << endl;

答:不能。在預設建構函式內部再呼叫帶參的建構函式屬使用者行為而非編譯器行為,亦即僅執行函式呼叫,而不會執行其後的初始化表示式。只有在生成物件時,初始化表示式才會隨相應的建構函式一起呼叫。

10. c++中的空類,預設產生哪些類成員函式?[c++易]

答:class empty

;11. 寫乙個函式,完成記憶體之間的拷貝。[考慮問題是否全面]

答:void* mymemcpy( void *dest, const void *src, size_t count )

// b公有繼承自a,可以是間接繼承的

b. class b // b實現了隱式轉化為a的轉化

c. class a // a實現了non-explicit的引數為b(可以有其他帶預設值的引數)建構函式

d. a& operator= ( const a& ); // 賦值操作,雖不是正宗的隱式型別轉換,但也可以勉強算乙個

c c 筆試面試題 7

我沒有記錯的話是一道msn的筆試題,網上無意中看到的,拿來做了一下。題目是這樣的,給定乙個字串,乙個這個字串的子串,將第乙個字串反轉,但保留子串的順序不變。例如 輸入 第乙個字串 this is zhuxinquan s chinese site http www.zhuxinquan.com cn...

C C 筆試 面試題目總結,

基本都沒寫答案,查詢答案的過程就是學習的過程,會的也會引起一些思考。1.extern extern c 的作用,如何判斷一段程式是由c 編譯還是由c 編譯程式編譯的?2.程序和執行緒的區別和聯絡 3.inline 的作用 4.kmp演算法 5.函式呼叫方式 cdecl 堆疊由呼叫者清除 引數從右至左...

筆試面試題

1 昨天參加一公司筆試,給幾道演算法題整懵了,其實也不難,但好久沒有碰演算法,只是有思路,要讓我在這麼短的時間內寫出程式來還是不行。2 這裡將其中一道稍微複雜一點的演算法題寫下來,以此小結。3 4 題目描述 5 將n個雞蛋放入到m個籃子中去 n m 保證每個籃子中至少乙個雞蛋,然後指定乙個數x,要求...