當前位置:首頁 > 公眾號精選 > C語言與CPP編程
[導讀]前言:?經常回顧C/C面試題和筆試題,有助于我們對C/C基礎有一個新的認識和記憶。在實際工作中,大部分人會被業(yè)務纏身,基礎慢慢的遺忘了,對很多基礎知識欲言又止!回顧筆試面試題目,會讓我們對基礎知識掌握更加牢固,同時筆試題也有助于我們開闊思路,提高編程能力,還有就是開源代碼閱讀,只...

前言:?經?;仡機/C 面試題和筆試題,有助于我們對C/C 基礎有一個新的認識和記憶。在實際工作中,大部分人會被業(yè)務纏身,基礎慢慢的遺忘了,對很多基礎知識欲言又止!回顧筆試面試題目,會讓我們對基礎知識掌握更加牢固,同時筆試題也有助于我們開闊思路,提高編程能力,還有就是開源代碼閱讀,只有不斷的回顧和學習,才能不斷的進步。

加油吧!打工人!~

面試題 1:內存對齊的原則以及作用?
(1)結構體內的成員按自身長度自對齊(32位機器上,如char=1,short=2,int=4,double=8),所謂自對齊是指該成員的起始地址必須是它自身長度的整數倍。如int只能以0,4,8這類地址開始。
(2)結構體的總大小為結構體的有效對齊值的整數倍(默認以結構體中最長的成員長度為有效值的整數倍,當用#pragrma pack(n)指定時,以n和結構體中最長的成員的長度中較小者為其值)。即sizeof的值,必須是其內部最大成員的整數倍,不足的要補齊。
例如:
class?A
{
????char?c;
????int?a;
????char?d;
};
?
cout?<?
class?B
{
????char?c;
????char?d;
????int?a;
};
?
cout?<sizeof(A)=12,sizeof(B)=8;
因為左邊是1 (3) 4 1 (3)=12,而右邊是1 1 (2) 4=8。括號中為補齊的字節(jié)。
內存對齊的作用:
1、平臺原因(移植原因):不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常。
2、性能原因:經過內存對齊后,CPU的內存訪問速度大大提升。
面試題 2:變量的聲明和定義有什么區(qū)別為變量分配地址和存儲空間的稱為定義,不分配地址的稱為聲明。一個變量可以在多個地方聲明,但是只在一個地方定義。加入 extern 修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。說明:很多時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間, 如外部變量。面試題 3:explicit關鍵字的作用C 中, 一個參數的 構造函數(或者除了第一個參數外其余參數都有默認值的多參構造函數), 承擔了兩個角色。1 是個 構造器 ,2 是個默認且隱含的類型轉換操作符。
所以, 有時候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數構造器的參數類型, 這時候 編譯器就自動調用這個構造器, 創(chuàng)建一個AAA的對象。
這樣看起來好象很酷, 很方便。但在某些情況下(見下面權威的例子), 卻違背了我們(程序員)的本意。這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的調用/使用, 不能作為類型轉換操作符被隱含的使用。
class?Test1
{
public:
????Test1(int?n)
????{
????????num=n;
????}//普通構造函數
private:
????int?num;
};
class?Test2
{
public:
????explicit?Test2(int?n)
????{
????????num=n;
????}//explicit(顯式)構造函數
private:
????int?num;
};
int?main()
{
????Test1?t1=12;//隱式調用其構造函數,成功
????Test2?t2=12;//編譯錯誤,不能隱式調用其構造函數
????Test2?t2(12);//顯式調用成功
????return?0;
}
Test1的 構造函數帶一個int型的參數,代碼23行會隱式轉換成調用Test1的這個構造函數。而Test2的構造函數被聲明為explicit(顯式),這表示不能通過隱式轉換來調用這個構造函數,因此代碼24行會出現(xiàn)編譯錯誤。
普通構造函數能夠被 隱式調用。而explicit構造函數只能被顯式調用。
面試題 4:寫出 bool 、int、 float、指針變量與“零值”比較的 if 語句bool 型數據:?
if(?flag?)?
{?
??A;?
}?
else?
{?
? B;?
}?
int 型數據:?
if(?0?!=?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
指針型數:?
if(?NULL?==?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
float 型數據:?
if?(?(?flag?>=?NORM?)?
本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉
關閉