




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、運算符及其優(yōu)先級優(yōu)先級 運算符名稱或含義使用形式結合方向 優(yōu)先級 運算符名稱或含義使用形式結合方向1數(shù)組下標數(shù)組名常量表達式左到右7=等于表達式=表達式左到右()圓括號(表達式)/函數(shù)名(形參表)!=不等于表達式!=表達式成員選擇(對象)對象.成員名8&按位與表達式減達式左到右-成員選擇(指針)對象指針-成員名9A按位異或表達式A表達式左到右2一負號運算符-表達式右到左10I按位或表達式I表達式左到右(類型)強制類型轉換(數(shù)據(jù)類型)表達式11&邏輯與表達式&昧達式左到右+自增運算符+變量名/變量名+12II邏輯或表達式II表達式左到右-自減運算符-變量名/變量名-13?
2、:條件運算符表達式1?表達式2:表達式3右到左*取值運算符*指針變量14=賦值運算符變量=表達式右到左&取地址運算符噎量名/=除后賦值變量/=表達式!邏輯非運算符!表達式*=乘后賦值變量*=表達式按位取反運算符Bl達式%=取模后賦值變量表達式sizeof長度運算符sizeof(表達式)+=加后賦值變量+=表達式3/除表達式/表達式左到右-=減后賦值變量-=表達式*乘表達式*表達式=左移后賦值變量=右移后賦值變量=表達式4+加表達式+表達式左到右&=按位與后賦值變量&或達式一減表達式-表達式A=按位異或后賦值變量人=表達式5右移變量表達式15,逗號運算符表達式,表達式,左
3、到右6大于表達式表達式左到右=大于等于表達式=表達式小于表達式表達式=小于等于表達式(0 x1000)|a1|-|4|5|6|7|(0 x1010)|_|_|_|_|a2|-|8|9|10|11|(0 x1020)|_|_|_|_|但從二維數(shù)組的角度來看,a代表二維數(shù)組的首地址,當然也可看成是二維數(shù)組第0行的首地址,a+1就代表第1行的首地址,依次。如果此二維數(shù)組的首地址為0 x1000,由于第0行有4個整型元素,所以a+1為0 x1010。既然我們把a0,a1,a2看成是一維數(shù)組名,可以認為它們分別代表它們所對應的數(shù)組的首地址,也就是講a0代表第0行中第0列元素的地址,即&a00,a
4、1是第1行中第0列元素的地址,即&a10,根據(jù)地址運算規(guī)則,a0+1即代表第0行第1列元素的地址,即&a01,一般而言,ai+j即代表第i行第j列元素的地址,即&aij。另外,在二維數(shù)組中我們還可用指針的形式來表示各元素的地址,如a0與*(a+0)等價,ai與*(a+i)等價,它表示數(shù)組元素ai的地址&ai0。而二維數(shù)組元素aij可表示成*(ai+j)或*(*(a+i)+j),或者寫成(*(a+i)j。三、指向一個由n個元素所組成的數(shù)組指針數(shù)組指針用的比較少,但在處理二維數(shù)組時,還是很方便的。例如:int(*p)4;/*在數(shù)組指針的定義中,圓括號是不能少的,否則
5、它是指針數(shù)組*/inta34;p=a;開始時p指向二維數(shù)組第0行,當進行p+1運算時,根據(jù)地址運算規(guī)則,此時放大因子為4x4=16,所以此時正好指向二維數(shù)組的第1行。和二維數(shù)組元素地址計算的規(guī)則一樣,*p+1指向a01,*(p+i)+j則指向數(shù)組元素aij。四、指針數(shù)組因為指針是變量,因此可設想用指向同一數(shù)據(jù)類型的指針來構成一個數(shù)組,這就是指針數(shù)組。數(shù)組中的每個元素都是指針變量,根據(jù)數(shù)組的定義,指針數(shù)組中每個元素都為指向同一數(shù)據(jù)類型的指針。格式:類型標識*數(shù)組名整型常量表達式;例如:int*a10;以上指針數(shù)組中包含10個指針變量a0,a1,a2,a9,可以指向10個不同的地址。指針函數(shù)和函數(shù)
6、指針、指針函數(shù)指針函數(shù)是指聲明其返回值為一個指針的函數(shù),實際上就是返回一個地址給調(diào)用函數(shù)。格式:類型說明符*函數(shù)名(參數(shù))例如:void*GetDate(intID);二、函數(shù)指針指向函數(shù)的指針包含了函數(shù)的地址,可以通過它來調(diào)用函數(shù)。格式:類型說明符(*函數(shù)名)(參數(shù))例如:int(*fptr)(intID);其實這里不能稱為函數(shù)名,應該叫做指針的變量名。這個特殊的指針指向一個返回整型值的函數(shù)。指針的聲明筆削和它指向函數(shù)的聲明保持一致。指針名和指針運算符外面的括號改變了默認的運算符優(yōu)先級。如果沒有圓括號,就變成了一個返回整型指針的函數(shù)的原型聲明??梢圆捎孟旅娴男问蕉x函數(shù)指針數(shù)據(jù)類型:type
7、defint(*T_MY_FUNC)(intID);/*此時T_MY_FUNCfptr;等價于int(*fptr)(intID);*/可以采用下面的形式把函數(shù)的地址賦值給函數(shù)指針:fptr=&Function;/*或用“fptr=Function;*/可以采用下面的形式通過指針來調(diào)用函數(shù):(*fptr)(ID);/*或用“fptr(ID);”的格式,使用這種調(diào)用格式看上去與調(diào)用普通函數(shù)無異,因此使用前一種調(diào)用格式可以明確指出是通過指針而非函數(shù)名來調(diào)用函數(shù)的。*/三、指針的指針指針的指針用于指向指針的地址,它的聲明有兩個星號。例如:char*cp;如果有三個星號,那就是指針的指針的指針,
8、有四個星號那就是指針的指針的指針的指針,依次類推。四、指向指針數(shù)組的指針指針的指針另一用法是處理指針數(shù)組。有些程序員喜歡用指針數(shù)組來代替多維數(shù)組,一個常見的用法就是處理字符串。char*Names=Bill,Sam,Jim,0;main()char*nm=Names;/*定義一個指向指針數(shù)組的指針的指針*/while(*nm!=0)printf(%sn,*nm+);可變參數(shù)的函數(shù)下面是一個簡單的可變參數(shù)的函數(shù),該函數(shù)至少有一個整數(shù)參數(shù),第二個參數(shù)也是整數(shù),是可選的。#includevoidsimple_va_fun(inti,.)(va_listarg_ptr;intj=0;va_start(
9、arg_ptr,i);/*va在這里是可變參數(shù)(variable-argument)的意思*/j=va_arg(arg_ptr,int);va_end(arg_ptr);printf(%d%dn,i,j);return;)從這個函數(shù)的實現(xiàn)可以看到,使用可變參數(shù)應該有以下步驟:1)#include2)在函數(shù)里定義一個va_list型的變量,這里是arg_ptr,這個變量是指向參數(shù)的指針。3)用va_start宏初始化變量arg_ptr,該宏的第二個參數(shù)是第一個可變參數(shù)的前一參數(shù),是一固定的參數(shù)。4)用va_arg返回可變的參數(shù),并賦值給j。va_arg的第二個參數(shù)是要返回的參數(shù)的類型,這里是in
10、t型。5)最后用va_end宏結束可變參數(shù)的獲取。下面的例子可以進一步加深對可變參數(shù)的理解,該函數(shù)的效果與sprintf函數(shù)完全相同:voidmy_printf(char*buffer,constchar*format,.)(va_listarg_ptr;va_start(arg_ptr,format);vsprintf(buffer,format,arg_ptr);/*將arg_ptr按format格式打印到buffer中*/va_end(arg_ptr);)位域的使用位域的定義和位域變量的說明與結構定義相仿,其形式例如為:structbs(inta:8;intb:2;int:2/*無位域名
11、,該2bit不能使用*/intc:4;);對于位域的定義尚有以下幾點說明:1 .一個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所??臻g不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。2.由于位域不允許跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是說不能超過8位二進位。3.位域可以無位域名,這時它只用來作填充或調(diào)整位置。無名的位域是不能使用的。typedefstructstudent(intnumber;intscore;structstudent*next;STUDENT_LINK;STUDENT_LINK*link_creat(intcn
12、t)(STUDENT_LINK*head=NULL;/*head始終指向鏈表頭,用于返回*/STUDENT_LINK*new_node;/*new_node始終指向新申請的節(jié)點*/STUDENT_LINK*cur_node;/*cur_node始終指向當前操作的(也是最后的)節(jié)點*/intn=1;while(nnext=new_node;cur_node=new_node;/*讓cur_node始終指向當前的(也是最后的)節(jié)點*/cur_node-next=NULL;/*不要忘記讓最后的節(jié)點的next指向NULL*/n+;return(head);/*刪除鏈表中number字段為num的結點,
13、并返回鏈表頭*/STUDENT_LINK*link_delete(STUDENT_LINK*head,intnum)(STUDENT_LINK*cur_node;/*cur_node始終指向當前操作的節(jié)點*/STUDENT_LINK*pre_node;/*pre_node始終指向當前操作的節(jié)點的上一個節(jié)點*/if(head=NULL)(printf(這個鏈表是空的,請先建立一個鏈表.n);return(head);/*建立一個有cnt個結點的鏈表,返回鏈表頭*/cur_node=head;while(cur_node-number!=num&cur_node-next!=NULL)/*
14、當前節(jié)點不是要刪除的也不是最后的節(jié)點(pre_node-next=cur_node-next;)free(cur_node);printf(學號為%d的節(jié)點已經(jīng)從鏈表中刪除.n,num);)else/*在鏈表中沒有找到要刪除的結點*/(printf(您想要刪除的結點不在此鏈表中.n);)return(head);)/*插入一個新結點至I鏈表的最后,并返回鏈表頭*/STUDENT_LINK*link_insert(STUDENT_LINK*head,STUDENT_LINK*node)(STUDENT_LINK*cur_node;/*cur_node始終指向當前操作的節(jié)點*/if(head=NU
15、LL)(head=node;)else(cur_node=head;while(cur_node-next!=NULL)(cur_node=cur_node-next;/*將cur_node向后移個結點*/)cur_node-next=node;)node-next=NULL;/*不要忘記讓最后的節(jié)點的next指向NULL*/pre_node=cur_node;cur_node=cur_node-next;)if(cur_node-number=num)(if(cur_node=head)(head=cur_node-next;)else/*將cur_node向后移一個結點*/*在鏈表中找到了
16、要刪除的結點*/*要刪除的是頭結點*/*/printf(這個節(jié)點已經(jīng)插入當前鏈表的最后.n);return(head);)voidlink_main(void)(STUDENT_LINK*new_list=NULL;STUDENT_LINKnew_stud;/*要插入的新結點*/intcnt=5;intnum=100;new_list=link_creat(cnt);printf(您創(chuàng)建的列表為:n);link_output(new_list);new_list=link_delete(new_list,num);printf(刪除結點后的列表為:n);link_output(new_list
17、);link_input(&new_stud);new_list=link_insert(new_list,&new_stud);printf(插入新結點后的列表為:n);link_output(new_list);/*用戶輸入一個節(jié)點*/voidlink_input(STUDENT_LINK*node)(/*輸出一個鏈表*/voidlink_output(STUDENT_LINK*head)(STUDENT_LINK*cur_node;intcnt=0;cur_node=head;printf(IDt學號tt分數(shù)n);while(cur_node!=NULL)(printf(
18、%dt%dtt%dn,+cnt,cur_node-number,cur_node-score);cur_node=cur_node-next;)printf(合計有d條記錄n,cnt);)/*鏈表接口調(diào)用范例*/預處理一、預處理過程和預處理指令在C語言中,并沒有任何內(nèi)在的機制來完成如下一些功能:在編譯時包含其他源文件、定義宏、根據(jù)條件決定編譯時是否包含某些代碼,要完成這些工作,就需要使用預處理程序。盡管在目前絕大多數(shù)編譯器都包含了預處理程序,但通常認為它們是獨立于編譯器的。預處理過程讀入源代碼,檢查包含預處理指令的語句和宏定義,并對源代碼進行預處理過程還會刪除程序中的注釋和多余的空白字符。下面
19、是部分預處理指令:用途空指令,無任何效果如果給定條件為真,則編譯下面代碼如果宏已經(jīng)定義,則編譯下面代碼如果宏沒有定義,則編譯下面代碼如果前面的#if給定條件不為真,且當前條件為真,則編譯下面代碼如果前面的#if給定條件不為真,則編譯#else下面的代碼結束一個#1#else條件編譯塊、預定義的宏名ANSI標準說明了五個預定義的宏名。它們是:_LINE_:當前語句所在的行號_FILE_:當前語句所在文件的文件名_DATE一該宏指令含有形式為月日年的串,表示源代碼翻譯到目標代碼的日期_TIME_:該宏指令含有形式為時:分:秒的串,表示源代碼翻譯到目標代碼的時間_STDC一如果實現(xiàn)是標準的,則1宏含
20、有十進制常量1,如果它含有任何其它數(shù),則表示實現(xiàn)是非標準的注:如果編譯不是標準的,則可能僅支持以上宏名中的幾個,或都不支持,但也許還提供其它預定義的宏名。三、#運算符#的功能是將其后面的宏參數(shù)進行字符串化操作(Stringfication),簡單說就是在對它所引用的宏變量通過替換后在其左右各加上一個雙引號,有時把這種用法的#稱為字符串化運算符。比如:#defineWARN_IF(EXP)if(EXP)fprintf(stderr,Warning:#EXP.n);那么語句WARN_IF(divider=0)將被替換為:if(divider=0)fprintf(stderr,Warning:div
21、ider=0.n);/*會打印出“Warning:divider=0.*/再比如:#definePASTE(n)adhfkj#nprintf(%sn,PASTE(15);/*宏定義中的#運算符告訴預處理程序,把源代碼中任何傳遞給該宏的參數(shù)轉換成一個字符串。所以輸出應該是adhfkj15。*/四、#運算符#被稱為連接符(concatenator),#運算符用于把參數(shù)連接到一起。預處理程序把出現(xiàn)在#兩側的參數(shù)合并成一個符號。先看一個簡單的例子:#defineNUM(a,b,c)a#b#c#defineSTR(a,b,c)a#b#c/*#前后可以加空格*/printf(%dn,NUM(1,2,3);
22、printf(%sn,STR(aa,bb,cc);最后程序的輸出為:123aabbcc響應的轉換,指令#if#ifdef#ifndef#elif#else#endif指令用途#include包含一個源代碼文件#define定義宏#undef取消已定義的宏再比如要做一個菜單項命令名和函數(shù)指針組成的結構體的數(shù)組,并且希望在函數(shù)名和菜單項命令名之間有直觀的、名字上的關系,那么下面的代碼就非常實用:structcommand(char*name;/*菜單項命令名*/void(*function)(void);/*命令名對應的函數(shù)指針*/);#defineCOMMAND(NAME)#NAME,NAME#
23、_commandstructcommandmy_commands=COMMAND(quit),/*相當于quit,quit_command*/COMMAND(help)/*相當于help,help_command*/;五、#error指令#error指令用于程序的調(diào)試,當編譯中遇到#error指令就停止編譯,并顯示相應的出錯信息。#error命令的基本形式為:#error出錯信息六、#line指令命令#line主要用于調(diào)試及其它特殊應用,#line改變_LINE_與_FILE_的內(nèi)容,它們是在編譯程序中預先定義的標識符。#line命令的基本形式為:#linenumberfilename其中的數(shù)
24、字為任何正整數(shù),可選的文件名為任意有效文件標識符,行號為源程序中當前行號,文件名為源文件的名字。例如,下面的行計數(shù)從100開始,printf()語句輸出為102,因為它是語句#line100后的第3行。#line100/*初始化行計數(shù)器*/main()/*行號100*/*行號101*/printf(%dn,_line_);/*行號102*/七、#pragma指令在所有的預處理指令中,#pragma指令可能是最復雜的了,它的作用是設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。#pragma指令對每個編譯器給出了一個方法,在保持與C和C+語言完全兼容的情況下,給出主機或操作系統(tǒng)專有的特征。依
25、據(jù)定義,編譯指示是機器或操作系統(tǒng)專有的,且對于每個編譯器都是不同的。其格式一般為:#pragmapara其中para為參數(shù),下面來看一些常用的參數(shù)。#pragmamessage(_X86macroactivated!”)當編譯器遇到這條指令時就在編譯輸出窗口中將消息文本打印出來,這對于源代碼信息的控制是非常重要的。當我們在程序中定義了許多宏來控制源代碼版本的時候,我們自己有可能都會忘記有沒有正確的設置這些宏,此時我們可以用這條指令在編譯的時候就進行檢查。#pragmacomment(lib,xxx.lib)導入lib。#pragmacode_seg(section-name,section-c
26、lass)它能夠設置程序中函數(shù)代碼存放的代碼段,當我們開發(fā)驅動程序的時候就會使用到它。#pragmaonce只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,這條指令實際上在VC6中就已經(jīng)有了,但是考慮到兼容性并沒有太多的使用它。#pragmahdrstop表示預編譯頭文件到此為止,后面的頭文件不進行預編譯。BCB可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能占太多磁盤空間,所以使用這個選項排除一些頭文件。#pragmastartup有時單元之間有依賴關系,比如單元A依賴單元B,所以單元B要先于單元A編譯??梢杂?pragmastartup指定編譯優(yōu)先級,如果使
27、用了#pragmapackage(smart_init),BCB就會根據(jù)優(yōu)先級的大小先后編譯。pragmaresource*.dfm表示把*.dfm文件中的資源加入工程。*.dfm中包括窗體外觀的定義。#pragmawarning(disable:450734;once:4385;error:164)#pragmawarning(disable:450734;once:4385;error:164)等價于:#pragmawarning(disable:450734)/不顯示4507和34號警告信息#pragmawarning(once:4385)/4385號警告信息僅報告一次#pragmawa
28、rning(error:164)/把164號警告信息作為一個錯誤。同時這個pragmawarning也支持如下格式:#pragmawarning(push,n)#pragmawarning(pop)這里n代表一個警告等級(1-4)。#pragmawarning(push):保存所有警告信息的現(xiàn)有的警告狀態(tài)。#pragmawarning(push,n):保存所有警告信息的現(xiàn)有的警告狀態(tài),并且把全局警告等級設定為n。#pragmawarning(pop):向棧中彈出最后一個警告信息,取消在入棧和出棧之間所作的一切改動。#pragmaargsused如果沒有在函數(shù)內(nèi)部使用某個參數(shù),編譯時會報告Parameternameisneverusedinfunctionfunc-name,使用#pragma
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人租房押付三合同
- 廣告設計制作合同協(xié)議書
- 客車駕駛員聘用協(xié)議書
- 分期付款設備買賣合同
- 物資倉庫裝修施工方案
- 下部結構施工方案
- 宿遷住宅防水施工方案
- 安徽省部分學校2024-2025學年高三下學期3月調(diào)研考試歷史試題(原卷版+解析版)
- 暖氣片施工方案
- 泡沫箱和紙箱加工生產(chǎn)線環(huán)評報告表
- 《飯店服務與管理》認識飯店的“神經(jīng)中樞”
- GB/T 15856.5-2023六角凸緣自鉆自攻螺釘
- 電子產(chǎn)品質量工程技術與管理高職PPT全套完整教學課件
- 【橡膠工藝】-橡膠履帶規(guī)格
- 小學勞動技術云教三年級下冊植物栽培種植小蔥(省一等獎)
- 2020年環(huán)境法律法規(guī)及其它要求清單
- 綜采工作面主要設備選型設計方案
- 籍貫對照表完整版
- GB/T 7251.3-2017低壓成套開關設備和控制設備第3部分:由一般人員操作的配電板(DBO)
- GB/T 22576.7-2021醫(yī)學實驗室質量和能力的要求第7部分:輸血醫(yī)學領域的要求
- 2023年江蘇省中學生生物奧林匹克競賽試題及答案
評論
0/150
提交評論