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