版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
4章預(yù)處理、保留字CC++中預(yù)處理指令都是不可或缺的,雖然預(yù)處理指令的關(guān)鍵字不是保留字,但在給自定義變量命名時(shí),最好把其當(dāng)作保留字來(lái)使用,以免引起誤解。保留字本章將詳細(xì)講解這方面的常見(jiàn)面試考題。4.1預(yù)處理預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語(yǔ)法分析)之前所做的工作。預(yù)處譯時(shí),系統(tǒng)將自動(dòng)程序的編譯。4章預(yù)處理、保留字CC++中預(yù)處理指令都是不可或缺的,雖然預(yù)處理指令的關(guān)鍵字不是保留字,但在給自定義變量命名時(shí),最好把其當(dāng)作保留字來(lái)使用,以免引起誤解。保留字本章將詳細(xì)講解這方面的常見(jiàn)面試考題。4.1預(yù)處理預(yù)處理是指在進(jìn)行編譯的第一遍掃描(詞法掃描和語(yǔ)法分析)之前所做的工作。預(yù)處譯時(shí),系統(tǒng)將自動(dòng)程序的編譯。預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動(dòng)進(jìn)入源處理功能,可使程序便于閱讀、修改、移植和調(diào)試,也有利于模塊化程序設(shè)計(jì)。1:簡(jiǎn)述#ifdef、#else、#endif和#ifndef的作用簡(jiǎn)述#ifdef、#else、#endif和#ifndef的作用。所涉及到的知識(shí)點(diǎn)#ifdef、#else、#endif#ifndef分析問(wèn)題因?yàn)檐浖粩嗟厣?jí),程序體積在不停的擴(kuò)大,但是程序老用戶(hù)卻不能受影響。條件編譯指令是解決這一問(wèn)題的最佳選擇。條件編譯指令包括:#ifdef、#else、#endif和#ifndef,主要有以用:不需要時(shí)用戶(hù)可輕易將其。如:#ifdefMATH#include"math.c"#endifMATH加一下劃線即可。(2)在子程序前加上標(biāo)記,以便追蹤和調(diào)試。設(shè)備,只能繞過(guò)硬件,直接寫(xiě)出預(yù)期結(jié)果。如下所示:直接0。3.這些條件編譯指令主要有以下功能:利用#ifdefMATH加一下劃線即可。(2)在子程序前加上標(biāo)記,以便追蹤和調(diào)試。設(shè)備,只能繞過(guò)硬件,直接寫(xiě)出預(yù)期結(jié)果。如下所示:直接0。3.這些條件編譯指令主要有以下功能:利用#ifdef、#endif可將某程序功能模塊包括進(jìn)去,以向特定用戶(hù)提供該功能。用于在子程序前加上標(biāo)記,以便追蹤和調(diào)試。應(yīng)對(duì)硬件的限制。if(因?yàn)樗姓Z(yǔ)句都編譯),運(yùn)行時(shí)間長(zhǎng)(因?yàn)樵诔绦蜻\(yùn)行時(shí)間對(duì)if語(yǔ)句進(jìn)試)。而采用條件編譯,可以減少被編譯的語(yǔ)句,從而減少目標(biāo)程序的長(zhǎng)度,減少運(yùn)行時(shí)間。2:宏定義和函數(shù)宏和函數(shù)有何區(qū)別?所涉及到的知識(shí)點(diǎn)宏定義函數(shù)分析問(wèn)題雖然宏與函數(shù)看起來(lái)非常的相似,但宏不是函數(shù),且兩者有本質(zhì)的區(qū)別。了解了宏和函數(shù)的區(qū)別,才能更好的使用宏,所以宏和函數(shù)的關(guān)系也是企業(yè)宏和函數(shù)主要有以下幾點(diǎn)不同:的重點(diǎn)內(nèi)容。宏的宏的只占編譯時(shí)間,不占運(yùn)行時(shí)間。#ifndefYAN2410igetBordNum(); YAN2410硬件時(shí),程序調(diào)試運(yùn)行時(shí)繞過(guò)此語(yǔ)句#elsei=0;#endif#ifdefDEBUG#endif一個(gè)數(shù)值呢?如下列:輸出結(jié)果:TheresultofADD(1,2)/4is:1.500000 一個(gè)數(shù)值呢?如下列:輸出結(jié)果:TheresultofADD(1,2)/4is:1.500000 結(jié)果的原因是忽略了宏的本質(zhì)。宏是直接替代的,ADD(1+2)/41+2/4,所以結(jié)果肯定令編程者滿(mǎn)意。而如果想讓宏返回?cái)?shù)值,最好的辦法是給表達(dá)式加上括號(hào)。將上面的宏定義寫(xiě)成:#defineADD(a,b)((a)+(b)) 輸出結(jié)果為:TheresultofADD(1,2)/4is:0.750000 ADD的功能。輸出結(jié)果:#include<stdio.h>#defineDIVDEF(a,b)(a/b) //DIVDEF宏floatdivFun(floata,floatb) divFun{returna/b;}voidmain(void){floatx=4,y=2;TheresultofADD(1,2)/4is:0.750000TheresultofADD(1,2)/4is0.30000TheresultofADD('a',2)/4is:24.750000#include<stdio.h>#defineADD(a,bab //ADD宏voidmain(void){printf("TheresultofADD(1,2)/4is:%f\n",ADD(1,2)/4.0);printf("TheresultofADD(1,2)/4is%f\n",ADD(0.4,0.8)/4.0);printf("TheresultofADD(‘a(chǎn)’,2)/4is:%f\n",ADD(‘a(chǎn)’,2)/4.0);return;}#include<stdio.h>#defineADD(a,b)(a)+(b) //ADD宏voidmain(void){printf("TheresultofADD(1,2)/4is:%f\n",ADD(1,2)/4.0); //ADD宏的結(jié)果return;}輸出結(jié)果:DIVSDEF(x+y,x–y);替代展開(kāi)后:DIV法是給每個(gè)參數(shù)加上括號(hào)。如下:如此改編后,上述代碼的輸出結(jié)果為:所以在定義宏的時(shí)候一定要注意給參數(shù)加上括號(hào)。宏在使用過(guò)程中由于直接替代會(huì)導(dǎo)致副作用。即的使用括號(hào)括起了宏的參數(shù)、表達(dá)式,但是有些問(wèn)題還是避免不了的。在有些表達(dá)式中某些參數(shù)用到一次以上,而這個(gè)參數(shù)每次作時(shí)又會(huì)改變其值。宏定義如下:在這個(gè)宏定義中參數(shù)a或b之一肯定要被使用兩次。當(dāng)有如下求值表達(dá)式時(shí):其宏被擴(kuò)展為:x時(shí),*p++x比較,第二次用于返回值。因此*p自加了兩次。此種情況在函數(shù)中出現(xiàn)。3.宏的宏的只占編譯時(shí)間,不占運(yùn)行時(shí)間。沒(méi)有返回值。如需要須給整個(gè)表達(dá)式加上括號(hào)。函數(shù)輸出結(jié)果:DIVSDEF(x+y,x–y);替代展開(kāi)后:DIV法是給每個(gè)參數(shù)加上括號(hào)。如下:如此改編后,上述代碼的輸出結(jié)果為:所以在定義宏的時(shí)候一定要注意給參數(shù)加上括號(hào)。宏在使用過(guò)程中由于直接替代會(huì)導(dǎo)致副作用。即的使用括號(hào)括起了宏的參數(shù)、表達(dá)式,但是有些問(wèn)題還是避免不了的。在有些表達(dá)式中某些參數(shù)用到一次以上,而這個(gè)參數(shù)每次作時(shí)又會(huì)改變其值。宏定義如下:在這個(gè)宏定義中參數(shù)a或b之一肯定要被使用兩次。當(dāng)有如下求值表達(dá)式時(shí):其宏被擴(kuò)展為:x時(shí),*p++x比較,第二次用于返回值。因此*p自加了兩次。此種情況在函數(shù)中出現(xiàn)。3.宏的宏的只占編譯時(shí)間,不占運(yùn)行時(shí)間。沒(méi)有返回值。如需要須給整個(gè)表達(dá)式加上括號(hào)。函數(shù)。(5)宏由于直接替代而有可能導(dǎo)致副作用,函數(shù)。注意:使用宏時(shí)一定要注意宏的直接替換帶來(lái)的隱患,這種隱患不可能完全避免,但是可以盡量的減少。3:用#define一個(gè)常數(shù)用宏定義實(shí)現(xiàn)一個(gè)常數(shù),用來(lái)表明一年有多少秒,忽略閏年的問(wèn)題。要注意數(shù)據(jù)長(zhǎng)度的問(wèn)題。(16位機(jī))((*p++)>(x)?(*p++):(x));MAX(*p++,x);#defineMAX(a,b)((a)>(b)?(a):(b))TheresultofDIVDEF(x+y,x-y)is:3.000000TheresultofDIVDEF(x+y,x-y)is:3.000000#defineDIVDEF(a,b)((a)/(b))TheresultofDIVDEF(x+y,x-y)is:2.500000TheresultofDIVDEF(x+y,x-y)is:3.000000resultofDIVDEF(x+y,x-y)is:%f\n",DIVDEF(x+y,x-y)/1.0);//DIVDEF的結(jié)果resultofdivFun(x+y,x-y)is:%f\n",divFun(x+y,x-y)/1.0);//divFun的結(jié)果return;}所涉及到的知識(shí)點(diǎn)宏定義數(shù)據(jù)類(lèi)型分析問(wèn)題這道題主要面試者對(duì)預(yù)處理命令掌握的熟練程度,主要注意以下幾點(diǎn):(1)#define命令的基礎(chǔ)知識(shí):#define命令不是語(yǔ)句,所以結(jié)束時(shí)不能加分號(hào)。在#define定義變量時(shí)應(yīng)該注意括號(hào)的使用,常數(shù)名規(guī)則(一般都大寫(xiě))。(2所涉及到的知識(shí)點(diǎn)宏定義數(shù)據(jù)類(lèi)型分析問(wèn)題這道題主要面試者對(duì)預(yù)處理命令掌握的熟練程度,主要注意以下幾點(diǎn):(1)#define命令的基礎(chǔ)知識(shí):#define命令不是語(yǔ)句,所以結(jié)束時(shí)不能加分號(hào)。在#define定義變量時(shí)應(yīng)該注意括號(hào)的使用,常數(shù)名規(guī)則(一般都大寫(xiě))。(2)預(yù)處理器將計(jì)算常數(shù)的表達(dá)式:而不是直接寫(xiě)出計(jì)算結(jié)果,這樣將大大增強(qiáng)程序的可讀性。(3)16位機(jī)的標(biāo)注:LU,這是一個(gè)好的習(xí)慣。3.#defineSECONDS_PER_YEAR(365*24*60*60)UL說(shuō)明:這雖然是一道簡(jiǎn)單的面試題,但該注意基礎(chǔ)知識(shí)的積累和掌握。了define的多方面基礎(chǔ)知識(shí)。所以平時(shí)應(yīng)4:寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏MINMIN,這個(gè)宏輸入兩個(gè)參數(shù)并且返回較小的一個(gè)。所涉及到的知識(shí)點(diǎn)帶參數(shù)的宏定義分析問(wèn)題解決本題時(shí),一定要注意以下兩點(diǎn):(1)用三重條件操作的知識(shí)可以更加方便的解決本題:C語(yǔ)言引入三重條件操作符的if-then-else更優(yōu)化的代碼,了解這個(gè)方法是很重要的。這是本題重要的考點(diǎn)之一。(2)在宏定義中一定要把參數(shù)用括號(hào)確的。#defineMIN(A,B)(A)<=(B)?(A):(B)#defineMIN(A,B)(A<=B?A:B)3.:#definemin(a,b)((a)<=(b)?(a):(b)) 注意:在調(diào)用時(shí)一定要注意這個(gè)宏定義的副作用,如下調(diào)用:((++*p)<=(x)?(++*p):(x)。 pMIN的本意。3.:#definemin(a,b)((a)<=(b)?(a):(b)) 注意:在調(diào)用時(shí)一定要注意這個(gè)宏定義的副作用,如下調(diào)用:((++*p)<=(x)?(++*p):(x)。 pMIN的本意。5:typedef和define有什么區(qū)別define有什么區(qū)別?所涉及到的知識(shí)點(diǎn)typedefdefine分析問(wèn)題和作用上卻有著很多的不同。(1)用法不同。typedef用來(lái)定義一中數(shù)據(jù)類(lèi)型的別名,增強(qiáng)程序的可讀性。如下定義:define主要用來(lái)定義常量,以及書(shū)寫(xiě)復(fù)雜,且使用頻繁的表達(dá)式。實(shí)例如下:typedef有類(lèi)型檢查的功能。define不進(jìn)行類(lèi)型的檢查。typedef有作用域限定,如下列代碼:#include<stdio.h>voidf1(void){typedefintINT; intINT}voidmain(void){INTA3; //INT定義一個(gè)變量Aprintf("A:%d\n",A); //輸出變量A的值}#defineMAX_LENGTH(100)#defineSUB(x,y)((x)*(Y))typedefunsignedintUINT;typedefunsignedcharBYTE;編譯也就結(jié)束了。INTf1f1INT的作用域注意(ypdef編譯也就結(jié)束了。INTf1f1INT的作用域注意(ypdeftypedf的作用域)。define后的都是正確的。如下例:編譯運(yùn)行正確結(jié)果:100 (4)對(duì)指針的操作不同。typedef和define定義指針別名的時(shí)需要特別注意。代碼如下:輸出結(jié)果:define直接替代的char*a,b;ab只1。當(dāng)有如下定義時(shí):int*constp2。檢驗(yàn)代碼如下:#definepCHARchar*typedefchar*pChar;constpCHARp1;constpCharp2;sizeof(a):4sizeof(b):1sizeof(x):4sizeof(y):4#include<stdio.h>#definepCHARchar* //pCHAR替代char*typedefchar*pChar; voidmain(void){pCHARa,b; 用pCHAR 變量a,bpCharx,y; 用pChar 變量x,yprintf("sizeof(a):%d\nsizeof(b):%d\n",sizeof(a),sizeof(b));//輸出a,b的長(zhǎng)度printf("sizeof(x):%d\nsizeof(y):%d\n",sizeof(x),sizeof(y));//輸出x,y的長(zhǎng)度}#include<stdio.h>voidf1(void){#defineMAX100 //宏定義MAX100}voidmain(void){printf("MAX:%d\n",MAX);//輸出MAX的值}輸出結(jié)果:改為*p1=2;時(shí)編譯器報(bào)錯(cuò)如下:Cannotconvertfrom'constint'to'constchar*' 輸出結(jié)果:改為*p1=2;時(shí)編譯器報(bào)錯(cuò)如下:Cannotconvertfrom'constint'to'constchar*' p2=&a;時(shí)編譯器報(bào)錯(cuò)如下:l-valuespecifiesconstobject 3.用法不同:typedef用來(lái)定義一種數(shù)據(jù)類(lèi)型的別名,增強(qiáng)程序的可讀性。define主要用來(lái)定義常量,以及書(shū)寫(xiě)復(fù)雜使用頻繁的宏。執(zhí)行時(shí)間不同:typedef是編譯過(guò)程的一部分,有類(lèi)型檢查的功能。define是宏定義,是預(yù)編譯的部分,其發(fā)生在編譯之前,只是簡(jiǎn)單的進(jìn)行字符串的替換,不進(jìn)行類(lèi)型的檢查。define聲明后的都是正確的。(4)對(duì)指針的操作不同:typedef和define定義的指針時(shí)有很大的區(qū)別。注意:typedefdefine不是語(yǔ)句,千萬(wàn)不能在句尾加分號(hào)。6:#defineCHARchar*typedefchar*CHAR各有什么優(yōu)劣CHARchar*typedefchar*CHAR兩者的作用是否相同,各有什么優(yōu)劣?所涉及到的知識(shí)點(diǎn)definetypedef*p1:0p1:1245052*p2:2p2:1245048#include<stdio.h>#definepCHARchar*typedefchar*pChar;voidmain(void){chara=0,b=1;constpCHARp1=&a; p1aconstpCharp2=&b; //pChar定義p2指向變量bp1=&b; //p1指向b*p2=2; //b2printf("*p1:%dp1:%d\n",*p1,p1);printf("*p2:%dp2:%d\n",*p2,p2);}分析問(wèn)題#defineCHARchar*和typedefchar*CHAR分析問(wèn)題#defineCHARchar*和typedefchar*CHAR在一般的使用中是十分相似的,但是兩者還是有很大的區(qū)別的。主要注意以下兩點(diǎn)。char*CHAR,在預(yù)處理階段用。由于是直接的替代關(guān)系,CHAR可以和其他的修CHAR。代碼如下:輸出結(jié)果:*i賦值為-5251。卻不能這樣使用,typedefchar*CHARCHAR不能在和其他修飾符連用。如下代碼:編譯時(shí)會(huì)有如下錯(cuò)誤提示:missing';'beforeidentifier'i' #include<stdio.h>typedefchar*CHAR;unsignedCHARi;voidmain(void){unsignedchara=0;i=&a;printf("Beforechange:%d\n",*i);*i=-5;printf("Afterchange:%d\n",*i);return;}Beforechange:0Afterchange:251#include<stdio.h>#defineCHARchar* CHARchar*unsignedCHARi; CHARivoidmain(void){unsignedchara=0;i&a; //i指向aprintf("Beforechange:%d\n",*i);*i5; //i所指內(nèi)容賦值-5printf("Afterchange:%d\n",*i);return0;}'CHAR':redefinition;typedefcannotbeoverloadedwithanyothersymbol 錯(cuò)誤提示顯示'CHAR':redefinition;typedefcannotbeoverloadedwithanyothersymbol 錯(cuò)誤提示顯示CHAR不能再被其它的修飾符擴(kuò)展。由于#define只是在預(yù)處理階段簡(jiǎn)單地把定義的類(lèi)型別名替換成別名所指代的有第一個(gè)是字符型指針變量,后面的都字符型變量。代碼如下:輸出結(jié)果:a是指針,其他的都是普通的字符型變量。而用typedef定義的類(lèi)型能夠保證輸出結(jié)果:*ais:1*bis:2#include<stdio.h>typedefchar*CHAR;voidmain(void){charx=1;chary=2;charz=3;a,b,c;a=&x;b=&y;c=&z;printf("*ais:%d\n*bis:%d\n*cis:%d\n",*a,*b,*c);return;}*ais:1bis:2cis:3#include<stdio.h>#defineCHARchar*voidmain(void){charx=1;chary=2;charz=3;a,b,c;a=&x;b=y;c=z;printf("*ais:%d\nbis:%d\ncis:%d\n",*a,b,c);return;}*cis:3 a,b,c都是字符型指針變量。3.typedef能夠保證連續(xù)的所有變量均為同一類(lèi)型。注意:平時(shí)定義指針變量時(shí)要注意,在int*cis:3 a,b,c都是字符型指針變量。3.typedef能夠保證連續(xù)的所有變量均為同一類(lèi)型。注意:平時(shí)定義指針變量時(shí)要注意,在int*a,b;中,a是整型指針變量,b是整型變量。int*a,b;雖然這樣和前面的定義一樣,但是不利于閱讀、理解。7typedef的認(rèn)識(shí)typedef的認(rèn)識(shí)。1. 所涉及到的知識(shí)點(diǎn)typedef指針2. 分析問(wèn)題本題主要是種用途和兩個(gè)使用注意事項(xiàng):四種用途:定義一種類(lèi)型的別名。定義與平臺(tái)無(wú)關(guān)的類(lèi)型。struct。為復(fù)雜的定義一個(gè)簡(jiǎn)單的別名。(1)定義一種類(lèi)型的別名:define那樣簡(jiǎn)單的進(jìn)行宏替換。它可以同時(shí)連續(xù)多個(gè)指針變量。如下:a,b。而下面的定義:abtypedef相對(duì)于define的優(yōu)勢(shì)。說(shuō)明:那么為什么不用下面這種定義方法呢:char*a,*b; 這樣是可以的,但是pChar相對(duì)于上面的定義形式上更加直觀,特別是當(dāng)程序中需要定義大量指針的時(shí)候,typedef的方式會(huì)更加的方便省事。#definePCHARchar*PCHARa,b;typedefchar*pChar;pChara,b;C代碼中輔助struc:C語(yǔ)言中,的形式為:一個(gè)結(jié)構(gòu)體對(duì)象時(shí),必須要加上struct,舊C語(yǔ)言的結(jié)構(gòu)體對(duì)象【struct】【結(jié)構(gòu)名】【對(duì)象名】實(shí)例如下:結(jié)構(gòu)體:對(duì)象的為:structC代碼中輔助struc:C語(yǔ)言中,的形式為:一個(gè)結(jié)構(gòu)體對(duì)象時(shí),必須要加上struct,舊C語(yǔ)言的結(jié)構(gòu)體對(duì)象【struct】【結(jié)構(gòu)名】【對(duì)象名】實(shí)例如下:結(jié)構(gòu)體:對(duì)象的為:structSTUDENTstudent1; 這種寫(xiě)法比較麻煩,于是有了下面的寫(xiě)法:structSTUDENT的別名,此時(shí)就可以這樣定義結(jié)構(gòu)體的對(duì)象了:struSTUDENTstudent1; struct,比較省事,看起來(lái)也比較直觀。C++中,typedef這種用法已經(jīng)不是很大,但是理解這種用法,對(duì)掌握和理解以前的舊代碼還是很有幫助的。(3)typedef用來(lái)定義與平臺(tái)無(wú)關(guān)的類(lèi)型:標(biāo)平臺(tái)上,讓它表示最高精度的類(lèi)型為:typedeflongdoubleDECIMAL; longdouble的平臺(tái)上,可改為:typedefdoubleDECIMAL; 在連double都不支持的平臺(tái)上,可改為:typedeffloatDECIMAL; 當(dāng)跨平臺(tái)時(shí),只要修改typedef定義本身就行,不用對(duì)其他源碼做任何修改。在標(biāo)準(zhǔn)size_t。(4)為復(fù)雜的定義一個(gè)新的簡(jiǎn)單的別名:使用方法:在原來(lái)的最后替換,得到的就是原例一:中逐步用別名替換一部分復(fù)雜的最簡(jiǎn)化版。如下定義:,把帶變量名的部分留到char*(*a[7])(char,int*); 這條語(yǔ)句定義了一個(gè)包含7個(gè)指針元素的數(shù)組a,指針指向的函數(shù)有兩個(gè)參數(shù),一個(gè)是typedefstructSTUDENT{int age;char*name;char*address;}STUDENT;structSTUDENT{int age;char*name;char*address;};字符型,另一個(gè)是整型指針。函數(shù)的返回值是字符指針型數(shù)據(jù)??蛇@條語(yǔ)句的定義形式書(shū)typedef做如下簡(jiǎn)化:這條語(yǔ)句定義了一種函數(shù)指針類(lèi)型的別名,這個(gè)函數(shù)有兩個(gè)參數(shù)一個(gè)是字符型,另一個(gè)是整型指針,返回值是字符型指針數(shù)據(jù),和上一條語(yǔ)句的含義相同?,F(xiàn)在再定義這個(gè)函數(shù)的指針數(shù)組就簡(jiǎn)單多了,定義如下:例二:回值)指針參數(shù),無(wú)返回值??梢韵葘oid(*)()簡(jiǎn)化為:帶入原式:接下來(lái)的步驟和例一相同:最后原式就可以簡(jiǎn)化為:例三:這句定義了一個(gè)七個(gè)函數(shù)指針元素的數(shù)組的指針,函數(shù)無(wú)參數(shù),返回double型的數(shù)值。將原式左半部分簡(jiǎn)化為:再將右半部分簡(jiǎn)化:這樣原式即可簡(jiǎn)化為:在這里要記住兩種模式:兩個(gè)使用注意事項(xiàng):定義了一種類(lèi)型的新別名,但不能被其他的修飾符擴(kuò)展。typedef是并不真正影響對(duì)象的特性的類(lèi)關(guān)鍵字。define只是進(jìn)行簡(jiǎn)單的字符替換。這樣雖有優(yōu)勢(shì),但是也有它的不足,如下定義:如果在程序中有如下應(yīng)用:字符型,另一個(gè)是整型指針。函數(shù)的返回值是字符指針型數(shù)據(jù)??蛇@條語(yǔ)句的定義形式書(shū)typedef做如下簡(jiǎn)化:這條語(yǔ)句定義了一種函數(shù)指針類(lèi)型的別名,這個(gè)函數(shù)有兩個(gè)參數(shù)一個(gè)是字符型,另一個(gè)是整型指針,返回值是字符型指針數(shù)據(jù),和上一條語(yǔ)句的含義相同?,F(xiàn)在再定義這個(gè)函數(shù)的指針數(shù)組就簡(jiǎn)單多了,定義如下:例二:回值)指針參數(shù),無(wú)返回值??梢韵葘oid(*)()簡(jiǎn)化為:帶入原式:接下來(lái)的步驟和例一相同:最后原式就可以簡(jiǎn)化為:例三:這句定義了一個(gè)七個(gè)函數(shù)指針元素的數(shù)組的指針,函數(shù)無(wú)參數(shù),返回double型的數(shù)值。將原式左半部分簡(jiǎn)化為:再將右半部分簡(jiǎn)化:這樣原式即可簡(jiǎn)化為:在這里要記住兩種模式:兩個(gè)使用注意事項(xiàng):定義了一種類(lèi)型的新別名,但不能被其他的修飾符擴(kuò)展。typedef是并不真正影響對(duì)象的特性的類(lèi)關(guān)鍵字。define只是進(jìn)行簡(jiǎn)單的字符替換。這樣雖有優(yōu)勢(shì),但是也有它的不足,如下定義:如果在程序中有如下應(yīng)用:pCharunsigned擴(kuò)展,另外當(dāng)有如下應(yīng)用時(shí):const給予了整constpChara;unsignedpChara;typedefchar*pChar;typedef(*)(……) 是函數(shù)指針。typedef(*)[] //數(shù)組指針。pArraya;typedefpFun(*pArray)[7];typedefdouble(*pFun)();double(*)()(*a)[7];pFuna[7];typedefvoid(*pFun)(pFunParam);typedefvoid(*b[10])(pFunParam);typedefvoid(*pFunParam)();void(*a[7])(void(*)());pFuna[7];typedefchar*(*pFun)(char,int*);char*const。簡(jiǎn)單來(lái)說(shuō),const和typedef一起出現(xiàn)時(shí),typedef不僅僅是簡(jiǎn)單的字符串替換,而是定義了一種新的數(shù)據(jù)類(lèi)型。char*const。簡(jiǎn)單來(lái)說(shuō),const和typedef一起出現(xiàn)時(shí),typedef不僅僅是簡(jiǎn)單的字符串替換,而是定義了一種新的數(shù)據(jù)類(lèi)型。類(lèi)的關(guān)鍵字,但是它并不真正的影響數(shù)據(jù)特性,如下定義:typedefstaticchara; 這是錯(cuò)誤的,編譯時(shí)會(huì)提示:morethanonestorageclassspecified 會(huì)有指定了一個(gè)以上的類(lèi)型的錯(cuò)誤提示。3.typedef共有四種用途:用在舊的C代碼中輔助struct。(4)為復(fù)雜的定義一個(gè)新的簡(jiǎn)單的別名。還有兩個(gè)注意事項(xiàng):(1)定義了一種類(lèi)型的新別名后不能被其他的修飾符擴(kuò)展。(2)typedef是并不真正影響對(duì)象的特性的類(lèi)關(guān)鍵字。說(shuō)明:typedef雖然功能強(qiáng)大,既可以定義變量別名,還可以定義操作別名。但是使用時(shí)一定要注意它的兩個(gè)注意事項(xiàng)。4.2const(常量)C中,const主要用于定義常量、修飾函數(shù)參數(shù)、于const因?yàn)橛猛据^多,且比較容易出錯(cuò),所以在企業(yè)面試中經(jīng)常出現(xiàn)。本節(jié)將詳細(xì)講解面試中const相關(guān)的常見(jiàn)考題。8:關(guān)鍵字const是什么const是什么意思?它有什么作用呢?所涉及到的知識(shí)點(diǎn)const常量分析問(wèn)題const用來(lái)定義一個(gè)只讀的變量或?qū)ο?,即定義常類(lèi)型變量或?qū)ο?。常?lèi)型的變量或?qū)ο蟮闹凳遣荒芨碌?。const的引入是為了消除預(yù)編譯指令的缺點(diǎn),同時(shí)繼承預(yù)編譯指令的優(yōu)點(diǎn)。主要有以用:(1)定義一個(gè)常量:定義時(shí)初始化,之后不能更新。如:constdoublePI=3.1415926; (2)const方法可以使編譯器對(duì)處理內(nèi)容有函數(shù)的參數(shù),如:的了解。常見(jiàn)的是象的值是不能更新的。const的引入是為了消除預(yù)編譯指令的缺點(diǎn),同時(shí)繼承預(yù)編譯指令的優(yōu)點(diǎn)。主要有以用:(1)定義一個(gè)常量:定義時(shí)初始化,之后不能更新。如:constdoublePI=3.1415926; (2)const方法可以使編譯器對(duì)處理內(nèi)容有函數(shù)的參數(shù),如:的了解。常見(jiàn)的是f1a的值發(fā)生了改變,編譯器const修飾的內(nèi)容,防止意外的發(fā)生,增強(qiáng)程序的健壯性。改變一處即可。如下:(4)節(jié)省空間:避免不必要的內(nèi)存分配。如:const比宏定義要節(jié)省內(nèi)存空間。(5)為函數(shù)重載提供參考:如下:3.const用來(lái)定義一個(gè)只讀的變量或?qū)ο?。主要?yōu)點(diǎn):便于類(lèi)型檢查、同宏定義一樣可以方便地進(jìn)行參數(shù)的修改和調(diào)整、節(jié)省空間,避免不必要的內(nèi)存分配、可為函數(shù)重載提供參考。說(shuō)明:const修飾函數(shù)參數(shù),是一種編程規(guī)范的要求,便于閱讀,一看即知這個(gè)參數(shù)不能被改變,實(shí)現(xiàn)時(shí)不易出錯(cuò)。classA{voidf1(void);//一個(gè)成員函數(shù)voidf1(voidconst;// 為上一個(gè)函數(shù)的重載}#defineMAX100//宏定義常量constintmax100; //max分配空間。intamax; //max分配空間,此后不再分配。intbMAX; //編譯時(shí)進(jìn)行宏替換,分配空間。intcmax; //再分配空間。intdMAX; //編譯時(shí)進(jìn)行宏替換,分配空間。constintMAX=100;......charBuffer1[MAX];......intBuffer2[MAX]voidf1(constinta){………}9a的含義a各種的含義?1. 所涉及到的知識(shí)點(diǎn)常量常量的常指針?lè)治鰡?wèn)題9a的含義a各種的含義?1. 所涉及到的知識(shí)點(diǎn)常量常量的常指針?lè)治鰡?wèn)題constinta;和intconsta;aa是只const的修飾??梢愿淖兤渲?,但是其指向的常整型數(shù)據(jù)是不能通過(guò)指針改變的。a,這個(gè)指針指向整型數(shù)。即指針的值不能改變,constint*a;恰好相反。a,這個(gè)常指針指向一個(gè)常整型數(shù)。即指針的值不能改變,其指向的常整型數(shù)據(jù)的值也不能改變。理解這幾個(gè)變量定義是非常重要的,因?yàn)槠渫庑畏浅5南嗨?,但含義卻完全不同。若是因不理解而用錯(cuò),將是件非常頭痛的事。3.a;intconsta;*a;a。*a;a。*aconst;a。注意:【const】【數(shù)據(jù)類(lèi)型】【*】【變量】和【數(shù)據(jù)類(lèi)型】【const】【*】【變量】是不同的,而【const】【數(shù)據(jù)類(lèi)型】【變量】和【數(shù)據(jù)類(lèi)型】【const】【變量名】是相同的。10:const、define定義常量的區(qū)別constdefine都可以用來(lái)定義常量,兩者有什么區(qū)別?constinta;intconsta;int*a;a;intconst*aconst;1. 所涉及到的知識(shí)點(diǎn)const的實(shí)際應(yīng)用常量define2. 分析問(wèn)題在編程中常量是不可或缺的,引入常量有什么作用呢?(1)常量比常數(shù)可讀性高:如果程序非常的大,編程耗時(shí)比較長(zhǎng)。程序員可以根據(jù)常量的名字判斷這個(gè)常量的意義,而直接根據(jù)數(shù)值來(lái)判斷其意義是件非??梢远x這樣常量:52人,#define1. 所涉及到的知識(shí)點(diǎn)const的實(shí)際應(yīng)用常量define2. 分析問(wèn)題在編程中常量是不可或缺的,引入常量有什么作用呢?(1)常量比常數(shù)可讀性高:如果程序非常的大,編程耗時(shí)比較長(zhǎng)。程序員可以根據(jù)常量的名字判斷這個(gè)常量的意義,而直接根據(jù)數(shù)值來(lái)判斷其意義是件非常可以定義這樣常量:52人,#defineSTUDENT_NUMBERS52 或:constintstudent_Num=52; 特別是在一個(gè)程序中某個(gè)數(shù)值多次出現(xiàn)的時(shí)候。只需修改一個(gè)常量的定義,而不必到修改:原:#defineSTUDENT_NUMBERS52 改為:#defineSTUDENT_NUMBERS54 不用到程序中修改所有代表學(xué)生總數(shù)的52。特別是常數(shù)的數(shù)值非常復(fù)雜的時(shí)候如:11100001111.0000111,這種數(shù)值在輸入時(shí)非常4.1const和dinfien定義常量的區(qū)別define只是簡(jiǎn)單的進(jìn)行了一個(gè)字符串的替換。define定義的常量的調(diào)試。序中與處理的時(shí)候被替換掉。constdefine定義常量更有優(yōu)勢(shì)。constdefine是否提供類(lèi)型安全檢查是否集成開(kāi)發(fā)環(huán)境可以對(duì)常量進(jìn)行調(diào)試是否是否分配相應(yīng)的空間是否3.const和define都可以定義常量。但是兩者還是有區(qū)別的:define沒(méi)有。define定義的常量。define定義的常量卻不分配空間。所以3.const和define都可以定義常量。但是兩者還是有區(qū)別的:define沒(méi)有。define定義的常量。define定義的常量卻不分配空間。所以const定義的常量比define定義的常量有優(yōu)化。constdefine的constdefinedefineconst有優(yōu)勢(shì)的,因const是無(wú)constdefine的優(yōu)勢(shì)應(yīng)限定在定義常量上。4.3static(靜態(tài))和extern在C++中,程序可以分別放在幾個(gè)源文件上,每個(gè)文件都可作為一個(gè)編譯分別編譯。外部變量只需在某個(gè)文件上定義一次,其他文件若要此變量時(shí),該怎么辦?在同externstatic來(lái)解決。11:static有什么作用static是比較常見(jiàn)的關(guān)鍵字,引入它有什么作用?所涉及到的知識(shí)點(diǎn)static分析問(wèn)題在C中主要定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù):(1)定義全局靜態(tài)變量:以下特點(diǎn):在全局?jǐn)?shù)據(jù)區(qū)內(nèi)分配內(nèi)存。如果沒(méi)有初始化,其默認(rèn)值為0。該變量在本文件內(nèi)從定義開(kāi)始到文件結(jié)束可見(jiàn)。如下例所示:#include<stdio.h> 輸出結(jié)果:(2)定義局部靜態(tài)變量:以下特點(diǎn):該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存。輸出結(jié)果:(2)定義局部靜態(tài)變量:以下特點(diǎn):該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存。0。其作用域?yàn)榫植孔饔糜?,?dāng)定義它的函數(shù)或語(yǔ)句塊結(jié)束時(shí),其作用域隨之結(jié)束。如下例所示:vc中編譯時(shí)會(huì)提示如下錯(cuò)誤:ErrorC2065:'b':undeclaredidentifier mian中無(wú)法調(diào)用。f1結(jié)束時(shí)其作用域結(jié)束。(3)static關(guān)鍵字,函數(shù)即被定義成靜態(tài)函#include<stdio.h>voidf1(void){staticb;printf("Inf1bis:%d\n",b);b=b+1;}voidmain(void){f1();printf("Inmainbis:%d\n",b);return;}Inf1 ais:0Inmainais:1staticinta;voidf1(void){printf("Inf1 a=a+1;}voidmain(void){f1();printf("Inmainais:%d\n",a);return;}數(shù)。靜態(tài)函數(shù)有以下特點(diǎn):靜態(tài)函數(shù)只能在本源文件中使用;在文件作用域中static類(lèi)型。在C++中新增了兩種作用:定義靜態(tài)數(shù)據(jù)成員或靜態(tài)函數(shù)成員。數(shù)。靜態(tài)函數(shù)有以下特點(diǎn):靜態(tài)函數(shù)只能在本源文件中使用;在文件作用域中static類(lèi)型。在C++中新增了兩種作用:定義靜態(tài)數(shù)據(jù)成員或靜態(tài)函數(shù)成員。內(nèi)存分配:在程序的全局?jǐn)?shù)據(jù)區(qū)分配。中定義。public,protected,private關(guān)鍵字對(duì)它的限定和普通數(shù)據(jù)成員一樣,因?yàn)槠淇臻g在全局?jǐn)?shù)據(jù)區(qū)分配,屬于所有本類(lèi)的對(duì)象共享。它不屬于特定的類(lèi)對(duì)象,在沒(méi)產(chǎn)生類(lèi)對(duì)象時(shí)其作用域就可見(jiàn),即在沒(méi)有產(chǎn)生類(lèi)的實(shí)例時(shí),就可以操作它了。形式:【類(lèi)對(duì)象名】【.】【靜態(tài)數(shù)據(jù)成員名】::】【靜態(tài)數(shù)據(jù)成員名】靜態(tài)數(shù)據(jù)成員,主要屬性是類(lèi)的所有實(shí)例都共同擁有。如下例所示:輸出結(jié)果:InMain #include<iostream.h>ClassA{public:staticintx;inty;A();~A();};intA::x=5;A::A(){y=6;}A::~A(){}voidmain(void){cout<<"InMain"<<endl;Aa;cout<<"a.x:"<<a.x<<endl;cout<<"a.y:"<<a.y<<endl;}(2)靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)與類(lèi)相,不與類(lèi)的對(duì)象相。靜態(tài)成員函數(shù)不能非靜態(tài)數(shù)據(jù)成員。原因很簡(jiǎn)單,非靜態(tài)數(shù)據(jù)成員屬于特定的類(lèi)實(shí)例。主要用于對(duì)靜態(tài)數(shù)據(jù)成員的操作。它的調(diào)用形式:.】【靜態(tài)成員函數(shù)名】(【參數(shù)列表】(2)靜態(tài)成員函數(shù)。靜態(tài)成員函數(shù)與類(lèi)相,不與類(lèi)的對(duì)象相。靜態(tài)成員函數(shù)不能非靜態(tài)數(shù)據(jù)成員。原因很簡(jiǎn)單,非靜態(tài)數(shù)據(jù)成員屬于特定的類(lèi)實(shí)例。主要用于對(duì)靜態(tài)數(shù)據(jù)成員的操作。它的調(diào)用形式:.】【靜態(tài)成員函數(shù)名】(【參數(shù)列表】):】【:靜態(tài)成員函數(shù)名】(【參數(shù)列表】)如下例所示:#include<iostream.h>classA{public:staticintx;staticvoidset(inti);staticintget(void);inty;A();~A();};intA::x=5;A::A(){y=6;}A::~A(){}voidA::set(inti){x=i;}intA::get(void){returnx;}voidmain(void){cout<<"InMain"<<endl;cout<<"A::get():"<<A::get()<<endl;A::set(9);cout<<"A::get():"<<A::get()<<endl;Aa;cout<<"a.get():"<<a.get()<<endl;A::x:5:5:6輸出結(jié)果:3.static在C中主要用于定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù)。在C++中新增了兩種作用:定義靜態(tài)數(shù)據(jù)成員、靜態(tài)函數(shù)成員。static0,普通變量的默認(rèn)值為隨機(jī)數(shù),在定義指針變量時(shí)要特別注意。12:extern有什么作用extern是常見(jiàn)的關(guān)鍵字,引入它有什么作用?1. 所涉及到的知識(shí)點(diǎn)輸出結(jié)果:3.static在C中主要用于定義全局靜態(tài)變量、定義局部靜態(tài)變量、定義靜態(tài)函數(shù)。在C++中新增了兩種作用:定義靜態(tài)數(shù)據(jù)成員、靜態(tài)函數(shù)成員。static0,普通變量的默認(rèn)值為隨機(jī)數(shù),在定義指針變量時(shí)要特別注意。12:extern有什么作用extern是常見(jiàn)的關(guān)鍵字,引入它有什么作用?1. 所涉及到的知識(shí)點(diǎn)extern2. 分析問(wèn)題C、C++語(yǔ)言中表明函數(shù)和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字。extern變量來(lái)說(shuō),僅僅是一個(gè)變量的,其并不是定義,因?yàn)榉峙鋬?nèi)存空間。一個(gè)變量可以1.cpp多次,但如果該變量定義多次,會(huì)有錯(cuò)誤。如:輸出結(jié)果:10#include"iostream.h"intevalue;voidmain(){evalue=10;evalue++;}InMainA::get():5A::get():9a.get():9a.get():8a.set(8);}2.cpp輸出結(jié)果:10 為外部部。因此用來(lái)外部的函數(shù),時(shí)有無(wú)extern都可以通過(guò)。而全局變量則不行。通常,在模塊的頭文件中對(duì)本模塊提供給其他模塊的函數(shù)和全局變量以關(guān)鍵字extern hextern加以include該.h文件就可以了。而且編譯此函數(shù)或變量。3.extern標(biāo)識(shí)的變量或者函數(shù)在其它模塊中尋找其定義。13:簡(jiǎn)述變量類(lèi)型述C、C++中變量的 類(lèi)型。所涉及到的知識(shí)點(diǎn)2.cpp輸出結(jié)果:10 為外部部。因此用來(lái)外部的函數(shù),時(shí)有無(wú)extern都可以通過(guò)。而全局變量則不行。通常,在模塊的頭文件中對(duì)本模塊提供給其他模塊的函數(shù)和全局變量以關(guān)鍵字extern hextern加以include該.h文件就可以了。而且編譯此函數(shù)或變量。3.extern標(biāo)識(shí)的變量或者函數(shù)在其它模塊中尋找其定義。13:簡(jiǎn)述變量類(lèi)型述C、C++中變量的 類(lèi)型。所涉及到的知識(shí)點(diǎn)變量的 類(lèi)型數(shù)據(jù)類(lèi)型分析問(wèn)題變量的類(lèi)型定義如下:【類(lèi)型】【類(lèi)型】【變量名表】;變量的類(lèi)型是對(duì)變量的作用域、空間、生存期的規(guī)定。變量的類(lèi)型分為四種:自動(dòng)類(lèi)型、寄存器類(lèi)型、靜態(tài)類(lèi)型、外部類(lèi)型。(1)自動(dòng)(auto):定義自動(dòng)變量,格式為:】【類(lèi)型】【變量名表】;例如:autointx=1,y=2; x、y。自動(dòng)變量被分配在內(nèi)存的動(dòng)態(tài)auto,如下代碼:區(qū)中。定義局部自動(dòng)變量時(shí)#include"iostream.h"externevalue;voidmain(){cout<<evalue<<endl;}輸出結(jié)果:A到自動(dòng)變量結(jié)束的B之間,輸出結(jié)果:A到自動(dòng)變量結(jié)束的B之間,0。(2)寄存器(register):定義寄存器變量。格式為:【register】【類(lèi)型】【變量名表】;例如:registerintx=1,y=2; x,y。寄存器變量如下代碼:于CPU的寄存器中,其作用域同自動(dòng)變量。#include<iostream.h>voidf1(intx,inty){registera=0,b=0; //Aa=a+1;b=b+x+y;cout<<"a:"<<a<<""<<"b:"<<b<<endl; //B}voidmain(void){intx=1;inty=2;f1(x,x);f1(y,y);a:1b:2a:1b:4#include<iostream.h>voidf1(intx,inty){autointa=0,b=0; //Aa=a+1;b=b+x+y;cout<<"a:"<<a<<""<<"b:"<<b<<endl; //B}voidmain(void){intx=1;inty=2;f1(x,x);f1(y,y);return;}輸出結(jié)果:ABAa,bB時(shí)收回a=a+1時(shí)a0。(3)靜態(tài)類(lèi)型(static):定義靜態(tài)變量。格式為:【static】【類(lèi)型】【變量名表】;例如:x,y。靜態(tài)類(lèi)型變量在靜態(tài)區(qū)固定的內(nèi)存區(qū)域。當(dāng)它所在區(qū)域結(jié)束時(shí)其單元被,它的值仍會(huì)被保留。如下代碼:輸出結(jié)果:輸出結(jié)果:ABAa,bB時(shí)收回a=a+1時(shí)a0。(3)靜態(tài)類(lèi)型(static):定義靜態(tài)變量。格式為:【static】【類(lèi)型】【變量名表】;例如:x,y。靜態(tài)類(lèi)型變量在靜態(tài)區(qū)固定的內(nèi)存區(qū)域。當(dāng)它所在區(qū)域結(jié)束時(shí)其單元被,它的值仍會(huì)被保留。如下代碼:輸出結(jié)果:分配空間。f1時(shí)a仍用上次的0。(4)外部(extern):定義外部變量。格式為:【extern】【類(lèi)型】【變量名表】;例如:x,y。外部定義了外部類(lèi)型變量在靜態(tài)區(qū),作用域是定義起始一直到整個(gè)程序結(jié)束為止。如下代碼:#include<iostream.h>externintx=1,y=2;a:3b:3a:6b:3#include<iostream.h>voidf1(intx,inty){staticinta=0; //靜態(tài)變量aintb0; //自動(dòng)變量ba=a+x+y; //自動(dòng)變量a求和b=b+x+y; //靜態(tài)變量b求和cout<<"a:"<<a<<""<<"b:"<<b<<endl;}voidmain(void){intx=1,y=2;f1(x,y);f1(x,y);}staticintx=1,y=2;a:1b:2a:1b:4return;}輸出結(jié)果:在同一工程內(nèi)頭文件h1:其他文件的變量,代碼如下:f1源文件:main源文件:輸出結(jié)果:Beforef1:3In f1:9//main.cpp輸出結(jié)果:在同一工程內(nèi)頭文件h1:其他文件的變量,代碼如下:f1源文件:main源文件:輸出結(jié)果:Beforef1:3In f1:9//main.cpp#include"h1.h"externvoidf1();voidmain(){n=3;printf("Beforef1:%d\n",n);f1();printf("Afterf1:%d\n",n);}//f1.cpp#include"h1.h"intn;voidf1(){n=9;printf("Inf1:%d\n",n);}//h1.hexternintn;x:1y:2Add:3externintx=1,y=2; //說(shuō)明外部變量x,bintAdd(intaintb{cout<<"x:"<<x<<""<<"y:"<<y<<endl; a,breturn(ab}voidmain(){intm=0;mAdd(x,y); cout<<"Add:"<<m<<endl;}Afterf1:9 n時(shí),它發(fā)現(xiàn)這個(gè)變量是在外部定義的,于是搜索工程中所f1.cppn99Afterf1:9 n時(shí),它發(fā)現(xiàn)這個(gè)變量是在外部定義的,于是搜索工程中所f1.cppn99main.cpp時(shí),n9。n.cppn,則系統(tǒng)會(huì)報(bào)錯(cuò)。3.變量的類(lèi)型是對(duì)變量作用域、空間、生存期的規(guī)定。變量的類(lèi)型分為四這四種類(lèi)型說(shuō)明的變量分別稱(chēng)為自動(dòng)變量、寄存器變量、外部變量與靜態(tài)變量。4.4volatile編程中狀態(tài)寄存器變量會(huì)隨時(shí)被外界條件改變,屬于這種類(lèi)型的變量。在多線程編程中臨界變量,被幾個(gè)線程共享,也是“易變的”,也應(yīng)定義為這種類(lèi)型的變量。14:volatile有什么作用volatile有什么作用。所涉及到的知識(shí)點(diǎn)volatile線程分析問(wèn)題volatile定義變量的值是易變的,一般編譯器不去假設(shè)這個(gè)變量的值。優(yōu)化器每次用到這個(gè)變量的時(shí)候都要去重新于以下幾種情況:這個(gè)變量的值,而不是直接寄存器內(nèi)的備份。主要用(1)狀態(tài)寄存器一類(lèi)的并行設(shè)備硬件寄存器。(2)一個(gè)中斷服務(wù)子程序會(huì)到的非自動(dòng)變量。(3)多線程間被幾個(gè)任務(wù)共享的變量。有如下代碼:#include<stdio.h>#include<pthread.h>改后跳出循環(huán),可結(jié)果卻是:改后跳出循環(huán),可結(jié)果卻是:f1:3 這與想象中的結(jié)果完全不一樣,是什么原因造成這樣的結(jié)果呢?查看以下匯編代碼,才知道,是編譯器將這段代碼給優(yōu)化掉了,匯編代碼如下:.file"test.c".section.rodata.str1.1,"aMS",@progbits,1.LC0:.string"f1:%d\n".text.p2align4,,15.globlf1.typef1,@functionf1:pushl%ebpmovl%esp,%ebpsubl$8,%espmovl$1,(%esp)callsleepmovl$3,4(%esp)movl$.LC0,(%esp)movl$3,icallprintfleaveret.sizef1,.-f1f1();inti;intmain(){pthread_tmy_thread;interr,k;perror("Createthreadfeiled:%s\n");i=2;while(i==2);main:%d\n",i);while(1);return0;}voidf1(){sleep(1);i=3;printf("f1:%d\n",i);}ivolatile后:intivolatile后:intvolatilei; 的結(jié)果為:這個(gè)結(jié)果顯然達(dá)到了預(yù)期的效果,再查看它的匯編代碼,會(huì)看到那個(gè)帶有條件的循環(huán)語(yǔ)句。.file"test.c".section.rodata.str1.1,"aMS",@progbits,1.LC0:.string"f1:%d\n"f1:3main:3.section.rodata.str1.1.LC1:.string"can'tcreatethread:%s\n".text.p2align4,,15.globlmainmain:leal4(%esp),%ecxandl$-16,%esppushl-4(%ecx)pushl%ebpmovl%esp,%ebppushl%ecxsubl$36,%espmovl$0,12(%esp)movl$f1,8(%esp)movl$0,4(%esp)movl%eax,(%esp)callpthread_createtestl%eax,%eaxjs.L9.L4:movl$2,i.L6:jmp.L6.L9:movl$.LC1,(%esp)callperrorjmp.L4.sizemain,.-mi,4,4.ident"GCC:(GNU)4.1.320080623(prerelease)(Ubuntu4.1.2-23ubuntu3)".section.note.GNU-stack,"",@progbits.text.p2align4,,15.globlf1.typef1,@function.text.p2align4,,15.globlf1.typef1,@functionf1:pushl%ebpmovl%esp,%ebpsubl$8,%espmovl$1,(%esp)callsleepmovl$3,imovli,%eaxmovl$.LC0,(%esp)movl%eax,4(%esp)callprintfleaveret.sizef1,.-f1.section.rodata.str1.1.LC1:.string"can'tcreatethread:%s\n".LC2:.string"main:%d\n".text.p2align4,,15.globlmainmain:leal4(%esp),%ecxandl$-1
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年粵人版拓展型課程生物上冊(cè)階段測(cè)試試卷
- 2024年西藏警官高等專(zhuān)科學(xué)校高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2025年外研版選修3化學(xué)上冊(cè)階段測(cè)試試卷含答案
- 2024房屋抵押擔(dān)保合同
- 2025年度鐵礦石貿(mào)易結(jié)算合作協(xié)議范本3篇
- 2025年中圖版必修1地理下冊(cè)階段測(cè)試試卷
- 二零二五年度不銹鋼電梯配件供應(yīng)與安裝服務(wù)合同3篇
- 2024投標(biāo)標(biāo)前生態(tài)保護(hù)與修復(fù)工程投標(biāo)標(biāo)前合同3篇
- 2024年聊城職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試歷年參考題庫(kù)含答案解析
- 2025年滬科版選修3化學(xué)上冊(cè)階段測(cè)試試卷
- 經(jīng)典酒吧轉(zhuǎn)讓協(xié)議書(shū)范本(3篇)
- DB37-T 5026-2022《居住建筑節(jié)能設(shè)計(jì)標(biāo)準(zhǔn)》
- 抗菌藥物合理應(yīng)用PPT
- 《三角形的分類(lèi)》-完整版課件
- 風(fēng)力發(fā)電機(jī)組地基處理
- 護(hù)士聘用證明表下載
- 《中外資產(chǎn)評(píng)估準(zhǔn)則》課件第2章 資產(chǎn)評(píng)估DNA透視
- 1986考研英語(yǔ)真題及答案解析
- 二重積分的概念
- PPK-CPK(自動(dòng)生成)
- 熱電偶、熱電阻產(chǎn)品選型樣本
評(píng)論
0/150
提交評(píng)論