c筆試題匯總更新400道_第1頁(yè)
c筆試題匯總更新400道_第2頁(yè)
c筆試題匯總更新400道_第3頁(yè)
c筆試題匯總更新400道_第4頁(yè)
c筆試題匯總更新400道_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++筆試面試1000題

1.什么是“引用”?申明和使用“引用”要注意哪些問(wèn)題?

答:引用就是某個(gè)目標(biāo)變量的“別名”(alias),對(duì)應(yīng)用的操作與對(duì)變量直接操作

效果完全相同。申明一個(gè)引用的時(shí)候,切記要對(duì)其進(jìn)行初始化。引用聲明完畢后,

相當(dāng)于目標(biāo)變量名有兩個(gè)名稱(chēng),即該目標(biāo)原名稱(chēng)和引用名,不能再把該引用名作

為其他變量名的別名。聲明一個(gè)引用,不是新定義了一個(gè)變量,它只表示該引用

名是目標(biāo)變量名的一個(gè)別名,它本身不是一種數(shù)據(jù)類(lèi)型,因此引用本身不占存儲(chǔ)

單元,系統(tǒng)也不給引用分配存儲(chǔ)單元。不能建立數(shù)組的引用。

2.指針和引用的區(qū)別?

答:引用是在C++中引入的。它們之間的區(qū)別有:

(1)非空區(qū)別:指針可以為空,而引用不能為空

(2)可修改區(qū)別:如果指針不是常指針,那么就可以修改指向,而引用不能

(3)初始化區(qū)別:指針定義時(shí)可以不初始化,而引用在定義的時(shí)必須初始化

3、為什么構(gòu)造函數(shù)不能聲明為虛函數(shù)?

答:因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,虛調(diào)用是指允許在只知道部分信息的情

況下的工作機(jī)制,特別允許我們調(diào)用一個(gè)只知道接口而不知道其對(duì)象的準(zhǔn)確類(lèi)型

的函數(shù)。但是如果我們要調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),必須要知道對(duì)象的準(zhǔn)確類(lèi)型,

因此構(gòu)造函數(shù)不能為虛函數(shù)。

4.charstrl[]=wabc”;charstr2[]="abc";strl==str2為FALSE,因?yàn)閟trl

和str2是位于堆棧上的,它們占用不同的內(nèi)存空間。Constcharstr3[]="abc";

constcharstr4[]="abc";str3==str4為FALSE,同樣它們是位于堆棧上的內(nèi)存空

間,是不同的。Constchar*str5="abc”,constchar*str6="abc";char

*str7="abc",char*str8="abc",str5==str6str7==str8為T(mén)RUE,因?yàn)椤癮bc”是位

于文字常量區(qū)的,系統(tǒng)會(huì)將兒個(gè)“abc”進(jìn)行優(yōu)化,使它們位于同一塊內(nèi)存區(qū),因

此指針的指向也就相同了。

5.以下函數(shù)能求出數(shù)組的長(zhǎng)度嗎?

voidfun(charstr[]){intlen=sizeof(str)/sizeof(str[0]);}

答:不能,數(shù)組作為參數(shù)傳遞給函數(shù)時(shí),數(shù)組名被退化為指針,因此函數(shù)中的

sizeof(str)實(shí)際是在求一個(gè)指針的sizeof,答案為4,因此不能計(jì)算出數(shù)組的長(zhǎng)度。

6.類(lèi)的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?

答:類(lèi)的靜態(tài)成員每個(gè)類(lèi)只有一個(gè),靜態(tài)成員為所有類(lèi)的實(shí)例對(duì)象共享,靜態(tài)成

員有靜態(tài)成員變量和靜態(tài)成員函數(shù),靜態(tài)成員變量使用前必須初始化,靜態(tài)成員

變量可以被靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)訪問(wèn),而靜態(tài)成員函數(shù)只能訪問(wèn)靜態(tài)

成員變量,因?yàn)殪o態(tài)成員函數(shù)屬于類(lèi),其沒(méi)有this指針。非靜態(tài)成員每個(gè)對(duì)象都

有一個(gè)。

7.static的有什么作用(包括在類(lèi)中)?

答:(1)函數(shù)體內(nèi)的靜態(tài)變量,其值在函數(shù)的調(diào)用過(guò)程中保持不變。跟局部變量

的區(qū)別。

(2)在函數(shù)體外定義的靜態(tài)變量,限制了它的使用范圍只在于該子模塊,該

子模塊內(nèi)的函數(shù)都能訪問(wèn)它,但是子模塊外不能訪問(wèn),實(shí)際就類(lèi)似于是一個(gè)本地

的全局變量。與一般全局變量的區(qū)別。

(3)類(lèi)的靜態(tài)成員函數(shù)。

本質(zhì)上來(lái)說(shuō),static就是聲明了對(duì)象的生成期,限制了對(duì)象的作用域。

或(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的

內(nèi)存只能被分配一次,因此其值在下次函數(shù)調(diào)用時(shí)仍維持上次的值。

(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)的所有函數(shù)訪問(wèn),但不能被模塊

外其他函數(shù)訪問(wèn)。

(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個(gè)函數(shù)的使

用范圍被限制在聲明它的模塊。

(4)在類(lèi)中的static成員變量屬于整個(gè)類(lèi)所有,對(duì)類(lèi)的所有對(duì)象只有一份拷貝。

(5)在類(lèi)中的static成員函數(shù)屬于整個(gè)類(lèi)所有,這個(gè)函數(shù)不接受this指針,因

而只能訪問(wèn)類(lèi)的static成員變量。

8.寫(xiě)程序,將一個(gè)字符串倒序?

答:直接在main函數(shù)中實(shí)現(xiàn)的

voidmain()

{

char*source="hello";

char*des;

intlen=strlen(source);

des=(char*)malloc(len+l);〃申請(qǐng)空間必須是len+1,力口1是為了放結(jié)束符

if(!des){exit(l);}

char*s=&source[len-l];

char*d=des;

while(len—!=0){*d++=*s—;}

*d='\0';//必須要

cout?source?endl;

cout?des?endl;}

9.在C++程序中調(diào)用C編譯后的函數(shù),為什么要加externC的聲明?

答:因?yàn)镃++支持函數(shù)重載,而C不支持函數(shù)重載。函數(shù)被C++編譯后在庫(kù)中的

名字與C語(yǔ)言的不同。假設(shè)某個(gè)函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C

編譯器編譯后在庫(kù)中的名字為_(kāi)f。。,而C++編譯器則產(chǎn)生像_foo_int_int之類(lèi)的名

字。C++提供了C連接交換指定符號(hào)externC來(lái)解決名字匹配問(wèn)題。

10.C++中哪些函數(shù)不能被聲明為虛函數(shù)?

答:普通函數(shù)(非成員函數(shù)),構(gòu)造函數(shù),內(nèi)聯(lián)成員函數(shù)、靜態(tài)成員函數(shù)、友元函

數(shù)。

(1)虛函數(shù)用于基類(lèi)和派生類(lèi),普通函數(shù)所以不能

(2)構(gòu)造函數(shù)不能是因?yàn)樘摵瘮?shù)采用的是虛調(diào)用的方法,允許在只知道部分信息

