有了這樣的C++/C筆(bi)試題,再也(ye)不用擔心(xin)筆(bi)試了
時間(jian):2018-08-06 來源(yuan):未知
很多學(xue)嵌入式的人學(xue)出來(lai)都(dou)想面(mian)(mian)試通過(guo),找到自(zi)己中意(yi)的工作,但是(shi)很多時候,并不能(neng)如意(yi),下面(mian)(mian)是(shi)我(wo)去(qu)很多家公司面(mian)(mian)試做(zuo)的筆試題(ti),都(dou)總(zong)結(jie)到了一起,多總(zong)結(jie)一些還(huan)是(shi)很有用的嗎,快(kuai)快(kuai)收藏起來(lai)。
一、請填寫(xie)BOOL , float, 指針變量 與(yu)“零值”比較(jiao)的 if 語句。(10分(fen))
請寫出 BOOL flag 與“零值”比較的(de) if 語(yu)句(ju)。(3分)
標準答案:
if ( flag )
if ( !flag )
如下(xia)寫(xie)法(fa)均(jun)屬不良風格(ge),不得(de)分。
if (flag == TRUE)
if (flag == 1 )
if (flag == FALSE)
if (flag == 0)
請寫出 float x 與“零值”比(bi)較的(de) if 語(yu)句。(4分)
標準答案示例:
const float EPSINON = 0.00001;
if ((x >= - EPSINON) && (x <= EPSINON)
不可(ke)將浮點變量用“==”或“!=”與數字比較,應(ying)該設法轉化成“>=”或“<=”此類形式。
如(ru)下(xia)是錯誤的寫法,不得(de)分。
if (x == 0.0)
if (x != 0.0)
請(qing)寫出(chu) char *p 與“零值”比較的 if 語句。(3分)
標準答案:
if (p == NULL)
if (p != NULL)
如下(xia)寫法均(jun)屬不良風格,不得分。
if (p == 0)
if (p != 0)
if (p)
if (!)
二、以下(xia)為Windows NT下(xia)的(de)32位C++程序,請計算sizeof的(de)值(zhi)(10分(fen))
char str[] = “Hello” ;
char *p = str ;
int n = 10;
請計算
sizeof (str ) = 6 (2分)
sizeof ( p ) = 4 (2分(fen))
sizeof ( n ) = 4 (2分)
void Func ( char str[100])
{
請計算
sizeof( str ) = 4 (2分)
}
void *p = malloc( 100 );
請計算
sizeof ( p ) = 4 (2分)
三、簡(jian)答題(25分)
1、頭文件中的 ifndef/define/endif 干什么用?(5分)
答:防止(zhi)該頭(tou)文(wen)件(jian)被重復(fu)引用。
2、#include 和 #include “filename.h” 有什么區別(bie)?(5分)
答:對于#include ,編譯器從標準庫路徑開(kai)始(shi)搜索 filename.h
對于#include “filename.h” ,編譯器(qi)從(cong)用戶的工作(zuo)路徑開始搜索 filename.h
3、const 有什(shen)么(me)用途?(請至少說明兩種)(5分)
答:(1)可以定(ding)義 const 常量
(2)const可(ke)以修(xiu)飾函(han)(han)數(shu)的參數(shu)、返回(hui)值,甚至函(han)(han)數(shu)的定義體。被const修(xiu)飾的東西都受到強制保護,可(ke)以預防(fang)意(yi)外的變動,能提(ti)高程序(xu)的健壯性。
4、在(zai)C++ 程序中調用被(bei) C編(bian)譯器編(bian)譯后的函數,為什(shen)么要加(jia) extern “C”? (5分)
答(da):C++語(yu)(yu)言支持(chi)函(han)數(shu)重載(zai),C語(yu)(yu)言不(bu)支持(chi)函(han)數(shu)重載(zai)。函(han)數(shu)被C++編譯后在庫中(zhong)的(de)名字與C語(yu)(yu)言的(de)不(bu)同。假設某個函(han)數(shu)的(de)原型(xing)為: void foo(int x, int y);
該函數被C編譯(yi)器(qi)編譯(yi)后在庫中(zhong)的名字為_foo,而C++編譯(yi)器(qi)則會產生像_foo_int_int之(zhi)類(lei)的名字。
C++提供了(le)C連接交換(huan)指定符號extern“C”來解(jie)決名字匹配問題。
5、請簡述以(yi)下(xia)兩個for循環的優缺點(5分)
for (i=0; i
{
if (condition)
DoSomething();
else
DoOtherthing();
}
if (condition)
{
for (i=0; i
DoSomething();
}
else
{
for (i=0; i
DoOtherthing();
}
優點(dian):程(cheng)序(xu)簡潔
缺點:多執行了(le)N-1次(ci)邏(luo)輯判斷(duan),并且打斷(duan)了(le)循(xun)環(huan)“流水線(xian)”作業,使得編(bian)譯器不能對循(xun)環(huan)進行優(you)化處理,降低(di)了(le)效率(lv)。
優點:循環(huan)的效率高
缺點:程序不簡潔
四、有關內存的思考(kao)題(每(mei)小題5分,共20分)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請(qing)問(wen)運行Test函數會(hui)有(you)什么樣(yang)的結果?
答:程(cheng)序崩潰。
因(yin)為(wei)GetMemory并不能傳遞動態內存,
Test函數中的 str一直都(dou)是 NULL。
strcpy(str, "hello world");將使程序崩潰。
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請問運(yun)行Test函數會有(you)什么樣的結果?
答(da):可能(neng)是亂碼。
因為(wei)GetMemory返回的是(shi)指(zhi)(zhi)向“棧內存”的指(zhi)(zhi)針,該指(zhi)(zhi)針的地址不是(shi) NULL,但其原現的內容已經(jing)被清(qing)除(chu),新內容不可知。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請問運行(xing)Test函數會有什么樣的結果(guo)?
答:
(1)能(neng)夠輸出hello
(2)內(nei)存泄漏
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
請問運行Test函數會有什么(me)樣的結果?
答(da):篡改(gai)動態內(nei)存區(qu)的內(nei)容,后果(guo)難(nan)以(yi)預料,非常危險。
因(yin)為free(str);之后,str成為野(ye)指(zhi)針,
if(str != NULL)語句(ju)不起(qi)作(zuo)用。

