c語言常見筆試題總結(jié)(13類+包括答案)_第1頁
c語言常見筆試題總結(jié)(13類+包括答案)_第2頁
c語言常見筆試題總結(jié)(13類+包括答案)_第3頁
c語言常見筆試題總結(jié)(13類+包括答案)_第4頁
c語言常見筆試題總結(jié)(13類+包括答案)_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

【1使用宏】1.1

#ifdefNDEBUG

#defineTRACE(S)S

#else

#defineTRACE(S)printf(”%s;\n”,#S);S

#endif問:以上TRACE()宏的作用是什么?1.2#error的作用?1.3定義一個宏,求出給定數(shù)組中的元素的個數(shù)

#defineNELEMENTS(array)??1.4定義一個宏,求出給定結(jié)構(gòu)中給定成員的偏移量

#defineOFFSET(structure,member)??【2數(shù)據(jù)聲明和定義】給定以下類型的變量a的定義式:a)Aninteger

b)Apointertoaninteger

c)Apointertoapointertoaninteger

d)Anarrayof10integers

e)Anarrayof10pointerstointegers

f)Apointertoanarrayof10integers

g)Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger

h)Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger【3復雜類型(1)】有如下表達式:char(*(*x())[])();請用文字描述x是什么?!?復雜類型(2)】jmp_buf的定義:typedefstruct_jmp_buf

{

REG_SETreg;

intextra[3];

}jmp_buf[1];setjmp函數(shù)的原型:externintsetjmp(jmp_buf__env);問:調(diào)用setjmp時傳遞__env的內(nèi)容,還是傳遞指針?【5頭文件】問:為什么標準頭文件都有類似以下的結(jié)構(gòu)?#ifndef__INCvxWorksh

#define__INCvxWorksh#ifdef__cplusplus

extern“C”{

#endif/*…*/#ifdef__cplusplus

}

#endif#endif/*__INCvxWorksh*/【6static關(guān)鍵字】請說出static關(guān)鍵字的3種用處:

(1)用于全局變量;

(2)用于局部變量;

(3)用于函數(shù)。/*file.c*/

staticinta;

intb;staticintfn()

{

staticintx;

inty;

}【7const關(guān)鍵字】7.1const關(guān)鍵字的意義是什么?

7.2解釋以下的變量定義:constinta1;

intconsta2;

constint*a3;

int*consta4;

intconst*consta5;【8volatile關(guān)鍵字】8.1volatile意義?例如

volatileint*p;8.2volatile能和const一起使用嗎?例如

volatileconstint*p;【9sizeof()】有以下定義:char*pmsg=“A”;

charmsg[]=“A”;

charch=‘A’;問:

sizeof(pmsg)=?

sizeof(msg)=?

sizeof(“A”)=?

sizeof(ch)=?

sizeof(‘A’)=?(在C++中等于多少?)voidf(charparam[100])

{

//sizeof(param)=?

}【10字符串】有以下代碼char*pmsg=“hello,world!”;

strcpy(pmsg,“hi,there.”);試評論該代碼?!?1混合運算】有以下代碼:voidfoo()

{

unsignedinta=6;

intb=-20;

(a+b>6)?puts(”大于6″):puts(”小于或等于6″);

}請問調(diào)用foo()的輸出【12內(nèi)存訪問】有以下代碼:voidfn()

{

inta[100];

int*p;p=(int*)((unsignedint)a+1);

printf(“p=0x%x\n”,*p);

}試評論以上代碼。【13C庫函數(shù)】請說明以下函數(shù)的意義:voidperror(constchar*__s);

fdprintf(int,constchar*,…);isspace(),isxdigit(),strerr(),sprintf()

答案,僅供參考:1.1這道題主要考察#的功能,S是一個表達式。TRACE()的作用就是在DEBUG狀態(tài)下,計算表達式S的值之前先打印S。1.2#error用于向編譯器報錯,并輸出它后面帶的錯誤信息。例如:

#ifndefSOMETHING

#errorSOMETHINGnotdefined!

#endif

如果在這段代碼之前未定義過SOMETHING,則在編譯時出錯,并給出”SOMETHINGnotdefined!”的錯誤信息。1.3#defineNELEMENTS(array)(sizeof(array)/sizeof((array)[0]))1.4#defineOFFSET(structure,member)((int)&(((structure*)0)->member))2(a)Aninteger:inta;

(b)Apointertoaninteger:int*a;

(c)Apointertoapointertoaninteger:int**a;

(d)Anarrayof10integers:inta[10];

(e)Anarrayof10pointerstointegers:int*a[10];

(f)Apointertoanarrayof10integers:int(*a)[10];

(g)Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger:int(*a)(int);

(h)Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger:int(*a[10])(int);3char(*(*x())[])();

這道題來自”TheCProgrammingLanguage”中的一個例子。char(*(*x())[])();首先,確定標識符:x

x是一個函數(shù),沒有參數(shù):x()

返回值是一個指針:*x()

這個指針指向一個數(shù)組:(*x())[]

數(shù)組中的每個元素是指針:*(*x())[]

指向一個不帶參數(shù)的函數(shù):(*(*x())[])()

函數(shù)的返回值是char:char(*(*x())[])()