的情況的工作機(jī)制,特別允許調(diào)用只知道接口而不知道對(duì)象的準(zhǔn)確類(lèi)型的方法,

但是調(diào)用構(gòu)造函數(shù)即使要?jiǎng)?chuàng)建一個(gè)對(duì)象,那勢(shì)必要知道對(duì)象的準(zhǔn)確類(lèi)型。

(3)內(nèi)聯(lián)成員函數(shù)的實(shí)質(zhì)是在調(diào)用的地方直接將代碼擴(kuò)展開(kāi)

(4)繼承時(shí),靜態(tài)成員函數(shù)是不能被繼承的,它只屬于一個(gè)類(lèi),因?yàn)橐膊淮嬖趧?dòng)

態(tài)聯(lián)編等

(5)友元函數(shù)不是類(lèi)的成員函數(shù),因此也不能被繼承

ll.include<filename.h>^Dinclude<<filename.hM的區(qū)別?

答:<>是從標(biāo)準(zhǔn)庫(kù)路徑搜索,是從用戶(hù)當(dāng)前工作目錄開(kāi)始,找不到,在到標(biāo)

準(zhǔn)庫(kù)開(kāi)始

12.編寫(xiě)strlen函數(shù),編寫(xiě)strcpy函數(shù)

答:

intStrlen(constchar*str){

intlen=0;

assert(str!=NULL);

while(*str++!=*\0'){len++;}

returnlen;}

非空判斷是必須進(jìn)行的操作,可以使用斷言的方式assert(str)!=NULL才會(huì)繼續(xù)

char*StrCpy(char*strDes,constchar*strSrc){

assert((strDes!=NULL)&&(strSrc!=NULL));

char*address=strDes;

while((*strDes++=*strSrc++)!='\0');

returnaddress;}

首先必須判斷兩個(gè)指針是否為空,由于復(fù)制后的指針需要返回,因此需要一個(gè)指針來(lái)記錄地址的初始值,最

后將復(fù)制的結(jié)果返回是為了進(jìn)行鏈?zhǔn)讲僮鳌?/p>

13Heap和Stack的區(qū)別?

答:Heap是堆,Stack是棧。

棧的空間由操作系統(tǒng)自動(dòng)分配和回收,而堆上的空間由程序員申請(qǐng)和釋

放。

棧的空間大小較小,而堆的空間較大。

棧的地址空間往低地址方向生長(zhǎng),而堆向高地址方向生長(zhǎng)。

棧的存取效率更高。

程序在編譯期間對(duì)變量和函數(shù)的內(nèi)存分配都在棧上,

且程序運(yùn)行過(guò)程中對(duì)函數(shù)調(diào)用中參數(shù)的內(nèi)存分配也是在棧上。

14.輸出的結(jié)果是多少,并分析過(guò)程?

unsignedshortA=10;

printf("%u\n",~A);

charch=128;

printf(a%d\n”,ch);

答:~A=4294967285,首先將A轉(zhuǎn)化為int類(lèi)型,即對(duì)應(yīng)的二進(jìn)制數(shù)值為:00000000

000000000000000000001010,~A=11111111111111111111111111110101,其實(shí)這

種情況最高位是1,認(rèn)為是負(fù)數(shù),但是在輸出中指定以無(wú)符號(hào)數(shù)輸出,于是結(jié)果為

4294967285=4294967295(四字節(jié)表示的最大數(shù))-10.

ch=128對(duì)應(yīng)的二進(jìn)制為:10000000,在輸出中以整數(shù)形式輸出,由于最高位是1,

于是就是負(fù)數(shù),10000000是該負(fù)數(shù)的補(bǔ)碼,根據(jù)求補(bǔ)碼的反步驟計(jì)算,先-1,得到

01111111,在取反得10000000=128,由于本身是負(fù)數(shù),即為128.

15、sizeof和strlen之間的區(qū)別?

答:(1)sizeof操作符的結(jié)果類(lèi)型是size_t,它在頭文件中的typedef為unsignedint

類(lèi)型,該類(lèi)型保證能容納實(shí)現(xiàn)所建立的最大對(duì)象的字節(jié)大小。

(2)sizeof是運(yùn)算符,strlen是函數(shù)

(3)sizeof可以用類(lèi)型做參數(shù),strlen只能用char*做參數(shù),且必須是

以‘\0'結(jié)尾的。

(4)數(shù)組做sizeof的參數(shù)不退化,傳遞給strlen就退化為指針。

(5)大部分編譯程序在編譯的時(shí)候就把sizeof計(jì)算過(guò)了,是類(lèi)型或是變量

的長(zhǎng)度。

(6)strlen的結(jié)果要在運(yùn)行的時(shí)候才能計(jì)算出來(lái),用來(lái)計(jì)算字符串的長(zhǎng)度,

而不是類(lèi)型占用內(nèi)存的大小。

(7)sizeof后如果是類(lèi)型必須加括號(hào),如果是變量名可以不加括號(hào)。

(8)當(dāng)使用了一個(gè)結(jié)構(gòu)類(lèi)型或變量時(shí),sizeof返回實(shí)際的大小。

(9)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)傳的是指針而不是數(shù)組,傳遞的是數(shù)組

的首地址。

(10)計(jì)算結(jié)構(gòu)變量的大小就必須討論數(shù)組對(duì)齊問(wèn)題。

(11)sizeof操作符不能用于函數(shù)類(lèi)型,不完全類(lèi)型或位字段。

16.內(nèi)聯(lián)函數(shù)和宏的差別?

