3.內功題
試題1:分別給出bool,int,float,指標變數 與「零值」比較的 if 語句(假設變數名為var)
解答:bool型變數:if(!var)
int型變數: if(var==0)
float型變數:
const float epsinon = 0.00001;
if ((x >= - epsinon) && (x <= epsinon)
指標變數: if(var==null)
剖析:考查對0值判斷的「內功」,bool型變數的0判斷完全可以寫成if(var==0),而int型變數也可以寫成if(!var),指標變數的判斷也可以寫成if(!var),上述寫法雖然程式都能正確執行,但是未能清晰地表達程式的意思。
一般的,如果想讓if判斷乙個變數的「真」、「假」,應直接使用if(var)、if(!var),表明其為「邏輯」判斷;如果用if判斷乙個數值型變數(short、int、long等),應該用if(var==0),表明是與0進行「數值」上的比較;而判斷指標則適宜用if(var==null),這是一種很好的程式設計習慣。
浮點型變數並不精確,所以不可將float變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。如果寫成if (x == 0.0),則判為錯,得0分。
試題2:以下為windows nt下的32位c++程式,請計算sizeof的值
void func ( char str[100] )
sizeof( str ) = ?
void *p = malloc( 100 );
sizeof ( p ) = ?
解答:sizeof( str ) = 4
sizeof ( p ) = 4
剖析:func ( char str[100] )函式中陣列名作為函式形參時,在函式體內,陣列名失去了本身的內涵,僅僅只是乙個指標;在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。
陣列名的本質如下:
(1)陣列名指代一種資料結構,這種資料結構就是陣列;
例如:char str[10];
cout << sizeof(str) << endl;
輸出結果為10,str指代資料結構char[10]。
(2)陣列名可以轉換為指向其指代實體的指標,而且是乙個指標常量,不能作自增、自減等操作,不能被修改;
char str[10];
str++; //編譯出錯,提示str不是左值
(3)陣列名作為函式形參時,淪為普通指標。
windows nt 32位平台下,指標的長度(占用記憶體的大小)為4位元組,故sizeof( str ) 、sizeof ( p ) 都為4。
試題3:寫乙個「標準」巨集min,這個巨集輸入兩個引數並返回較小的乙個。另外,當你寫下面的**時會發生什麼事?
least = min(*p++, b);
解答:#define min(a,b) ((a) <= (b) ? (a) : (b))
min(*p++, b)會產生巨集的***
剖析:這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,但是它終歸不是函式,而巨集定義中括弧中的「引數」也不是真的引數,在巨集展開的時候對「引數」進行的是一對一的替換。
程式設計師對巨集定義的使用要非常小心,特別要注意兩個問題:
(1)謹慎地將巨集定義中的「引數」和整個巨集用用括弧括起來。所以,嚴格地講,下述解答:
#define min(a,b) (a) <= (b) ? (a) : (b)
#define min(a,b) (a <= b ? a : b )
都應判0分;
(2)防止巨集的***。
巨集定義#define min(a,b) ((a) <= (b) ? (a) : (b))對min(*p++, b)的作用結果是:
((*p++) <= (b) ? (*p++) : (*p++))
這個表示式會產生***,指標p會作三次++自增操作。
除此之外,另乙個應該判0分的解答是:
#define min(a,b) ((a) <= (b) ? (a) : (b));
這個解答在巨集定義的後面加「;」,顯示編寫者對巨集的概念模糊不清,只能被無情地判0分並被面試官淘汰。
試題4:為什麼標準標頭檔案都有類似以下的結構?
#ifndef __incvxworksh
#define __incvxworksh
#ifdef __cplusplus
extern "c" {
#endif
#ifdef __cplusplus
#endif
#endif /* __incvxworksh */
解答:標頭檔案中的編譯巨集
#ifndef __incvxworksh
#define __incvxworksh
#endif
的作用是防止被重複引用。
作為一種物件導向的語言,c++支援函式過載,而過程式語言c則不支援。函式被c++編譯後在symbol庫中的名字與c語言的不同。例如,假設某個函式的原型為:
void foo(int x, int y);
該函式被c編譯器編譯後在symbol庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。_foo_int_int這樣的名字包含了函式名和函式引數數量及型別資訊,c++就是考這種機制來實現函式過載的。
為了實現c和c++的混合程式設計,c++提供了c連線交換指定符號extern "c"來解決名字匹配問題,函式宣告前加上extern "c"後,則編譯器就會按照c語言的方式將該函式編譯為_foo,這樣c語言中就可以呼叫c++的函式了。
變數 函式 試題 陣列 c++ 編輯
變數 函式 試題 陣列 c++儲存 取消
附加功能
使用簽名檔 道具:請選擇道具隱身草彩虹炫天使之愛 悄悄話 | (以小紙條形式傳送) 檢視今日免費傳送數量
馬上開通空間,體驗許可權日誌、記事本等全新日誌體驗!提交
C C 程式設計員應聘常見面試試題深入剖析
1.引言 本文的寫作目的並不在於提供c c 程式設計師求職面試指導,而旨在從技術上分析面試題的內涵。文中的大多數面試題來自各大論壇,部分試題解答也參考了的意見。許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業要求面試者寫乙個最簡單的strcpy函式都可看出面試者在 技術上究竟達到了怎樣...
C C 程式設計員應聘常見面試試題深入剖析
找錯題 試題1 void test1 試題2 void test2 strcpy string,str1 試題3 void test3 char str1 解答 我對這幾道題目的分析如下 1 字串和字元陣列char str1的異同點 通過例項說明 string str 0123456789 char...
C C 程式設計員應聘常見面試試題深入剖析
1.引言 本文的寫作目的並不在於提供c c 程式設計師求職面試指導,而旨在從技術上分析面試題的內涵。文中的大多數面試題來自各大論壇,部分試題解答也參考了的意見。許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業要求面試者寫乙個最簡單的strcpy函式都可看出面試者在技術上究竟達到了怎樣的...