C C 程式設計員應聘常見面試試題深入剖析之二

2021-08-25 04:06:54 字數 2936 閱讀 6668

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函式都可看出面試者在技術上究竟達到了怎樣的...