答:內(nèi)聯(lián)函數(shù)和普通函數(shù)相比可以加快程序運(yùn)行的速度,因?yàn)椴恍枰袛嗾{(diào)用,

在編譯的時(shí)候內(nèi)聯(lián)函數(shù)可以直接被鑲嵌到目標(biāo)代碼中,而宏只是一個(gè)簡(jiǎn)單的替換。

內(nèi)聯(lián)函數(shù)要做參數(shù)類(lèi)型檢查,這是與宏相比的優(yōu)勢(shì)。

Inline是指嵌入代碼,就是在調(diào)用函數(shù)的地方不是跳轉(zhuǎn),而是把代碼直接寫(xiě)到

那里去。對(duì)于短小的代碼來(lái)說(shuō),inline可以帶來(lái)一定效率的提升,而且和C時(shí)代的

宏函數(shù)相比,inline更安全可靠。可是這是以增加空間消耗為代價(jià)的。

Inline一般只適用于:一個(gè)函數(shù)被不斷地重復(fù)調(diào)用;函數(shù)只有簡(jiǎn)單的兒行,且

函數(shù)內(nèi)不能含有forwhileswitch語(yǔ)句。

17.請(qǐng)找出下面代碼中的所以錯(cuò)誤

說(shuō)明:以下代碼是把一個(gè)字符串倒序,如“abed”倒序后變?yōu)椤癲eba”

Sinclude“string,h”

main(){

char*src="hello,world;

char*dest=NULL;

intlen=strlen(sre);

dest=(char*)malloc(len);

char*d=dest;

char*s=src[len];

while(len-!=0)

d++=s-;

printf("/s”,dest);

return0;

)

答:

方法L

intmain(){

char*sre="hello,world”;

intlen=strlen(src);

char*dest=(char*)malloc(len+1);〃要為\0分配一個(gè)空間

char*d=dest;

char*s=&src[lenT];〃指向最后一個(gè)字符

while(len-!=0)

*d++=*s-;

*d=0;〃尾部要加\0

printf("%s\n",dest);

free(dest);〃使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露

return0;

)

18.用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能?要求給出算法和思路!

設(shè)2個(gè)棧為A,B,一開(kāi)始均為空.

入隊(duì):

將新元素push入棧A;

出隊(duì):

⑴判斷棧B是否為空;

⑵如果不為空,則將棧A中所有元素依次pop出并push到棧B;

(3)將棧B的棧頂元素pop出;這樣實(shí)現(xiàn)的隊(duì)列入隊(duì)和出隊(duì)的平攤復(fù)雜度都還是

0(1),比上面的幾種方法要好

19.下面的程序中x是多少?

enumstring{xl,x2,x3=10,x4,x5,}x;

x=0X801005,0x8010f4;

20多態(tài)的作用?

主要是兩個(gè):L隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼

重用;2.接口重用:為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例

的某一屬性時(shí)的正確調(diào)用。

21.Newdelete與mallocfree的聯(lián)系與區(qū)別?

都是在堆(heap)上進(jìn)行動(dòng)態(tài)的內(nèi)存操作。用malloc函數(shù)需要指定內(nèi)存分配的字節(jié)

數(shù)并且不能初始化對(duì)象,new會(huì)自動(dòng)調(diào)用對(duì)象的構(gòu)造函數(shù)。delete會(huì)調(diào)用對(duì)象的

destructor,而free不會(huì)調(diào)用對(duì)象的destructor.

22.#defineDOUBLE(x)x+x,i=5*D0UBLE(5);i是多少?

答案:i為30。

23.局部變量能否和全局變量重名

答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用〃::“

局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部

變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)可以定義多

個(gè)同

名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變

量的作用域就在那個(gè)循環(huán)體內(nèi)。2、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量答:

extern

可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)

引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫(xiě)錯(cuò)了,那么在編譯期間

會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間

不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)

24全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中為什么

答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量。

可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中

對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)

25.設(shè)有以下說(shuō)明和定義:

typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;)too;

DATEmax;

