C C 筆試經典題目

2022-07-24 12:36:10 字數 4413 閱讀 6455

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 )

<<

endl;

//輸出什麼?

cout

<<

boolalpha

<<

( str3

==str4 )

<<

endl;

//輸出什麼?

cout

<<

boolalpha

<<

( str5

==str6 )

<<

endl;

//輸出什麼?

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

2. 以下**中的兩個sizeof用法有問題嗎?

void

uppercase(

char

str )

//將 str 中的小寫字母轉換成大寫字母

char

str ="

abcde";

cout

<<

"str字元長度為:

"<<

sizeof

(str)

/sizeof

(str[

0])

<<

endl;

uppercase( str );

cout

<<

str

<<

endl;

答:函式內的sizeof有問題。根據語法,sizeof如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。函式外的str是乙個靜態定義的陣列,因此其大小為6,函式內的str實際只是乙個指向字串的指標,沒有任何額外的與陣列相關的資訊,因此sizeof作用於上只將其當指標看,乙個指標為4個位元組,因此返回4。

3. 非c++內建型別 a 和 b,在哪幾種情況下b能隱式轉化為a?

答:a. class b : public a // b公有繼承自a,可以是間接繼承的

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

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

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

4. 以下**有什麼問題?

struct

test

test() {}

void

fun() {}

};void

main(

void

)

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

5. 以下**有什麼問題?

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

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

6. 以下**能夠編譯通過嗎,為什麼?

unsigned 

intconst

size1 =2

;char

str1[ size1 ];

unsigned

inttemp =0

;cin

>>

temp;

unsigned

intconst

size2

=temp;

char

str2[ size2 ];

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

7. 以下反向遍歷array陣列的方法有什麼錯誤?

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就會變成最大的整數,導致迴圈失去控制。

8. 以下**中的輸出語句輸出0嗎,為什麼?

struct cls

cls()

};cls obj;

cout << obj.m_i << endl;

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

9. c++中的空類,預設產生哪些類成員函式?

答:class empty

;10. 以下兩條輸出語句分別輸出什麼?

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《及==選擇正確的過載版本。

11. 以下**有什麼問題?

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--,使之從已經前移的下乙個元素起繼續遍歷。

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

答:

void

*mymemcpy(

void

*dest,

const

void

*src, size_t count )

else

return

dest;

}

C C 筆試題目

1.c語言中無符號數與有符號數 unsigned int a 6 int b 20 printf a b d n a b 輸出 14 printf a b s n a b 0 0 0 輸出a b 0 有符號數和無符號數在進行比較運算時 有符號數隱式的轉換成無符號數。上述中,a b的值為 14 111...

C C 校招筆試面試經典題目總結二

接著昨天的總結繼續。題目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 ...

C C 校招筆試面試經典題目總結三

題目21 求下面函式的返回值,輸入x 9999 微軟 int func x return countx 解答 其實這個程式的意思就是求9999的二進位制中有多少個1 別問我為什麼知道的,可以檢視劍指offer面試題10 知道了這個就很容易求解這個題目了!9 1024中含有1的個數為2 512中含有1...