這里,要知道*、()和[]的優(yōu)先級。4這個定義有點怪,它的意思是:jmp_buf這種類型是一個數(shù)組,只有一個元素,元素類型為struct{…}。數(shù)組名作為函數(shù)參數(shù)時,應(yīng)該是傳遞地址/指針。5在編譯源文件時,C編譯器和C++編譯器都會對符號(函數(shù)或變量)名作某些修正,但兩者采用的修正方法不同,所以兩者生成的目標文件不能互相鏈接。在C++中使用extern“C”可以讓C++符號獲得C鏈接特性。由于C++編譯器會自動定義__cplusplus宏,所以在C語言頭文件中采用這種結(jié)構(gòu)可以保證無論使用何種編譯器,生成的目標文件都具有C鏈接特性,能夠與標準C編譯器所生成的目標文件相鏈接。6(1)用于全局變量:外部靜態(tài)變量,只能在本源文件中被引用,不能被其它源文件所引用。

(2)用于局部變量:局部靜態(tài)變量,在函數(shù)返回后存儲單元不釋放;下一次調(diào)用該函數(shù)時,該變量為上次函數(shù)返回時的值。

(3)用于函數(shù):內(nèi)部函數(shù),只能被本源文件中的函數(shù)所調(diào)用,不能被其它源文件調(diào)用。7.1const關(guān)鍵字在C語言中用于聲明”常變量”,其值不可修改,但具有確定的數(shù)據(jù)類型。C編譯器總是為其分配相應(yīng)的存儲單元。

在C++中,const關(guān)鍵字用于聲明常量,C++編譯器視具體情況決定是為其分配存儲單元還是僅將其作為編譯期間的常量。7.2constinta1;a1是整型常量。

intconsta2;a2是整型常量。等同于constinta2;

constint*a3;a3是指針(a3是可變的),指向一個整型常量。等同于intconst*a3;

int*consta4;a4是常量指針(a4不可變),指向一個整型變量。

intconst*consta5;a5是常量指針(a5不可變),指向一個整型常量。等同于constint*consta5;8.1volatile關(guān)鍵字用于聲明內(nèi)存映射的易失型變量,這類變量的值隨時可能由于某種編譯器所不知道的原因(例如,外部設(shè)備對其寫入)所改變,所以編譯器在進行代碼優(yōu)化時不能對其做任何的假設(shè)和依賴。8.2volatile可以和const一起使用,不過很少見。

const關(guān)鍵字的意思是限制編程者自己不能修改變量的值;兩者并不矛盾。

例如一個內(nèi)存映射的、只讀的硬件寄存器,假設(shè)它的地址是p,則可以這樣聲明:volatileconstUINT32*p;9sizeof(pmsg)=指針變量的長度

sizeof(msg)=2(字符數(shù)組的長度)

sizeof(”A”)=2(字符串的長度)

sizeof(ch)=1(字符變量的長度)

sizeof(‘A’)=整型變量的長度(在C語言中,字符常量的數(shù)據(jù)類型實際上是int;在C++中,它的數(shù)據(jù)類型是char,從而原式等于1)

sizeof(param)=指針變量的長度(數(shù)組名作參數(shù)時,傳遞的是數(shù)組的起始地址)10這種寫法是和編譯器&操作系統(tǒng)相關(guān)的,所以不應(yīng)當這樣寫。在WIN2K+VC環(huán)境下debug程序時會出現(xiàn)異常。

不過這樣寫,編譯器不會報錯。按道理,”hello…”的類型是constchar[N],它是不能賦值給char*的,

因為會丟失常量屬性。但在const關(guān)鍵字成為C標準之前,大家都這樣寫程序,所以char*pmsg=“hello…”

這種寫法被給予特別豁免,即使在C++中也是如此,在”TheC++ProgrammingLanguage”的附錄里對此有討論?!癶ello,world!”是字符串常量(stringliteral),它的類型是constchar[N],N為字符串的長度(包括結(jié)尾的0)。

“TheCProgrammingLanguage”指出,寫字符串常量的結(jié)果是未定義的(undefined)。所以在有些平臺(操作系統(tǒng)+編譯器)

上程序不會出錯,而在其它平臺上程序出現(xiàn)異常。GNU手冊里這樣說:

Writingintostringconstantsisaverybadidea;“constants”shouldbeconstant.

不過在GNU中它提供另外的選擇:使用-fwritable-strings進行編譯就可以。那么,為什么不允許修改字符串常量呢(它不也在內(nèi)存中嗎)?

這可能和另外一個特點有關(guān),即重復字符串的合并?,F(xiàn)在的編譯器應(yīng)該會主動幫助我們合并程序中相同的字符串常量

以節(jié)省內(nèi)存。如果stringliteral可寫,就會出現(xiàn)問題。例如:

voidfoo()

{

printf(”%s\n”,“howareyou?”);

}

voidbar()

{

char*p=“howareyou?”;

strcpy(p,“WHOAREYOU?”);

}

調(diào)用foo()當然會打印”howareyou”。但如果編譯器合并字符串,那么先調(diào)用bar(),再調(diào)用foo(),foo()打印的就是

“WHOAREYOU?”。這當然不是我們想要的結(jié)果。

另外一方面,這樣寫也有問題(確實有人這么寫):

if(func()==“something”)

func()是:

char*func()

{

return“something”;

}

這就假設(shè)編譯器一定會幫我們合并字符串,然而那也不一定。11輸出”>6″。

混合運算時的數(shù)據(jù)類型轉(zhuǎn)換次序:int–>unsigned–>long–>double。

另外,char和short必定轉(zhuǎn)換為int,float必定轉(zhuǎn)換為double。12p=(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論