則語(yǔ)句printf(H%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是:52

答:DATE是一個(gè)union,變量公用空間.里面最大的變量類(lèi)型是int[5],占用20個(gè)字節(jié).所以它

的大小是20data是一個(gè)struct,每個(gè)變量分開(kāi)占用空間.依次為int4+DATE20+doubles=32.

所以結(jié)果是20+32=52.當(dāng)然…在某些16位編輯器下,ini可能是2字節(jié),那么結(jié)果

是int2+DATE10+double8=2

26.unsignedshorthash(unsignedshortkey){return(key?)%256}

請(qǐng)問(wèn)hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.32

27請(qǐng)問(wèn)下面程序有什么錯(cuò)誤?

inta[60][250][1000],i,j,k;

for(k=0;k<=1000;k++)

for(j=0;j<250;j++)

for(i=0;i<60;i++)

a[j][k]=O;把循環(huán)語(yǔ)句內(nèi)外換一下

28下面程序的打印結(jié)果是什么?請(qǐng)分析

#defineMax_CB500

voidLmiQueryCSmd(StructMSgCB*pmsg){

unsignedcharucCmdNum;

for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum+4-){......;}死循環(huán),unsignedint值

范圍是0~255

29.各種類(lèi)型與0值的比較

請(qǐng)寫(xiě)出BOOLflag與“零值”比較的if語(yǔ)句。

標(biāo)準(zhǔn)答案:if(flag)或者if(!flag)

如下寫(xiě)法均屬不良風(fēng)格,不得分。if(flag==TRUE)

if(flag==1)if(flag==FALSE)if(flag==0)

請(qǐng)寫(xiě)出floatx與“零值”比較的if語(yǔ)句。(4分)標(biāo)準(zhǔn)答案示例:

constfloatEPSINON=0.00001;

if((x>=-EPSINON)&&(x<=EPSINON)

不可將浮點(diǎn)變量用或“!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化成“>="或“<二”此類(lèi)形式

如下是錯(cuò)誤的寫(xiě)法,不得分。if(x==0.0)if(x!=0.0)

請(qǐng)寫(xiě)出char*p與“零值”比較的if語(yǔ)句。(3分)標(biāo)準(zhǔn)答案:if(p==NULL)

if(p!=NULL)

如下寫(xiě)法均屬不良風(fēng)格,不得分。if(p==0)if(p!=0)if(p)if(!)

30編寫(xiě)類(lèi)String的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù)

已知類(lèi)Siring的原型為:

classString{

public:

String(constchar*str=NULL);//普通構(gòu)造函數(shù)

String(constString&other);//拷貝構(gòu)造函數(shù)

~String(void);〃析構(gòu)函數(shù)

String&operate=(constString&other);//賦值函數(shù)

private:

char*m_data;〃用于保存字符串);

請(qǐng)編寫(xiě)String的上述4個(gè)函數(shù)。標(biāo)準(zhǔn)答案:、

String::-String(void)〃3分{

delete[]m_data;

〃由于m_data是內(nèi)部數(shù)據(jù)類(lèi)型,也可以寫(xiě)成deletem_data;

)

//String的普通構(gòu)造函數(shù)String::String(constchar*str)〃6分{

if(str==NULL){

m_data=newchar[l];//若能加NULL判斷則更好

*m_data=<\0,;}else

(

intlength=strlen(str);

String::-String(void)〃3分{

delete[]m_data;

〃由于m_data是內(nèi)部數(shù)據(jù)類(lèi)型,也可以寫(xiě)成deletem_data;

)

“String的普通構(gòu)造函數(shù)

String::String(constchar*str)〃6分{

if(str==NULL){

m_data=newchar[l];〃若能力I」NULL判斷則更好

*m_data=<\0,;}

else

intlength=strlen(str);

strcpy(m_data,other.m_data);}

〃賦值函數(shù)

String&String::operate=(constString&other)〃13分(

〃(1)檢查自賦值〃4分if(this==&other)

return*this;〃文章來(lái)源草根IT

〃⑵釋放原有的內(nèi)存資源〃3分

delete[]m_data;

//(3)分配新的內(nèi)存資源,并復(fù)制內(nèi)容〃3分

intlength=strlen(other.m_data);

m_data=newchar[length+l];//若能加NULL判斷則更好

strcpy(m_data,other.m_data)

//(4)返回本對(duì)象的引用〃3分

return*this;}

31引用”與指針的區(qū)別是什么?

指針通過(guò)某個(gè)指針變量指向一個(gè)對(duì)象后,對(duì)它所指向的變量間接操作。程序中使用指針,程序

的可讀性差;而引用本身就是目標(biāo)變量的別名,對(duì)引用的操作就是對(duì)目標(biāo)變量的操作。此外,

就是上面提到的對(duì)函數(shù)傳ref和pointer的區(qū)別

32結(jié)構(gòu)與聯(lián)合有和區(qū)別?

1.結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類(lèi)型成員組成,但在任何同一時(shí)刻,聯(lián)合中只存放了

一個(gè)被選中的成員(所有成員共用一塊地址空間),而結(jié)構(gòu)的所有成員都存在(不同成員的存

放地址不同)。

2.對(duì)于聯(lián)合的不同成員賦值,將會(huì)對(duì)其它成員重寫(xiě),原來(lái)成員的值就不存在了,而對(duì)于結(jié)

構(gòu)的不同成員賦值是互不影響的

33.下面關(guān)于“聯(lián)合”的題目的輸出?

a)#include<stdio.h>union{

inti;

charx[2];}a;

voidmain(){

a.xfO]=10;a.x[l]=1;printf("%dH,a.i);}

答案:266(低位低地址,高位高地址,內(nèi)存占用情況是OxOlOA)

b)main(){

union{/*定義一個(gè)聯(lián)合*/

inti;

struct{/*在聯(lián)合中定義一個(gè)結(jié)構(gòu)*/

charfirst;charsecond;}half;}number;

number.i=0x4241;/*聯(lián)合成員賦值*/

prinlf("%c%c\n",number.half.first,mumber.half.second);

number.half.first='a,;/*聯(lián)合中結(jié)構(gòu)成員賦值*/

number.half.second=,b,;

getch();}

答案:AB(0x41對(duì)應(yīng),A',是低位;0x42對(duì)應(yīng)B,是高位)6261(number.i和number.half

共用一塊地址空間)

34關(guān)聯(lián)、聚合(Aggregation)以及組合(Composition)的區(qū)別?

涉及到UML中的一些概念:關(guān)聯(lián)是表示兩個(gè)類(lèi)的一般性聯(lián)系,比如“學(xué)生”和“老師”

就是一種關(guān)聯(lián)關(guān)系;聚合表示has-a的關(guān)系,是一種相對(duì)松散的關(guān)系,聚合類(lèi)不需要對(duì)被聚合

類(lèi)負(fù)責(zé),如下圖所示,用空的菱形表示聚合關(guān)系:

從實(shí)現(xiàn)的角度講,聚合可以表示為:

classA{...}classB{A*a;..…}而組合表示contains-a的關(guān)系,關(guān)聯(lián)性強(qiáng)于聚合:組合類(lèi)

與被組合類(lèi)有相同的生命周期,組合類(lèi)要對(duì)被組合類(lèi)負(fù)責(zé),采用實(shí)心的菱形表示組合關(guān)

系:實(shí)現(xiàn)的形式是:

classA{...}classB{Aa;...}

35面向?qū)ο蟮娜齻€(gè)基本特征,并簡(jiǎn)單敘述之?

1.封裝:將客觀事物抽象成類(lèi),每個(gè)類(lèi)對(duì)自身的數(shù)據(jù)和方法實(shí)行protection(private,protected,

public)2.繼承:廣義的繼承有三種實(shí)現(xiàn)形式:實(shí)現(xiàn)繼承(指使用基類(lèi)的屬性和方法而無(wú)需

額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀和實(shí)現(xiàn)代碼)、接口繼承(僅使用屬性

和方法,實(shí)現(xiàn)滯后到子類(lèi)實(shí)現(xiàn))。前兩種(類(lèi)繼承)和后一種(對(duì)象組合=>接口繼承以及純虛

函數(shù))構(gòu)成了功能復(fù)用的兩種方式。

3.多態(tài):是將父對(duì)象設(shè)置成為和一個(gè)或更多的他的子對(duì)象相等的技術(shù),賦值之后,父對(duì)象就

可以根據(jù)當(dāng)前賦值給它的子對(duì)象的特性以不同的方式運(yùn)作。簡(jiǎn)單的說(shuō),就是一句話:允許將子

類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針

36.重載(overload)和重寫(xiě)(overried,有的書(shū)也叫做“覆蓋”)的區(qū)別?

