打工人的面試題集錦
時(shí)間:2021-09-03 10:08:23
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]前言:?經(jīng)?;仡機(jī)/C面試題和筆試題,有助于我們對(duì)C/C基礎(chǔ)有一個(gè)新的認(rèn)識(shí)和記憶。在實(shí)際工作中,大部分人會(huì)被業(yè)務(wù)纏身,基礎(chǔ)慢慢的遺忘了,對(duì)很多基礎(chǔ)知識(shí)欲言又止!回顧筆試面試題目,會(huì)讓我們對(duì)基礎(chǔ)知識(shí)掌握更加牢固,同時(shí)筆試題也有助于我們開闊思路,提高編程能力,還有就是開源代碼閱讀,只...
前言:?經(jīng)?;仡機(jī)/C 面試題和筆試題,有助于我們對(duì)C/C 基礎(chǔ)有一個(gè)新的認(rèn)識(shí)和記憶。在實(shí)際工作中,大部分人會(huì)被業(yè)務(wù)纏身,基礎(chǔ)慢慢的遺忘了,對(duì)很多基礎(chǔ)知識(shí)欲言又止!回顧筆試面試題目,會(huì)讓我們對(duì)基礎(chǔ)知識(shí)掌握更加牢固,同時(shí)筆試題也有助于我們開闊思路,提高編程能力,還有就是開源代碼閱讀,只有不斷的回顧和學(xué)習(xí),才能不斷的進(jìn)步。加油吧!打工人!~面試題 1:內(nèi)存對(duì)齊的原則以及作用?
(1)結(jié)構(gòu)體內(nèi)的成員按自身長(zhǎng)度自對(duì)齊(32位機(jī)器上,如char=1,short=2,int=4,double=8),所謂自對(duì)齊是指該成員的起始地址必須是它自身長(zhǎng)度的整數(shù)倍。如int只能以0,4,8這類地址開始。
(2)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體的有效對(duì)齊值的整數(shù)倍(默認(rèn)以結(jié)構(gòu)體中最長(zhǎng)的成員長(zhǎng)度為有效值的整數(shù)倍,當(dāng)用#pragrma pack(n)指定時(shí),以n和結(jié)構(gòu)體中最長(zhǎng)的成員的長(zhǎng)度中較小者為其值)。即sizeof的值,必須是其內(nèi)部最大成員的整數(shù)倍,不足的要補(bǔ)齊。
例如:
class?A
{
????char?c;
????int?a;
????char?d;
};
?
cout?<?
class?B
{
????char?c;
????char?d;
????int?a;
};
?
cout?<sizeof(A)=12,sizeof(B)=8;
因?yàn)樽筮吺? (3) 4 1 (3)=12,而右邊是1 1 (2) 4=8。括號(hào)中為補(bǔ)齊的字節(jié)。
內(nèi)存對(duì)齊的作用:
1、平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2、性能原因:經(jīng)過內(nèi)存對(duì)齊后,CPU的內(nèi)存訪問速度大大提升。
面試題 2:變量的聲明和定義有什么區(qū)別為變量分配地址和存儲(chǔ)空間的稱為定義,不分配地址的稱為聲明。一個(gè)變量可以在多個(gè)地方聲明,但是只在一個(gè)地方定義。加入 extern 修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。說明:很多時(shí)候一個(gè)變量,只是聲明不分配內(nèi)存空間,直到具體使用時(shí)才初始化,分配內(nèi)存空間, 如外部變量。面試題 3:explicit關(guān)鍵字的作用C 中, 一個(gè)參數(shù)的 構(gòu)造函數(shù)(或者除了第一個(gè)參數(shù)外其余參數(shù)都有默認(rèn)值的多參構(gòu)造函數(shù)), 承擔(dān)了兩個(gè)角色。1 是個(gè) 構(gòu)造器 ,2 是個(gè)默認(rèn)且隱含的類型轉(zhuǎn)換操作符。
所以, 有時(shí)候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數(shù)構(gòu)造器的參數(shù)類型, 這時(shí)候 編譯器就自動(dòng)調(diào)用這個(gè)構(gòu)造器, 創(chuàng)建一個(gè)AAA的對(duì)象。
這樣看起來好象很酷, 很方便。但在某些情況下(見下面權(quán)威的例子), 卻違背了我們(程序員)的本意。這時(shí)候就要在這個(gè)構(gòu)造器前面加上explicit修飾, 指定這個(gè)構(gòu)造器只能被明確的調(diào)用/使用, 不能作為類型轉(zhuǎn)換操作符被隱含的使用。
class?Test1
{
public:
????Test1(int?n)
????{
????????num=n;
????}//普通構(gòu)造函數(shù)
private:
????int?num;
};
class?Test2
{
public:
????explicit?Test2(int?n)
????{
????????num=n;
????}//explicit(顯式)構(gòu)造函數(shù)
private:
????int?num;
};
int?main()
{
????Test1?t1=12;//隱式調(diào)用其構(gòu)造函數(shù),成功
????Test2?t2=12;//編譯錯(cuò)誤,不能隱式調(diào)用其構(gòu)造函數(shù)
????Test2?t2(12);//顯式調(diào)用成功
????return?0;
}
Test1的 構(gòu)造函數(shù)帶一個(gè)int型的參數(shù),代碼23行會(huì)隱式轉(zhuǎn)換成調(diào)用Test1的這個(gè)構(gòu)造函數(shù)。而Test2的構(gòu)造函數(shù)被聲明為explicit(顯式),這表示不能通過隱式轉(zhuǎn)換來調(diào)用這個(gè)構(gòu)造函數(shù),因此代碼24行會(huì)出現(xiàn)編譯錯(cuò)誤。
普通構(gòu)造函數(shù)能夠被 隱式調(diào)用。而explicit構(gòu)造函數(shù)只能被顯式調(diào)用。
面試題 4:寫出 bool 、int、 float、指針變量與“零值”比較的 if 語句bool 型數(shù)據(jù):?
if(?flag?)?
{?
??A;?
}?
else?
{?
? B;?
}?
int 型數(shù)據(jù):?
if(?0?!=?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
指針型數(shù):?
if(?NULL?==?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
float 型數(shù)據(jù):?
if?(?(?flag?>=?NORM?)?
(1)結(jié)構(gòu)體內(nèi)的成員按自身長(zhǎng)度自對(duì)齊(32位機(jī)器上,如char=1,short=2,int=4,double=8),所謂自對(duì)齊是指該成員的起始地址必須是它自身長(zhǎng)度的整數(shù)倍。如int只能以0,4,8這類地址開始。
(2)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體的有效對(duì)齊值的整數(shù)倍(默認(rèn)以結(jié)構(gòu)體中最長(zhǎng)的成員長(zhǎng)度為有效值的整數(shù)倍,當(dāng)用#pragrma pack(n)指定時(shí),以n和結(jié)構(gòu)體中最長(zhǎng)的成員的長(zhǎng)度中較小者為其值)。即sizeof的值,必須是其內(nèi)部最大成員的整數(shù)倍,不足的要補(bǔ)齊。
例如:
class?A
{
????char?c;
????int?a;
????char?d;
};
?
cout?<?
class?B
{
????char?c;
????char?d;
????int?a;
};
?
cout?<sizeof(A)=12,sizeof(B)=8;
因?yàn)樽筮吺? (3) 4 1 (3)=12,而右邊是1 1 (2) 4=8。括號(hào)中為補(bǔ)齊的字節(jié)。
內(nèi)存對(duì)齊的作用:
1、平臺(tái)原因(移植原因):不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺(tái)只能在某些地址處取某些特定類型的數(shù)據(jù),否則拋出硬件異常。
2、性能原因:經(jīng)過內(nèi)存對(duì)齊后,CPU的內(nèi)存訪問速度大大提升。
面試題 2:變量的聲明和定義有什么區(qū)別為變量分配地址和存儲(chǔ)空間的稱為定義,不分配地址的稱為聲明。一個(gè)變量可以在多個(gè)地方聲明,但是只在一個(gè)地方定義。加入 extern 修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。說明:很多時(shí)候一個(gè)變量,只是聲明不分配內(nèi)存空間,直到具體使用時(shí)才初始化,分配內(nèi)存空間, 如外部變量。面試題 3:explicit關(guān)鍵字的作用C 中, 一個(gè)參數(shù)的 構(gòu)造函數(shù)(或者除了第一個(gè)參數(shù)外其余參數(shù)都有默認(rèn)值的多參構(gòu)造函數(shù)), 承擔(dān)了兩個(gè)角色。1 是個(gè) 構(gòu)造器 ,2 是個(gè)默認(rèn)且隱含的類型轉(zhuǎn)換操作符。
所以, 有時(shí)候在我們寫下如 AAA = XXX, 這樣的代碼, 且恰好XXX的類型正好是AAA單參數(shù)構(gòu)造器的參數(shù)類型, 這時(shí)候 編譯器就自動(dòng)調(diào)用這個(gè)構(gòu)造器, 創(chuàng)建一個(gè)AAA的對(duì)象。
這樣看起來好象很酷, 很方便。但在某些情況下(見下面權(quán)威的例子), 卻違背了我們(程序員)的本意。這時(shí)候就要在這個(gè)構(gòu)造器前面加上explicit修飾, 指定這個(gè)構(gòu)造器只能被明確的調(diào)用/使用, 不能作為類型轉(zhuǎn)換操作符被隱含的使用。
class?Test1
{
public:
????Test1(int?n)
????{
????????num=n;
????}//普通構(gòu)造函數(shù)
private:
????int?num;
};
class?Test2
{
public:
????explicit?Test2(int?n)
????{
????????num=n;
????}//explicit(顯式)構(gòu)造函數(shù)
private:
????int?num;
};
int?main()
{
????Test1?t1=12;//隱式調(diào)用其構(gòu)造函數(shù),成功
????Test2?t2=12;//編譯錯(cuò)誤,不能隱式調(diào)用其構(gòu)造函數(shù)
????Test2?t2(12);//顯式調(diào)用成功
????return?0;
}
Test1的 構(gòu)造函數(shù)帶一個(gè)int型的參數(shù),代碼23行會(huì)隱式轉(zhuǎn)換成調(diào)用Test1的這個(gè)構(gòu)造函數(shù)。而Test2的構(gòu)造函數(shù)被聲明為explicit(顯式),這表示不能通過隱式轉(zhuǎn)換來調(diào)用這個(gè)構(gòu)造函數(shù),因此代碼24行會(huì)出現(xiàn)編譯錯(cuò)誤。
普通構(gòu)造函數(shù)能夠被 隱式調(diào)用。而explicit構(gòu)造函數(shù)只能被顯式調(diào)用。
面試題 4:寫出 bool 、int、 float、指針變量與“零值”比較的 if 語句bool 型數(shù)據(jù):?
if(?flag?)?
{?
??A;?
}?
else?
{?
? B;?
}?
int 型數(shù)據(jù):?
if(?0?!=?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
指針型數(shù):?
if(?NULL?==?flag?)?
{?
??A;?
}?
else?{?
? B;?
}?
float 型數(shù)據(jù):?
if?(?(?flag?>=?NORM?)?