c/c++程序員面試指南
面試題1:什么是c語(yǔ)言語(yǔ)句?
答:語(yǔ)句就是以分號”;”作為分隔符,編譯后產(chǎn)生機器指令的代碼,預處理指令不是語(yǔ)句。
面試題2:變量的聲明和定義有什么區別?
答:為變量分配地址和存儲空間的稱(chēng)為定義,不分配地址內存空間的稱(chēng)為聲明。一個(gè)變量可以在多個(gè)地方聲明,但是只在一個(gè)地方定義。加入extern修飾的是變量的聲明,說(shuō)明此變量將在文件以外或在文件后面部分定義。
面試題3:如何以最簡(jiǎn)單的方式讓電腦蜂鳴器發(fā)出聲音?
答:#include<stdio.h>
Int main(int argc, char *argv[])
{
Printf(“\
Return 0;
}
面試題4:談?wù)勀銓幊桃幏兜睦斫饣蛘J識?
答:編程規范可總結為:程序的可行性,可讀性,可移植性及可測試性。
面試題5:函數、變量等命名都有哪些規則?
答:含有數字,ASCII字母,下劃線(xiàn),以字母或者下劃線(xiàn)開(kāi)頭,不能用保留字作變量名的情況下,還要有很高的可讀性。
面試題6:寫(xiě)出bool,int,float,指針變量與“零值”比較的if語(yǔ)句?
答:bool型數據:
If(flag)
{
A;
}
Else
{
B;
}
Int 型數據:
If(0!=flag)
{
A;
}
Else
{
B;
}
指針型數據:
If(NULL==flag)
{
A;
}
Else
{
B;
}
Float型數據:
Const float NORM=0.00001;
If((flag>=NORM)&&(flag<=NORM))
{
A;
}
面試題7:short i=0;i=i+
以下這兩段代碼都是正確的嗎?
代碼一:
Short s1=1;s1=s1+
代碼二:
Short s1=1;s1+=
答:代碼一是錯的,代碼二是正確的。
“s1+
S1=(short)(s1+
第二段代碼中“+=”算符已經(jīng)執行了類(lèi)型強轉,所以不會(huì )出錯。
面試題8:char x[]={“abcd”}和char y[]={‘a(chǎn)’,’b’,’c’,’d’}有不同嗎?
答:不同。因為charx[]={“abcd”}這種寫(xiě)發(fā),是把字符串abcd包括結束符\0存到x。而char y[]={‘a(chǎn)’,’b’,’c’,’d’}這種是存儲4個(gè)字符a,b,c,d 到數組y。
面試題9:char型數據在內存中存儲形式?
答:ASCII碼
(任何數據在內存中都是以二進(jìn)制形式存放的,而數值是以補碼表示的。正數的補碼和原碼和其原碼的形式相同。負數的補碼方式是將其絕對值的二進(jìn)制形式“按位求反再加
面試題10:&&和&,||和|有什么區別?
答:(1)&和|對操作數進(jìn)行求值運算,&&和||只是判斷邏輯關(guān)系。
(2)&&和||在判斷左側操作數就能確定結果的情況下不再對右側操作數求值。
面試題11:什么是左值,什么是右指?
答:右值:存儲在某內存地址中的數據。也稱(chēng)為變量的數據。
左值:存儲數據值的那塊內存的地址。也稱(chēng)為變量的地址值。
(左值可以作為右值,但是右值不可以是左值)
面試題12:sizeof和strlen的區別
答:sizeof和strlen有以下區別:
(1) sizeof是一個(gè)操作符,strlen是庫函數。
(2) sizeof的參數可以是數據類(lèi)型,也可以是變量,而strlen只能以結尾’\
(3) 編譯器在編譯時(shí)就計算出了sizeof的結果,而strlen函數必須在運行時(shí)才能計算出來(lái),并且sizeof計算的是數據類(lèi)型占內存的大小,而strlen計算的字符串實(shí)際的長(cháng)度。
(4) 數組做sizeof的參數不退化,傳遞給strlen就退化為指針了。
(5) Sizeof和strlen的結果類(lèi)型都是size_t.
面試題13:結構體可以直接賦值嗎?
答:聲明時(shí)可以直接初始化,同一結構體的不同對象之間也可以直接賦值,但是當結構體中含有指針“成員”時(shí)一定要小心。(當有多個(gè)指針指向同一段內存是,某個(gè)指針釋放這段內存可能導致其他指針的非法操作。因此在釋放前一定要確保其他指針不再使用這段內存空間。)
面試題14:結構體內存對齊問(wèn)題?
答: 結構體作為一種復合數據類(lèi)型,其構成元素既可以是基本數據類(lèi)型的變量,也可以是一些復合型類(lèi)型數據。對此,編譯器會(huì )自動(dòng)進(jìn)行成員變量的對齊以提高運算速率,默認情況下,按自然對齊條件分配空間,各個(gè)成員按照它們被聲明的順序在內存中順序存儲,第一個(gè)成員的地址和整個(gè)結構的地址相同,向結構體成員中size最大的成員對齊。
位域的定義與結構體定義相仿,其形式為:
Struct 位域的結構名
{
位域列表
};
位域列表的形式為:
類(lèi)型說(shuō)明符 位域名:位域的長(cháng)度
例如:
Struct bs
{
Int a:8;
Int b:2;
Int c:6;
};
對于位域的定義,有以下幾點(diǎn)說(shuō)明:
(1) 一個(gè)位域必須存儲在同一個(gè)字節中, 不能跨兩個(gè)字節。如果一個(gè)字節所??臻g不夠存放另一位域時(shí),應從一下單元起存放該位域。也可以有意使某個(gè)位域從下一個(gè)單元開(kāi)始。
(2) 由于位域不允許跨兩個(gè)字節。因此位域的長(cháng)度不能大于一個(gè)字節的長(cháng)度。也就是不能超過(guò)8位二進(jìn)制。
(3) 位域可以無(wú)位域名,這時(shí)它只用來(lái)填充或調整位置。無(wú)名的位域是不能使用的。
面試題15:關(guān)鍵字static在c和c++中的區別?
答:在c中static用來(lái)修飾局部靜態(tài)變量和外部靜態(tài)變量 ,函數。而c++中除了上述功能外,還用來(lái)定義類(lèi)的成員變量和函數,即靜態(tài)成員和靜態(tài)成員函數。
面試題16:c語(yǔ)言的結構體和c++的有什么區別?(c語(yǔ)言的結構體和c++的類(lèi)有什么區別)
答:c語(yǔ)言的結構體和c++的結構體主要有以下區別:
(1) c語(yǔ)言的結構體是不能有函數成員的,而c++的類(lèi)可以有。
(2) c語(yǔ)言的結構體中數據成員沒(méi)有private、public和protected訪(fǎng)問(wèn)限定的。而c++的類(lèi)成員有這些訪(fǎng)問(wèn)限定(在c++中結構體的成員也有訪(fǎng)問(wèn)權限設定的,但是類(lèi)成員的默認訪(fǎng)問(wèn)屬性是private,而結構體的默認訪(fǎng)問(wèn)屬性是public。
(3) c語(yǔ)言的結構體是沒(méi)有繼承關(guān)系的,而c++的類(lèi)卻有豐富的繼承關(guān)系。
面試題17:c中的malloc和c++中的new有什么區別?
答:malloc和new有以下不同:
(1) new、delete是操作符,可以重載,只能在c++中使用。
(2) malloc、free是函數,可以覆蓋,c、c++中都可以使用。
(3) new可以調用對象的構造函數,對應的delete調用相應的析構函數。
(4) malloc僅僅分配內存,free僅僅回收內存。并不執行構造函數和析構函數。
(5) new,delete返回的是某種數據類(lèi)型指針,malloc、free返回的是void指針。
面試題18:c++的引用和c語(yǔ)言的指針有什么區別?
答:指針和引用主要有以下區別:
(1) 引用必須被初始化,但是不分配存儲空間,指針聲明時(shí)可以不初始化,在初始化的時(shí)候需要分配存儲空間。
(2) 引用初始化以后不能被改變,指針可以改變所指的對象。
(3) 不存在指向空值的引用。但是存在指向空值的指針。
第四章 預處理 保留字
預處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語(yǔ)法分析)之前所做的工作。預處理是c、c++語(yǔ)言的一個(gè)重要功能特性。它由預處理程序負責完成,。當對一個(gè)源文件進(jìn)行編譯時(shí),系統將自動(dòng)引用預處理程序對源程序中的預處理部分作處理,處理完畢自動(dòng)進(jìn)入源程序的編譯。
面試題19:簡(jiǎn)述#ifdef、#endif、#else和#ifndef的作用?
答:這些條件編譯指令主要有以下功能:
(1) 利用#ifdef、#endif可將某程序功能模塊包括進(jìn)去,以向特定用戶(hù)提供功能。
(2) 用于在子程序前加上標記,以便于追蹤和調式。
(3) 應對硬件的限制。
面試題20:宏定義和函數有什么區別?
答:
(1) 宏的引用只占用編譯時(shí)間,不占運行時(shí)間
(2) 宏的引用沒(méi)有返回值,如果需要,需給整個(gè)表達式加上括號。
(3) 宏的形參無(wú)類(lèi)型。函數的形參必須要有類(lèi)型。
(4) 實(shí)參為表達式的情況。如果沒(méi)有給表達式加上括號,可能會(huì )導致錯誤的結果,而函數不會(huì )
(5) 宏直接替代有可能導致副作用,函數不會(huì )。
面試題21:寫(xiě)一個(gè)“標準”宏min?(寫(xiě)一個(gè)“標準”宏min,這個(gè)宏輸入兩個(gè)參數并且返回較小的一個(gè))
答:#define MIN(a,b) ((a)>=(b)?(a):(b))
面試題22:typedef和define有什么區別?
答:
(1) 用法不同:typedef用來(lái)定義一種數據類(lèi)型的別名。增強程序的可讀性。Define主要用來(lái)定義常量。以及書(shū)寫(xiě)復雜,使用頻繁的宏。
(2) 執行時(shí)間不同:typedef是編譯過(guò)程的一部分,有類(lèi)型檢查的功能,define是宏定義,是預編譯的部分,其發(fā)生在編譯之前,只是簡(jiǎn)單地進(jìn)行字符串的替換。不進(jìn)行類(lèi)型的檢查
(3) 作用域的不同:typedef有作用域限定。Define不受作用域約束。只要是在define聲明后的引用都是正確的。
(4) 對指針的操作不同:typedef和define定義的指針有很大的區別。
(5) Typedef定義是語(yǔ)句,因為句尾要加分號,而define不是語(yǔ)句,不能在后面加分號。
面試題23:#define CHAR char*和typedef char * CHAR各有什么優(yōu)勢?
答:由define定義的類(lèi)型別名可以被其他修飾符擴展(如:unsigned),而typedef不可以。Define定義的類(lèi)型別名代表指針時(shí),其連續聲明的變量中只有第一個(gè)是指針。其他的均為非指針的普通變量,而typedef能夠保證連續聲明的所有變量均為同一類(lèi)型。
面試題24:談?wù)勀銓?/span>typedef的認識?
答:typedef共有四種用途:
(1) 定義一種類(lèi)型的別名
(2) 用在舊的c代碼中輔助聲明struct
(3) 定義與平臺無(wú)關(guān)的類(lèi)型
(4) 為復雜的聲明定義一個(gè)新的簡(jiǎn)單的別名
還有兩個(gè)注意事項:
(1) 定義了一種類(lèi)型的新別名后不能被其他的修飾符擴展。
(2) Typedef是并不真正影響對象的存儲特性的存儲類(lèi)關(guān)鍵字。
面試題25:關(guān)鍵字const是什么?
答:const用來(lái)定義一個(gè)只讀的變量或對象。主要優(yōu)點(diǎn):
(1) 便于類(lèi)型檢查、同宏定義一樣可以方便地進(jìn)行參數的修改和調整。
(2) 節省空間,避免不必要的內存分配
(3) 為函數重載提供參考
面試題26:const、define定義常量的區別?(常量有什么作用?const和define都可以用來(lái)定義常量,兩者區別?)
答:常量的引入可以增強程序的可讀性??梢允钩绦虻木S護和調式更加方便,使書(shū)寫(xiě)簡(jiǎn)便
兩者的區別如下:
(1) const定義的常量有數據類(lèi)型,而define沒(méi)有
(2) 很多集成開(kāi)發(fā)環(huán)境只支持對const定義的常量的調式,而不支持define定義的常量
(3) Const定義的常量是要分配內存空間,而define定義的常量卻不分配空間,所以const定義的常量比define定義的常量有更多的優(yōu)勢,可以說(shuō)const是對define的優(yōu)化。
面試題27:static有什么作用?
答:在c中,static主要定義全局靜態(tài)變量,定義局部靜態(tài)變量,定義靜態(tài)函數
(1) 定義全局靜態(tài)變量 :在全局變量前面加上關(guān)鍵字static,該全局變量變成了全局靜態(tài)變量。全局靜態(tài)變量有以下特點(diǎn):
(1) 在全局數據區內分配內存
(2) 如果沒(méi)有初始化,其默認值為0
(3) 該變量在本文件內從定義開(kāi)始到文件結束可見(jiàn)
(2) 定義局部靜態(tài)變量:在局部靜態(tài)變量前面加上關(guān)鍵字static,該局部變量便成了靜態(tài)局部變量。靜態(tài)局部變量有以下特點(diǎn):
(1) 該變量在全局數據區分配內存
(2) 如果不顯示初始化,那么將被隱式初始化為0
(3) 它始終駐留在全局數據區,直到程序運行結束
(4) 其作用域為局部作用域,當定義它的函數或語(yǔ)句塊結束時(shí),其作用域隨之結束。
(3) 定義靜態(tài)函數:在函數的返回類(lèi)型加上static關(guān)鍵字,函數即被定義成靜態(tài)函數。靜態(tài)函數有以下特點(diǎn):
(1) 靜態(tài)函數只能在本源文件中使用
(2) 在文件作用域中聲明的inline函數默認為static
在c++中新增了兩種作用:定義靜態(tài)數據成員或靜態(tài)函數成員
(1) 定義靜態(tài)數據成員。靜態(tài)數據成員有如下特點(diǎn):
(1) 內存分配:在程序的全局數據區分配
(2) 初始化和定義:靜態(tài)數據成員定義時(shí)要分配空間,所以不能在類(lèi)聲明中定義
(3) 靜態(tài)成員函數。靜態(tài)成員函數與類(lèi)相聯(lián)系,不與類(lèi)的對象相聯(lián)系。靜態(tài)成員函數不能訪(fǎng)問(wèn)非靜態(tài)數據成員。原因很簡(jiǎn)單,非靜態(tài)數據成員屬于特定的類(lèi)實(shí)例,主要用于對靜態(tài)數據成員的操作。
面試題29:extern有什么作用?
答:extern標識的變量或函數聲明定義在別的文件中,提示編譯器遇到的變量和函數時(shí)在其他模塊中尋找其定義
面試題30:如何避免野指針?
答:“野指針”產(chǎn)生原因及解決辦法如下:
(1) 指針變量聲明時(shí)沒(méi)有被初始化。解決辦法:指針聲明時(shí)初始化,可以是具體的地址值,也可以是讓它指向Null。
(2) 指針P被free或者delete之后,沒(méi)有置為Null。解決辦法:指針指向的內存空間被釋放后指針應用指向null。
(3) 指針操作超越了變量的作用范圍。解決辦法:在變量的作用域結束前釋放掉變量的地址空間并且讓指針指向Null。
面試題31:a和&a有什么區別?
答:數組名a可以作為數組的首地址,而&a是數組的指針。
面試題32:簡(jiǎn)述指針常量與常量指針的區別?
答:指針常量是指定義了一個(gè)指針,這個(gè)指針的值只能在定義時(shí)初始化,其他地方不能改變,常量指針是指定義了一個(gè)指針,這個(gè)指針指向一個(gè)只讀的對象,不能通過(guò)常量指針來(lái)改變這個(gè)對象的值。
指針常量強調的是指針的不可改變性,而常量指針強調的是指針對去所指對象的不可改變性。
面試題33:流操作符重載為什么返回引用?
答:在程序中,流操作符>>和<<經(jīng)常連續使用。因此這兩個(gè)操作符的返回值應該是一個(gè)仍舊支持這兩個(gè)操作符的流引用。其他的數據類(lèi)型都無(wú)法做到這一點(diǎn)。
面試題34:常引用有什么作用?
答:常引用的引用主要是為了避免使用變量的引用時(shí),在不知情的情況下改變變量的值。常引用主要用于定義一個(gè)普通變量的只讀屬性的別名,作為函數的傳人參數。避免實(shí)參在調用函數中被意外地改變。
面試題35:什么是引用?
答:引用就是一個(gè)目標變量的別名,對引用的一切操作和對變量的直接操作是一樣的,主要用做函數的參數,函數返回值和常引用。
面試題36:volatile有什么作用?
答:volatile有如下作用:
(1) 狀態(tài)寄存器一類(lèi)的并行設備硬件寄存器
(2) 一個(gè)中斷服務(wù)子程序會(huì )訪(fǎng)問(wèn)到的非自動(dòng)變量
(3) 多線(xiàn)程間被幾個(gè)任務(wù)共享的變量
面試題37:一個(gè)參數可以既是const又是volatile嗎?
答:可以,用const和volatile同時(shí)修飾變量,表示這個(gè)變量在程序內部是只讀的,不能改變的,只在程序外部條件變化下改變,并且編譯器不會(huì )優(yōu)化這個(gè)變量。每次使用這個(gè)變量時(shí),都要小心地去內存讀取這個(gè)變量的值,而不是去寄存器讀取它的備份。
面試題38:一個(gè)指針可以是volatile嗎?
答:可以。因為指針和普通變量一樣,有時(shí)也有變化程序的不可控性。常見(jiàn)的例子:子中斷服務(wù)子程序修改一個(gè)指向一個(gè)buffer的指針時(shí),必須用volatile來(lái)修飾這個(gè)指針。
聯(lián)系客服