重載:是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同(或許參數(shù)個(gè)數(shù)不同,或許參數(shù)

類(lèi)型不同,或許兩者都不同)。重寫(xiě):是指子類(lèi)重新定義復(fù)類(lèi)虛函數(shù)的方法。從實(shí)現(xiàn)原理

上來(lái)說(shuō):重載:編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱(chēng)做修飾,然后這些同名函數(shù)

就成了不同的函數(shù)(至少對(duì)于編譯器來(lái)說(shuō)是這樣的)。如,有兩個(gè)同名函數(shù):functionfunc(p:

integer):integer;和functionfunc(p:string):integer;?那么編譯器做過(guò)修飾后的函數(shù)名稱(chēng)

可能是這樣的:int_func、stjfunc.對(duì)于這兩個(gè)函數(shù)的調(diào)用,在編譯器間就已經(jīng)確定了,是靜態(tài)

的。也就是說(shuō),它們的地址在編譯期就綁定了(早綁定),因此,重載和多態(tài)無(wú)關(guān)!重寫(xiě):

和多態(tài)真正相關(guān)。當(dāng)子類(lèi)重新定義了父類(lèi)的虛函數(shù)后,父類(lèi)指針根據(jù)賦給它的不同的子類(lèi)指針,

動(dòng)態(tài)的調(diào)用屬于子類(lèi)的該函數(shù),這樣的函數(shù)調(diào)用在編譯期間是無(wú)法確定的(調(diào)用的子類(lèi)的虛函

數(shù)的地址無(wú)法給出)。因此,這樣的函數(shù)地址是在運(yùn)行期綁定的(晚綁定)

37多態(tài)的作用是什么?

主要是兩個(gè):1.隱藏實(shí)現(xiàn)細(xì)節(jié),使得代碼能夠模塊化;擴(kuò)展代碼模塊,實(shí)現(xiàn)代碼重用;2.接

口重用:為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調(diào)用

38若沒(méi)有定義拷貝構(gòu)造函數(shù),則編譯器自動(dòng)生成一個(gè)缺省的拷貝構(gòu)造函數(shù),它可能會(huì)產(chǎn)生什

么問(wèn)題?

淺拷貝問(wèn)題,主要原因?yàn)轭?lèi)中如果有指針成員變量時(shí),當(dāng)調(diào)用拷貝構(gòu)造函數(shù)時(shí)只拷貝地址從

而使兩個(gè)對(duì)象的指針變量指向了一個(gè)地址空間。

39簡(jiǎn)述成員函數(shù)、全局函數(shù)和友元函數(shù)的差別。

成員函數(shù)只能由該類(lèi)所實(shí)例化的對(duì)象來(lái)進(jìn)行調(diào)用。[靜態(tài)成員除外]

全局函數(shù)可以在任意位置進(jìn)行調(diào)用。

友元函數(shù)可以讓本類(lèi)和友元類(lèi)對(duì)象調(diào)用。

40.簡(jiǎn)述結(jié)構(gòu)化的程序設(shè)計(jì)、面向?qū)ο蟮某绦蛟O(shè)計(jì)的基本思想。

結(jié)構(gòu)化程序設(shè)計(jì)為從程序代碼的開(kāi)始處按照順序方式執(zhí)行至代碼的結(jié)束位置。是一種順序的方

式,函數(shù)與變量沒(méi)有明顯的聯(lián)系,面向?qū)ο笾饕烟幚硎虑榈氖挛锖头椒ńY(jié)合為一體成為一

個(gè)類(lèi),一個(gè)類(lèi)具備處理一件事情的數(shù)據(jù)變量和處理方法,把數(shù)據(jù)和方法有機(jī)的結(jié)合為了一體,

使每一件事情都具備一定的獨(dú)立性,形成一個(gè)模塊。增加了內(nèi)聚性,降低了耦合性。同時(shí)也增

加了代碼的可讀性以及代碼的重用性。

41結(jié)構(gòu)struct和類(lèi)class有什么異同?

在c語(yǔ)言中struct只能對(duì)數(shù)據(jù)進(jìn)行聚合,而C++的class把數(shù)據(jù)以及對(duì)數(shù)據(jù)的處理方法也同時(shí)聚

合為?體,增加了內(nèi)聚性。止匕外class擁有可再生性和可抽象性,實(shí)現(xiàn)的代碼的復(fù)用。集中體

現(xiàn)在派生的功能和多態(tài)的功能。同時(shí)class也比struct具備更好的封裝性,體現(xiàn)在三種訪問(wèn)權(quán)

限上。

在C++中的struct和class的結(jié)構(gòu)基本一致,只是struct的默認(rèn)權(quán)限為Public而class為private0

42C++是不是類(lèi)型安全的?

答案:不是。兩個(gè)不同類(lèi)型的指針之間可以強(qiáng)制轉(zhuǎn)換(用reinterpretcast)。C#是類(lèi)型安全

的。

43簡(jiǎn)述數(shù)組與指針的區(qū)別?

數(shù)組要么在靜態(tài)存儲(chǔ)區(qū)被創(chuàng)建(如全局?jǐn)?shù)組),要么在棧上被創(chuàng)建。指針可以隨時(shí)指向任

意類(lèi)型的內(nèi)存塊。(1)修改內(nèi)容上的差別

chara[]="hello";a[0]='X';

char*p="world";〃注意p指向常量字符串

p[0]='X';〃編譯器不能發(fā)現(xiàn)該錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤

(2)用運(yùn)算符sizeof可以計(jì)算出數(shù)組的容量(字節(jié)數(shù))。sizeof(p),p為指針得到的是

一個(gè)指針變量

的字節(jié)數(shù),而不是p所指的內(nèi)存容量。C++/C語(yǔ)言沒(méi)有辦法知道指針?biāo)傅膬?nèi)存容量,除非

在申請(qǐng)內(nèi)存時(shí)記住它。注意當(dāng)數(shù)組作為函數(shù)的參數(shù)進(jìn)行傳遞時(shí),該數(shù)組自動(dòng)退化為同類(lèi)型的指

針。

chara[]="helloworld";char*p=a;cout?sizeof(a)?endl;//12字

節(jié)cout?sizeof(p)?endl;//4字節(jié)計(jì)算數(shù)組和指針的內(nèi)存容

