版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1C語(yǔ)言程序設(shè)計(jì)計(jì)算機(jī)學(xué)院
第六章2第6章結(jié)構(gòu)體與共用體6.1結(jié)構(gòu)體概述6.1.1結(jié)構(gòu)體的引入為了方便處理多個(gè)數(shù)據(jù)項(xiàng)的數(shù)據(jù),常常把這些關(guān)系密切但類(lèi)型不同的數(shù)據(jù)項(xiàng)組織在一起,即“封裝”起來(lái),并為其取一個(gè)名字,在C語(yǔ)言中,就稱(chēng)其為結(jié)構(gòu)體(有些高級(jí)語(yǔ)言稱(chēng)之為記錄)。所以,結(jié)構(gòu)體通常是由不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)項(xiàng)組成,一般也稱(chēng)是由不同成員組成,因此可以說(shuō):一個(gè)結(jié)構(gòu)體可包含若干成員,每一個(gè)成員可具有不同的名字及數(shù)據(jù)類(lèi)型。結(jié)構(gòu)體的引入為處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)提供了有力的手段,也為函數(shù)間傳遞一組不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)提供了方便,特別是對(duì)于數(shù)據(jù)結(jié)構(gòu)較為復(fù)雜的大型程序提供了方便。36.1.2結(jié)構(gòu)體類(lèi)型的定義結(jié)構(gòu)體類(lèi)型和簡(jiǎn)單類(lèi)型不同,簡(jiǎn)單類(lèi)型是由系統(tǒng)預(yù)定義的,如int、float、char,直接可以使用。而結(jié)構(gòu)體類(lèi)型是根據(jù)需要由程序員自行定義,因此在使用之前必須先定義結(jié)構(gòu)體類(lèi)型。結(jié)構(gòu)體類(lèi)型定義struct
[結(jié)構(gòu)體名]{
類(lèi)型標(biāo)識(shí)符成員名;類(lèi)型標(biāo)識(shí)符成員名;
…………….};合法標(biāo)識(shí)符可省:無(wú)名結(jié)構(gòu)體成員類(lèi)型可以是基本型或構(gòu)造型struct是關(guān)鍵字,不能省略4例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];};structstudents1;namenumsexagescoreaddr2字節(jié)2字節(jié)20字節(jié)1字節(jié)4字節(jié)30字節(jié)……..結(jié)構(gòu)體類(lèi)型定義描述結(jié)構(gòu)的組織形式,定義類(lèi)型時(shí)不分配內(nèi)存,當(dāng)定義變量時(shí)分配內(nèi)存單元5說(shuō)明(1)
定義一個(gè)結(jié)構(gòu)體類(lèi)型只是描述了此結(jié)構(gòu)體的組織形式,在編譯時(shí)并不為其分配存儲(chǔ)空間,即僅描述此數(shù)據(jù)結(jié)構(gòu)的形態(tài)或者說(shuō)模型,故不能對(duì)定義的一個(gè)結(jié)構(gòu)體類(lèi)型進(jìn)行賦值、存取或運(yùn)算。(2)結(jié)構(gòu)體的成員可以是簡(jiǎn)單變量、數(shù)組、指針、結(jié)構(gòu)體或公用體等。(3)結(jié)構(gòu)體類(lèi)型定義可以放在函數(shù)內(nèi)部,也可以放在函數(shù)外部。若放在內(nèi)部,則只在函數(shù)內(nèi)有效;若放在外部,則從定義點(diǎn)到源文件尾之間的所有函數(shù)都有效。(4)結(jié)構(gòu)體成員的名字可以同程序中的其它變量同名,二者不會(huì)相混,系統(tǒng)會(huì)自動(dòng)識(shí)別它。66.2結(jié)構(gòu)體變量6.2.1結(jié)構(gòu)體變量的定義與初始化1.結(jié)構(gòu)體變量的定義同其它變量一樣,結(jié)構(gòu)體變量也必須先定義,然后才能引用。一個(gè)結(jié)構(gòu)體變量的定義可以有以下三種方式:(1)先定義類(lèi)型再定義變量(推薦)其形式:structstud_type{charname[10];longnum;charsex;intage;floatscore;charaddress[10];};structstud_typestudent1,student2;7(2)在定義類(lèi)型的同時(shí)定義變量(推薦)其形式:structstud_type{┇}student1,student2;(3)直接定義結(jié)構(gòu)體變量其形式:struct{┇}student1,student2;8說(shuō)明(1)
在定義結(jié)構(gòu)體類(lèi)型時(shí),系統(tǒng)并不分配內(nèi)存空間,僅當(dāng)定義結(jié)構(gòu)體變量時(shí),系統(tǒng)才為被定義的每一變量分配相應(yīng)的存儲(chǔ)單元。如上面定義的結(jié)構(gòu)體變量student1、student2在內(nèi)存中各占31個(gè)字節(jié)(10+4+1+2+4+10=31)(2)
結(jié)構(gòu)體變量的定義一定要在結(jié)構(gòu)體類(lèi)型定義之后或同時(shí)進(jìn)行,對(duì)尚未定義的結(jié)構(gòu)體類(lèi)型,不能用它來(lái)定義結(jié)構(gòu)體變量。例如:對(duì)一個(gè)教師teacher的結(jié)構(gòu)體類(lèi)型未作定義,則下面的變量定義structteacherteah1
是錯(cuò)誤的;反之亦然;對(duì)某變量birthday
(也稱(chēng)結(jié)構(gòu)體成員變量),若其類(lèi)型未作定義,就寫(xiě)structdate_typebirthday;也是錯(cuò)誤的。92.結(jié)構(gòu)體變量的初始化所謂結(jié)構(gòu)體變量初始化,就是在定義結(jié)構(gòu)體變量的同時(shí),對(duì)其成員變量賦初值,在賦值時(shí)應(yīng)注意按順序及類(lèi)型依次為每個(gè)結(jié)構(gòu)體成員指定初始值。結(jié)構(gòu)體初始化的一般格式為:struct結(jié)構(gòu)體類(lèi)型名結(jié)構(gòu)體變量={初始化值};說(shuō)明(1)初始化數(shù)據(jù)之間用逗號(hào)分隔。(2)
初始化數(shù)據(jù)的個(gè)數(shù)一般與成員的個(gè)數(shù)相同,若小于成員數(shù),則剩余的成員將被自動(dòng)初始化為0(若成員是指針,則初始化為NULL)。(3)
初始化數(shù)據(jù)的類(lèi)型要與相應(yīng)成員變量的類(lèi)型一致。初始化時(shí)只能對(duì)整個(gè)結(jié)構(gòu)體變量進(jìn)行,不能對(duì)結(jié)構(gòu)體類(lèi)型中的某個(gè)成員進(jìn)行初始化賦值。10例:structdate_type{intyear;intmouth;intday;};structstud_type{charname[10];longnum;charsex;
structdate_typebirthday;floatscore;charaddress[10];};voidmain(){structstud_typestudent1={"wang",196103,'m',1978,10,12,98,"Xian"};structstud_typestudent2={"liu",196105,'m',1980,9,22,88,"Benjing"};}116.2.2結(jié)構(gòu)體變量的引用1.對(duì)結(jié)構(gòu)體變量成員的引用在C語(yǔ)言程序中,不準(zhǔn)許對(duì)結(jié)構(gòu)變量整體進(jìn)行各種運(yùn)算、賦值或輸入輸出操作,而只能是對(duì)其成員進(jìn)行此類(lèi)操作。引用結(jié)構(gòu)體變量成員的一般形式:結(jié)構(gòu)體變量名.成員名其中"."是結(jié)構(gòu)體成員運(yùn)算符,其優(yōu)先級(jí)別最高,結(jié)合性是自左至右。由此對(duì)結(jié)構(gòu)體成員就完全可以像操作簡(jiǎn)單變量一樣操作它。如:對(duì)上例定義的結(jié)構(gòu)體變量student1或student2,可作如下的賦值操作:[10]="wang";student1.num=196103;student1.sex='m';student1.birthday.year=1978;student1.birthday.mouth=10;student1.birthday.day=12;student1.score=98;122.對(duì)結(jié)構(gòu)體變量整體的引用結(jié)構(gòu)體變量和簡(jiǎn)單變量相比,除了上面所述在參加各種運(yùn)算、賦值或輸入輸出方式上有所不同外——即是由結(jié)構(gòu)體變量成員完成,其它同簡(jiǎn)單變量一樣,如:(1)可以相互賦值,但注意相互賦值的兩個(gè)結(jié)構(gòu)體變量必須是同一個(gè)結(jié)構(gòu)體類(lèi)型;如:student1=student2;(2)可作為函數(shù)的形參、實(shí)參或函數(shù)返回值,詳見(jiàn)下節(jié)。136.2.3結(jié)構(gòu)體變量作為函數(shù)參數(shù)結(jié)構(gòu)體變量成員作函數(shù)參數(shù)結(jié)構(gòu)體變量中的所有成員都可作為函數(shù)參數(shù)structstud_type{charname[10];longnum;charsex;}student1;現(xiàn)將結(jié)構(gòu)體變量student1的三個(gè)成員分別傳遞給函數(shù)func1(),func2(),func3():func1();func2(student1.num);func1(student1.sex);14若需要將成員地址傳遞給函數(shù),則只需在其前加取地址符“&”。如:func1();func2(&student1.num);func1(&student1.sex);其中字符數(shù)組名name代表其成員地址,故不許要寫(xiě)“&”。2.結(jié)構(gòu)體變量整體作函數(shù)參數(shù)老板本的C系統(tǒng)不允許用結(jié)構(gòu)體變量作函數(shù)參數(shù),只允許用指向結(jié)構(gòu)體變量的指針作函數(shù)參數(shù)(第7章),傳遞的是結(jié)構(gòu)體變量的首地址。而ANSIC取消了這一限制,規(guī)定按值傳遞方式。在函數(shù)調(diào)用時(shí),系統(tǒng)為形參結(jié)構(gòu)體變量分配存儲(chǔ)空間,并從相應(yīng)的實(shí)參結(jié)構(gòu)體變量中取得各成員的值,若對(duì)形參中結(jié)構(gòu)體變量各成員值進(jìn)行修改,并不能修改實(shí)參結(jié)構(gòu)體變量各成員的值。這里要注意,實(shí)參和形參結(jié)構(gòu)體變量類(lèi)型應(yīng)當(dāng)完全一致。156.3結(jié)構(gòu)體數(shù)組6.3.1結(jié)構(gòu)體數(shù)組的定義與初始化1.結(jié)構(gòu)體數(shù)組的定義在定義結(jié)構(gòu)體數(shù)組時(shí)其定義方法與定義結(jié)構(gòu)體變量方法類(lèi)似,也有三種形式。定義如下:structdate_type
{intyear;intmouth;intday;};structstud_type{charname[10];longnum;charsex;structdate_typebirthday;floatscore;charaddress[10];};structstud_typestudent[3];
16由此就定義了一個(gè)結(jié)構(gòu)體數(shù)組student[3],它有3個(gè)元素,每個(gè)元素都是structstud_type類(lèi)型,各占35個(gè)字節(jié)(10+4+1+(2+2+2)+4+10=35)。172.結(jié)構(gòu)體數(shù)組的初始化結(jié)構(gòu)體數(shù)組在定義的同時(shí)可以初始化。其一般格式是在定義之后緊跟一個(gè)用花括號(hào)括起來(lái)的一組初始數(shù)據(jù),為了增強(qiáng)可讀性,最好使每一個(gè)數(shù)組元素的初始數(shù)據(jù)也用花括弧括起來(lái),以此來(lái)區(qū)分各個(gè)數(shù)組元素。對(duì)上所定義的結(jié)構(gòu)體數(shù)組student初始化如下:stuctstud_typestudent[2]={{"wang",196103,'m',1978,10,12,98,"xian"},{"zhang",196102,'f',1977,1,10,87,Beijing"}};18說(shuō)明(1)
可以將一個(gè)結(jié)構(gòu)體數(shù)組元素賦值給同一結(jié)構(gòu)體類(lèi)型數(shù)組中另一個(gè)元素,或賦給同一類(lèi)型的變量。如:structstud_typestudent[3],student1;現(xiàn)在就定義了一個(gè)結(jié)構(gòu)體數(shù)組student[],又定義了一個(gè)結(jié)構(gòu)體變量student1,則下面的賦值合法。studentl=student[0];student[0]=student[1];studnet[1]=student1;(2)
不能把結(jié)構(gòu)體數(shù)組元素作為一個(gè)整體直接進(jìn)行輸入或輸出。如printf("%d",student[0]);或scanf("%d",&student[0]);只能以單個(gè)成員為對(duì)象進(jìn)行輸入輸出,如:scanf("%s",student[0].name);scanf("%ld",&student[0].num);printf("%s%ld\n",student[0].name,student[0].num);19例統(tǒng)計(jì)后選人選票structperson{charname[20];intcount;}leader[3]={“Li”,0,“Zhang”,0,”Wang“,0};voidmain(){inti,j;charleader_name[20];
for(i=1;i<=10;i++){scanf("%s",leader_name);
for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0) leader[j].count++;}for(i=0;i<3;i++)printf("%5s:%d\n",leader[i].name,leader[i].count);}namecountLiZhangWang000206.3.3結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)與結(jié)構(gòu)體變量一樣,結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)傳遞也只有在C的高版本中才支持,但它們是有本質(zhì)區(qū)別的,當(dāng)然在定義形參與實(shí)參的結(jié)構(gòu)體類(lèi)型時(shí)還是必須一致,當(dāng)實(shí)參為結(jié)構(gòu)體數(shù)組時(shí),其形參須定義為同類(lèi)型結(jié)構(gòu)的結(jié)構(gòu)體數(shù)組或結(jié)構(gòu)體指針;結(jié)構(gòu)體數(shù)組作函數(shù)參數(shù)21例6.3鍵盤(pán)輸入n名學(xué)生信息,要求輸出用函數(shù)print完成。(P141)#include<stdio.h>structstud_type{charname[10];intnum;floatscore[3];};voidprint(structstud_typestu[],intn);voidmain(){inti,n;structstud_typestu1[30];printf(“請(qǐng)輸入學(xué)生人數(shù)n:\n”);scanf(“%d”,&n);printf(“請(qǐng)輸入%d名學(xué)生信息(姓名,學(xué)號(hào)3門(mén)課成績(jī)):\n”,n);for(i=0;i<n;i++)scanf(“%s%d%f%f%f”,stu1[i].name,&stu1[i].num,&stu1[i].score[0],&stu1[i].score[1],&stu1[i].score[2]);print(stu1,n);}22voidprint(structstud_typestu[],intn){intI;printf(“姓名學(xué)號(hào)成績(jī)1成績(jī)2成績(jī)3:\n”);for(i=0;i<n;i++)printf(%-8s%8d%8.2f%8.2f%8.2f\n”,stu[i].name,stu[i].num,stu[i].score[0],num,stu[i].score[1],num,stu[i].score[2]);}例6.4鍵盤(pán)輸入10名學(xué)生信息,每個(gè)學(xué)生有姓名
學(xué)號(hào)成績(jī),要求用一個(gè)排序函數(shù)sort完成按學(xué)生成績(jī)降序排列,并輸出學(xué)生成績(jī)排行榜。(主函數(shù)完成輸入,輸出)P14323#defineN10#include<stdio.h>#include<string.h>structstud_type{charname[10];intnum;intscore;};voidsort(structstud_typestu[]);voidmain(){inti;structstud_typestu[N];printf(“請(qǐng)輸入%d名學(xué)生信息(姓名,學(xué)號(hào)成績(jī)):\n”,N);for(i=0;i<N;i++)scanf(“%s%d%d”,stu[i].name,&stu[i].num,&stu[i].score);sort(stu);printf(“排序后\n”);for(i=0;i<N;i++)printf(“%-8s%5d%5d\n”,stu[i].name,stu[i].num,stu[i].score);}24voidsort(structstud_typestu[])
{inti,k,j;structstud_typet;for(i=0;i<N-1;i++){k=i;for(j=i+1;j<N;j++)if(stu[k].score<stu[j].score)k=j;if(k!=i){t=stu[i];stu[i]=stu[k];stu[k]=t;}}}256.4共用體在C語(yǔ)言中,允許不同數(shù)據(jù)類(lèi)型使用同一存儲(chǔ)區(qū)域,共用體就是一種同一存儲(chǔ)區(qū)域由不同類(lèi)型變量共享的數(shù)據(jù)類(lèi)型。它提供—種方法能在同一存儲(chǔ)區(qū)中操作不同類(lèi)型的數(shù)據(jù),也就是說(shuō)共用體采用的是覆蓋存儲(chǔ)技術(shù),準(zhǔn)許不同類(lèi)型數(shù)據(jù)互相覆蓋。6.4.1共用體類(lèi)型定義共用體類(lèi)型的定義與結(jié)構(gòu)體類(lèi)似,其一般定義格式如下:union共用體名{共用體成員表;};其中union是關(guān)鍵字,稱(chēng)為共用體定義標(biāo)識(shí)符,共用體名同樣由程序員來(lái)命名。大括號(hào)中的共用體成員表包含若干成員,每一個(gè)成員都具有如下的形式:
數(shù)據(jù)類(lèi)型標(biāo)識(shí)符成員名;26如:uniondata{inti;charch;floatf;};6.4.2共用體變量定義與引用1.共用體變量的定義union共用體名{共用體成員表;}變量列表;如:uniondata{inti;charch;floatf;}a,b,c;272.共用體變量的引用(例6.5p133)
共用體變量名.成員名;如上例所示:a.i;a.ch;a.f說(shuō)明:(1)共用體變量不能同時(shí)存放多個(gè)成員的值,而只能存放其中一個(gè)值,即只能存放當(dāng)前(最新)的一個(gè)成員的值;(2)就共用體變量整體而言,和結(jié)構(gòu)體變量一樣是不能進(jìn)行整體的輸入、輸出,但可以在兩個(gè)同一類(lèi)型的共用體變量之間賦值;(3)由于共用體變量不能同時(shí)存放多個(gè)成員的值,因此共用體變量不能進(jìn)行初始化。28例6.5共用體變量的引用voidmain(){unionint_char{inti;charch[2];}x;x.i=24897;printf(“i=%d\ni=%0\n”,x.i,x.i);printf(“ch0=%0,ch1=%0\nch0=%c,ch1=%c\n”,x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}29結(jié)構(gòu)體與共用體區(qū)別:存儲(chǔ)方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk變量的各成員同時(shí)存在任一時(shí)刻只有一個(gè)成員存在聯(lián)系:兩者可相互嵌套306.5枚舉類(lèi)型在實(shí)際應(yīng)用中,有些變量的取值范圍是有限的,僅可能只有幾個(gè)值,如一個(gè)星期7天,一年12個(gè)月,一副撲克有4種花色,每一花色有13張牌等等。此時(shí)用整型數(shù)來(lái)表示這些變量的取值,其直觀性很差,如在程序中使用1,對(duì)于非編程者來(lái)說(shuō),它是代表星期一呢?還是一月份?很難區(qū)分。若在程序中使用“Mon”,則不會(huì)有人認(rèn)為是代表一月份。由此看出,為提高程序的可讀性,引入非數(shù)值量,即一些有意義的符號(hào)是非常必要的。對(duì)于這種應(yīng)用,C語(yǔ)言引入枚舉類(lèi)型,所謂“枚舉”,就是將變量可取的值一一列舉出來(lái)。31對(duì)枚舉類(lèi)型也要先定義其類(lèi)型,再定義其變量。枚舉類(lèi)型定義的一般形式是:enum枚舉名{枚舉值列表;};其中enum是關(guān)鍵字,稱(chēng)為枚舉類(lèi)型定義標(biāo)識(shí)符,枚舉名由程序員命名。32標(biāo)識(shí)符也是由程序員自定義,都是一些描述性標(biāo)識(shí)符,要求不能重名,這些標(biāo)識(shí)符分別代表不同枚舉元素,通常稱(chēng)為枚舉常量。如:enumweekday{sun,mon,tue,wed,thu,fri,sat};由此定義了一個(gè)枚舉類(lèi)型enumweekday,它有7個(gè)枚舉元素(常量)。在定義了類(lèi)型之后,就可以用該類(lèi)型來(lái)定義變量:如:enumweekdayworkday;33說(shuō)明(1)
在C語(yǔ)言中,每一個(gè)枚舉常量的值取決于在說(shuō)明時(shí)排列的先后次序,第一個(gè)枚舉常量的序號(hào)為0(規(guī)定序號(hào)從0編起),因此,此枚舉常量值為0,以后順序加1,故不允許對(duì)枚舉常量進(jìn)行賦值操作。若想改變枚舉常量的值,在枚舉變量定義時(shí)可由程序員指定,如:enumfruit{apple=7,pear,orange=3,lemon,peach}t;此時(shí)apple的值為7,pear的值為8,orange的值為3,lemon,peach的值分別為4,5。34(2)
一個(gè)枚舉變量的值只能是這幾個(gè)枚舉常量之一,可以將枚舉常量賦給一個(gè)枚舉變量,但不能將一個(gè)整數(shù)賦給它。如:
workday=sun;正確
workday=7;錯(cuò)誤(3)若想將整數(shù)值賦給枚舉變量須作強(qiáng)制類(lèi)型轉(zhuǎn)換。如:
workday=(enumweekday)2;相當(dāng)于workday=tue;此時(shí),轉(zhuǎn)換后的值亦應(yīng)在枚舉范圍內(nèi)。356.6用typedef定義類(lèi)型功能:用自定義名字為已有數(shù)據(jù)類(lèi)型命名類(lèi)型定義簡(jiǎn)單形式:typedeftype
name;例typedefintINTEGER;類(lèi)型定義語(yǔ)句關(guān)鍵字已有數(shù)據(jù)類(lèi)型名用戶(hù)定義的類(lèi)型名例typedeffloatREAL;類(lèi)型定義后,與已有類(lèi)型一樣使用例INTEGERa,b,c;REALf1,f2;
inta,b,c;floatf1,f2;說(shuō)明:1.typedef沒(méi)有創(chuàng)造新數(shù)據(jù)類(lèi)型2.typedef是定義類(lèi)型,不能定義變量3.typedef與define
不同
define
typedef預(yù)編譯時(shí)處理
編譯時(shí)處理簡(jiǎn)單字符置換
為已有類(lèi)型命名
36typedef定義類(lèi)型步驟按定義變量方法先寫(xiě)出定義體如inti;將變量名換成新類(lèi)型名如int
INTEGER;最前面加typedef如typedefintINTEGER;用新類(lèi)型名定義變量如INTEGERi,j;例定義數(shù)組類(lèi)型
inta[100];intARRAY[100];typedefintARRAY[100];ARRAYa,b,c;例定義結(jié)構(gòu)體類(lèi)型變量
structdate{intmonth;intday;intyear;}d;例定義結(jié)構(gòu)體類(lèi)型變量
structdate{intmonth;intday;intyear;}DATE;例定義結(jié)構(gòu)體類(lèi)型DATEtypedefstructdate{intmonth;intday;intyear;}DATE;37說(shuō)明:(1)定義的新類(lèi)型名一般使用大寫(xiě)字母,以便與系統(tǒng)的標(biāo)準(zhǔn)類(lèi)型標(biāo)識(shí)符相區(qū)別。(2)僅給已有的類(lèi)型名重新命名,并不產(chǎn)生新的數(shù)據(jù)類(lèi)型,原有的數(shù)據(jù)類(lèi)型也沒(méi)有被取代,即只是此類(lèi)型的一個(gè)“別名”。如typedefintINTEGER;,只是給int起了一個(gè)新的名字而已,int仍可用。(3)定義一個(gè)新的數(shù)據(jù)類(lèi)型名,并沒(méi)有定義變量,因而談不上分配存儲(chǔ)單元。(4)typedef與#define有相似之處,如typedefintINTEGER;#defintINTEGERint;作用都是用INTEGER代替int,但二者有本質(zhì)的區(qū)別,前者是為int定義了一個(gè)別名,而后者是宏代換。
38第九章編譯預(yù)處理作用:對(duì)源程序編譯之前做一些處理,生成擴(kuò)展C源程序種類(lèi)宏定義#define文件包含#include條件編譯#if--#else--#endif等格式:“#”開(kāi)頭占單獨(dú)書(shū)寫(xiě)行語(yǔ)句尾不加分號(hào)39如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展開(kāi)后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);9.1宏定義不帶參數(shù)宏定義一般形式:#define宏名[宏體]功能:用指定標(biāo)識(shí)符(宏名)代替字符序列(宏體)宏展開(kāi):預(yù)編譯時(shí),用宏體替換宏名---不作語(yǔ)法檢查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏體可缺省,表示宏名定義過(guò)或取消宏體定義位置:任意(一般在函數(shù)外面)作用域:從定義命令到文件結(jié)束#undef可終止宏名作用域格式:
#undef宏名例#defineYES
11main(){……..}
#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定義可嵌套,不能遞歸例#defineMAXMAX+10()引號(hào)中的內(nèi)容與宏名相同也不置換例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展開(kāi):printf(“2*PI=%f\n”,3.14159*2);宏定義中使用必要的括號(hào)()例#defineWIDTH80#defineLENGTH
WIDTH+40var=LENGTH*2;宏展開(kāi):var=80+40*2;()()例#defineWIDTH80#defineLENGTH
WIDTH+40var=LENGTH*2;宏展開(kāi):var=80+40*2;40帶參數(shù)宏定義一般形式:#define宏名(參數(shù)表)宏體例#defineS(r)PI*r*r#defineS(r)PI*r*r相當(dāng)于定義了不帶參宏S,代表字符串“(r)PI*r*r”宏展開(kāi):形參用實(shí)參換,其它字符保留宏體及各形參一般應(yīng)加括號(hào)()例#defineS(a,b)a*b………..area=S(3,2);宏展開(kāi):area=3*2;不能加空格例#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展
溫馨提示
- 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年宣威市復(fù)興街道辦事處公開(kāi)招聘公益性崗位工作人員(3人)模擬筆試試題及答案解析
- 2026云南昆明市石林彝族自治縣兵役登記暨征兵參考考試題庫(kù)及答案解析
- 2025年甘肅省平?jīng)鍪兄写罂萍技脊W(xué)校招聘21人模擬筆試試題及答案解析
- 深度解析(2026)《GBT 25944-2010鋁土礦 批中不均勻性的實(shí)驗(yàn)測(cè)定》(2026年)深度解析
- 2026廣東省惠州市龍門(mén)縣教育局赴高校招聘急需緊缺學(xué)科教師招聘60人(江西師范大學(xué)場(chǎng))備考筆試題庫(kù)及答案解析
- 2025貴州水投水庫(kù)運(yùn)營(yíng)管理黔東南有限公司第二次招聘參考筆試題庫(kù)附答案解析
- 四川鍋爐高級(jí)技工學(xué)校2025年下半年面向社會(huì)公開(kāi)考核招聘中職教育專(zhuān)業(yè)技術(shù)人才(16人)參考筆試題庫(kù)附答案解析
- 2025上海黃浦科創(chuàng)集團(tuán)招聘7人備考考試試題及答案解析
- 深度解析(2026)《GBT 25702-2010復(fù)擺顎式破碎機(jī) 顎板磨耗》(2026年)深度解析
- 2025山東濟(jì)南市平陰豐源炭素有限責(zé)任公司招聘29人備考筆試試題及答案解析
- 公司便民雨傘管理制度
- 醫(yī)院購(gòu)買(mǎi)電腦管理制度
- 編制竣工圖合同范本
- 新22J01 工程做法圖集
- 預(yù)防高空拋物2
- 廣西欽州市2024-2025學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)測(cè)數(shù)學(xué)試題(解析版)
- 智慧樹(shù)知到《藝術(shù)與審美(北京大學(xué))》期末考試附答案
- 渠道拓展與渠道管理
- 防腐敗和激勵(lì)反腐敗制度
- 2024-2025學(xué)年上海市長(zhǎng)寧區(qū)初三一模語(yǔ)文試卷(含答案)
- 北京市西城區(qū)2022-2023學(xué)年六年級(jí)上學(xué)期數(shù)學(xué)期末試卷(含答案)
評(píng)論
0/150
提交評(píng)論