量voidFunc(chara[100]){cout?sizeof(a)?endl;//4字節(jié)不是100字節(jié))

44如何判斷一段程序是由C編譯程序還是由C++編譯程序編譯的?

答案:#ifdef_cpluspluscout?"c++";#elsecout?"c";#endif

45.main主函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,給出說(shuō)明?

答案:可以,可以用_onexit注冊(cè)一個(gè)函數(shù),它會(huì)在main之后執(zhí)行intfnl(void),fn2

(void),fn3(void),fn4(void);voidmain(void){

Stringstr("zhanglin");_onexit(fnl);_onexit(fn2);_onexit(fn3);_onexit(fn4);

printf("ThisisexecutedfirstAn");}

intfnl(){printf(Hnext.\n");return0;}

intfn2(){printf("executed");return0;}

intfn3(){printf("is");return0;}

intfn4(){printf('This*');return0;}

46文件中有一組整數(shù),要求排序后輸出到另一個(gè)文件中

#include<iostream>#include<fstream>usingnamespacestd;

voidOrder(vector<int>&data)//bubblesort{

intcount=data.size()

inttag=false〃設(shè)置是否需要繼續(xù)冒泡的標(biāo)志位

for(inti=0i<counti++)

{

for(intj=0j<count-i-1j++){

if(data[j]>data[j+l]){

tag=true

inttemp=data[j]

data[j]=data[j+l]datafj+1]=temp}

)

if(!tag)break})

voidmain(void){

vector<int>data;

ifstreamin("c:\\data.txtn);if(Jin){

cout?"fileerror!";

exit(l);}

inttemp;

while(!in.eof()){

in?temp;

data.push_back(temp);}

in.close。;〃關(guān)閉輸入文件流Order(data);

ofstreamout("c:\\result.txt,');if(!out)

(

cout?*'fileerror!";

exit(l);)

for(i=0i<data.size()i++)

out?data?nn;

out.close。;〃關(guān)閉輸出文件流}

47鏈表題:一個(gè)鏈表的結(jié)點(diǎn)結(jié)構(gòu)

structNode{

intdataNode*next};

typedefstructNodeNode

(1)已知鏈表的頭結(jié)點(diǎn)head,寫(xiě)一個(gè)函數(shù)把這個(gè)鏈表逆序(Intel)

Node*ReverseList(Node*head)〃鏈表逆序{

if(head==NULLIIhead->next==NULL)

returnhead;Node*pl=head;Node*p2=p1->next;Node*p3=p2->next;pl->next=NULL;

while(p3!=NULL){

p2->next=pl;pl=p2;p2=p3

p3=p3->next;}

p2->next=pl;head=p2;returnhead;}

(2)已知兩個(gè)鏈表headl和head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序。(保留

所有結(jié)點(diǎn),即便大小相同)

Node*Merge(Node*headl,Node*head2){

if(head1==NULL)returnhead2;

if(head2==NULL)returnhead1;

Node*head=NULL;

Node*pl=NULL;Node*p2=NULL;

if(headl->data<head2->data){

head=headlpl=headl->next;p2=head2}else

{

head=head2;p2=head2->next;pl=headl;

)

Node*pcurrent=head;

while(pl!=NULL&&p2!=NULL){

if(pl->data<=p2->data){

pcurrent->next=pl;

pcurrent=pl;

pl=pl->next;}

else{

pcurrent->next=p2;pcurrent=p2;p2=p2->next}

)

if(pl!=NULL)pcurrent->next=pl;

if(p2!=NULL)

pcurrent->next=p2;returnhead;}

(3)已知兩個(gè)鏈表headl和head2各自有序,請(qǐng)把它們合并成一個(gè)鏈表依然有序,這次要求

用遞歸方法進(jìn)行。(Autodesk)答案:

Node*MergeRecursive(Node*headl,Node*head2){

if(headl==NULL)returnhead2;

if(head2==NULL)returnhead1;

Node*head=NULL;

if(head1->data<head2->data){

head=head1;

head->next=MergeRecursive(head1->next,head2);}else{head=head2;

head->next=MergeRecursive(head1,head2->next);}

returnhead;}

48寫(xiě)一個(gè)函數(shù)找出一個(gè)整數(shù)數(shù)組中,第二大的數(shù)(microsoft)

答案:

constintMINNUMBER=-32767

intfind_sec_max(intdataf],intcount){

intmaxnumber=data[0];intsec_max=MINNUMBER;

for(inti=1i<counti++){

if(data>maxnumber){

sec_max=maxnumber;

maxnumber=data;}else{

if(data>sec_max)

sec_max=data;}}

returnsec_max;}

49如何判斷一個(gè)單鏈表是有環(huán)的?(注意不能用標(biāo)志位,最多只能用兩個(gè)額外指

針)

structnode{charval;node*next;}

boolcheck(constnode*head){)//returnfalse:無(wú)環(huán);true:有環(huán)

一種O(n)的辦法就是(搞兩個(gè)指針,一個(gè)每次遞增一步,一個(gè)每次遞增兩步,如果有環(huán)

的話兩者必然重合,反之亦然):

boolcheck(constnode*head){

if(head==NULL)retumfalse;node*low=head,*fast=head->next;while(fast!=NULL&

&fast->next!=NULL){

low=low->next;

fast=fast->next->next;

if(low==fast)returntrue;}

returnfalse;}

50用變量a給出下面的定義

a)一個(gè)整型數(shù)(Aninteger)b)一個(gè)指向整型數(shù)的指針(Apointertoaninteger)

c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)

(Apointertoapointertoaninteger)d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(Anarrayof10integers)e)一

個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(Anarrayof10pointerstointegers)f)一

個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)

g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)

a)inta;//Aninteger

b)int*a;〃Apointertoaninteger

c)int**a;〃Apointertoapointertoanintegerd)inta[10];//Anarrayof10integers

e)int*a[10];//Anarrayof10pointerstointegers

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

g)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsaninteger

h)int(*a[10])(int);

51關(guān)鍵字const是什么含意?

我只要一聽(tīng)到被面試者說(shuō):“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。下

面的聲明都是什么意思?constinta;

intconsta;

int*consta;

intconst*aconst;

前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是?個(gè)指向常整型數(shù)的指針(也

就是,整型數(shù)是不可修改的,但指針可以)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就

是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)指

向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改

的)。

52關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。

一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假

設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)

變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:1).并行設(shè)

備的硬件寄存器(如:狀態(tài)寄存器)2).一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量

(Non-automaticvariables)

3).多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量(回答下面問(wèn)題)

1).一個(gè)參數(shù)既可以是const還可以是volatile嗎?解釋為什么。

2).一個(gè)指針可以是volatile嗎?解釋為什么。

3).下面的函數(shù)有什么錯(cuò)誤:intsquare(volatileint*ptr){

return*ptr**ptr;}

下面是答案:

1).是的。-個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K?/p>

const因?yàn)槌绦虿粦?yīng)該試圖去修改它。

2).是的。盡管這并不很常見(jiàn)。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buiTer的指

針時(shí)。3).這段代碼的有個(gè)惡作劇。這段代碼的目的是用來(lái)返指針*ptr指向值的平方,但是,

由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類(lèi)似卜一面的代碼:intsquare(volatileint*ptr){

inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地該變,因此a和b可能

是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

longsquare(volatileint*ptr){

inta;a=*ptr;

returna*a;

53用C++寫(xiě)個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位還是32位的?不能用sizeofO

函數(shù)

A1:

16位的系統(tǒng)下,

inti=65536;

cout?i;//輸出0;

inti=65535;

cout?i;//輸出T;

32位的系統(tǒng)下,

inti=65536;

cout?i;//輸出65536;

inti=65535;

cout?i;//輸出65535;

A2:

inta=、0;

if(a>65536){cout<<z/32bit,,<<endl;}

else{cout?z,16bitz,?endl;}

54C和C++有什么不同?

從機(jī)制上:C是面向過(guò)程的(但C也可以編寫(xiě)面向?qū)ο蟮某绦?;C++是面向?qū)ο蟮?

提供了類(lèi)。但是,C++編寫(xiě)面向?qū)ο蟮某绦虮菴容易從適用的方向:C適合要求代

碼體積小的,效率高的場(chǎng)合,如嵌入式;C++適合更上層的,復(fù)雜的;llinux核

心大部分是c寫(xiě)的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。從名稱(chēng)上也可以看出,

C++比c多了+,說(shuō)明C++是c的超集;那為什么不叫c+而叫C++呢,是因?yàn)镃++比

c來(lái)說(shuō)擴(kuò)充的東西太多了,所以就在c后面放上兩個(gè)+;于是就成了c++C語(yǔ)言是結(jié)

構(gòu)化編程語(yǔ)言,C++是面向?qū)ο缶幊陶Z(yǔ)言。C++側(cè)重于對(duì)象而不是過(guò)程,側(cè)重于類(lèi)

的設(shè)計(jì)而不是邏輯的設(shè)計(jì)

55在不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值

#include<stdio.h>voidmain(){

inti=60;

intj=50;

i=i+j;

j=i-j;

i=i-j;

printf("i=%d/n",i);

printf("j=%d/n",j);}

方法二:

56下面的代碼有什么問(wèn)題?

classA{

public:

A(){p=this;)

~A(){if(p!=NULL){deletep;p=NULL;}}

A*p;

);

答:會(huì)引起無(wú)限遞歸

57sizeof用法總結(jié)

在VC中,sizeof有著許多的用法,而且很容易引起一些錯(cuò)誤。下面根據(jù)sizeof后面的參數(shù)對(duì)

sizeof的用法做個(gè)總結(jié)。

A.參數(shù)為數(shù)據(jù)類(lèi)型或者為一般變量。例如sizeof(int),sizeof(k)ng)等等。這種情況要注意的

是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結(jié)果可能是不同的。例如int類(lèi)型在16位系統(tǒng)中占2

個(gè)字節(jié),在32位系統(tǒng)中占4個(gè)字節(jié)。

B.參數(shù)為數(shù)組或指針。下面舉例說(shuō)明.

intal5OJ;〃sizeof(a)=4*50=200;求數(shù)組所占的空間大小

int*a=newint[5OJ;//sizeof(a)=4;a為指針sizeof(a)是求指針的大小,在32位系統(tǒng)中,當(dāng)然

是占4個(gè)字節(jié)。

C.參數(shù)為結(jié)構(gòu)或類(lèi)。Sizeof應(yīng)用在類(lèi)和結(jié)構(gòu)的處理情況是相同的。但有兩點(diǎn)需要注意,第

一、結(jié)構(gòu)或者類(lèi)中的靜態(tài)成員不對(duì)結(jié)構(gòu)或者類(lèi)的大小產(chǎn)生影響,因?yàn)殪o態(tài)變量的存儲(chǔ)位置與結(jié)

構(gòu)或者類(lèi)的實(shí)例地址無(wú)關(guān)。

第二、沒(méi)有成員變量的結(jié)構(gòu)或類(lèi)的大小為1,因?yàn)楸仨毐WC結(jié)構(gòu)或類(lèi)的每一個(gè)實(shí)例在內(nèi)存中都

有唯一的地址。下面舉例說(shuō)明,

ClassTest{inta;staticdoublec};//sizeof(Test)=4.

Test*s;//sizeof(s)=4,s為一個(gè)指針。

Classtestl{};//sizeof(testl)=l;

D.參數(shù)為其他。下面舉例說(shuō)明。

intfunc(chars[5]){

cout<vsizeof(s);〃這里將輸出4,本來(lái)s為一個(gè)數(shù)組,但山于做為函數(shù)的參數(shù)在傳遞的時(shí)

候系統(tǒng)處理為一個(gè)指針,所以sizeof(s)實(shí)際上為求指針的大小。

return1;

)

sizeof(func("1234,,))=4//Efunc的返回類(lèi)型為int,所以相當(dāng)于求sizeof(int).

58.i最后等于多少?

inti=1;

intj=i++;

if((i>j++)&&(i++==j))i+=j;

答:i=5

59數(shù)據(jù)庫(kù):抽出部門(mén),平均工資,要求按部門(mén)的字符串順序排序,不能含有〃human

resource”部門(mén),employee結(jié)構(gòu)如下:employee_id,employee_name,

depart_id,depart_name,wage

答:

selectdepart_name,avg(wage)

fromemployee

wheredepart_name<>'humanresource'

groupbydepart_name

orderbydepart_name

60試編寫(xiě)函數(shù)判斷計(jì)算機(jī)的字節(jié)存儲(chǔ)順序是開(kāi)序(littleendian)還是降序

(bigendian)

答:

boolIsBigendian(){

unsignedshortusData=Ox1122;

unsignedchar*pucData=(unsignedchar*)&usData;

return(*pucData==0x22);

)

61.線程同步的總結(jié)

對(duì)幾種同步對(duì)象的總結(jié)

1.CriticalSection

A.速度快

B.不能用于不同進(jìn)程

C.不能進(jìn)行資源統(tǒng)計(jì)(每次只可以有一個(gè)線程對(duì)共享資源進(jìn)行存取)

2.Mutex

A.速度慢

B.可用于不同進(jìn)程

C.不能進(jìn)行資源統(tǒng)計(jì)

3.Semaphore

A.速度慢

B.可用于不同進(jìn)程

C.可進(jìn)行資源統(tǒng)計(jì)(可以讓一個(gè)或超過(guò)一個(gè)線程對(duì)共享資源進(jìn)行存取)

4.Event

A.速度慢

B.可用于不同進(jìn)程

C.可進(jìn)行資源統(tǒng)計(jì)

62邏輯思維題:101個(gè)硬幣100真、1假,真假區(qū)別在于重量。請(qǐng)用無(wú)祛碼天平稱(chēng)

兩次給出真幣重還是假幣重的結(jié)論。

答:1。個(gè)先取出2堆,33,33

第次稱(chēng),如果不相等,說(shuō)明有一堆重或輕那么把重的那堆拿下來(lái),再放另外35個(gè)中的33

如果相等,說(shuō)明假的重,如果不相等,新放上去的還是重的話,說(shuō)明假的輕(不可能新放上去的輕)

第一次稱(chēng),如果相等的話,這66個(gè)肯定都是真的,從這66個(gè)中取出35個(gè)來(lái),與剩下的沒(méi)稱(chēng)過(guò)的

35個(gè)比下面就不用說(shuō)了

方法二:

第3題也可以拿A(50),B(50)比一下,一樣的話拿剩下的一個(gè)和真的比一下。如果不一樣,就

拿其中的一堆。比如A(50)再分成兩堆25比一下,一樣的話就在B(50)中,不一樣就在A(50)中,

結(jié)合第一次的結(jié)果就知道了

63intid[sizeof(unsignedlong));這個(gè)對(duì)嗎?為什么??

答:對(duì),這個(gè)sizeof是編譯時(shí)運(yùn)算符,編譯時(shí)就確定了可以看成和機(jī)器有關(guān)的常量。

64在C++程序中調(diào)用被C編譯器編譯后的函數(shù),為什么要加extern"C”?

首先,作為extern是C/C++語(yǔ)言中表明函數(shù)和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字,該關(guān)鍵

字告訴編譯器,其聲明的函數(shù)和變量可以在本模塊或其它模塊中使用。

通常,在模塊的頭文件中對(duì)本模塊提供給其它模塊引用的函數(shù)和全局變量以關(guān)鍵字extern聲

明。例如,如果模塊B欲引用該模塊A中定義的全局變量和函數(shù)時(shí)只需包含模塊A的頭文件

即可。這樣,模塊B中調(diào)用模塊A中的函數(shù)時(shí),在編譯階段,模塊B雖然找不到該函數(shù),但

是并不會(huì)報(bào)錯(cuò);它會(huì)在連接階段中從模塊A編譯生成的目標(biāo)代碼中找到此函數(shù)

extern"C"是連接申明(linkagedeclaration),被extern"C”修飾的變量和函數(shù)是按照C語(yǔ)言方式編

譯和連接的,來(lái)看看C++中對(duì)類(lèi)似。

C的函數(shù)是怎樣編譯的:

作為一種面向?qū)ο蟮恼Z(yǔ)言,C++支持函數(shù)重載,而過(guò)程式語(yǔ)言C則不支持。函數(shù)被C++編譯

后在符號(hào)庫(kù)中的名字與c語(yǔ)言的不同。例如,假設(shè)某個(gè)函數(shù)的原型為:

voidfoo(intx,inty);

該函數(shù)被C編譯器編譯后在符號(hào)庫(kù)中的名字為_(kāi)f。。,而C++編譯器則會(huì)產(chǎn)生像一foo_int_int之

類(lèi)的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱(chēng)為

“mangledname")。

_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類(lèi)型信息,C++就是靠這種機(jī)制來(lái)實(shí)

現(xiàn)函數(shù)重載的。例如,在C++中,函數(shù)voidfoo(intx,inty)與voidfoo(intx,floaty)編譯生成

的符號(hào)是不相同的,后者為_(kāi)foo_int_float。同樣地,C++中的變量除支持局部變量外,還支

持類(lèi)成員變量和全局變量。用戶(hù)所編寫(xiě)程序的類(lèi)成員變量可能與全局變量同名,我們以來(lái)

區(qū)分。而本質(zhì)上,編譯器在進(jìn)行編譯時(shí),與函數(shù)的處理相似,也為類(lèi)中的變量取了一個(gè)獨(dú)一

無(wú)二的名字,這個(gè)名字與用戶(hù)程序中同名的全局變量名字不同

65#defineDOUBLE(x)x+x,i=5*D0UBLE(5);i是多少?

答案:i為30。(注意直接展開(kāi)就是了)5*5+5

66在8086匯編下,邏輯地址和物理地址是怎樣轉(zhuǎn)換的?(Intel)

答案:通用寄存器給出的地址,是段內(nèi)偏移地址,相應(yīng)段寄存器地址*10H+通用寄

存器內(nèi)地址,就得到了真正要訪問(wèn)的地址。

67如何打印出當(dāng)前源文件的文件名以及源文件的當(dāng)前行號(hào)?答案:

cout?_FILE_;

cout<<_LINE—;

_FILE二和_ZlNE_是系統(tǒng)預(yù)定義宏,這種宏并不是在某個(gè)文件中定義的,而是

由編譯器定義的

68觀察下面的程序,找出錯(cuò)誤,主要是字符串的操作

試題1:voidtestl(){

charstring[10];

char*strl="0123456789”;

strcpy(string,strl);

)

試題2:Voidtest2(){

charstring[10],strl[10];

inti;

for(i=0;i<10;i++){strl=!a';}

strcpy(string,strl);

)

試題3:voidtest3(char*strl){

charstring[10];

if(strlen(strl)<=10){strcpy(string,strl);}

)

解答:

試題1字符串strl需要11個(gè)字節(jié)才能存放下(包括末尾的、0)而string只有10個(gè)字節(jié)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論