首頁考試吧論壇Exam8視線考試商城網(wǎng)絡(luò)課程模擬考試考友錄實用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓(xùn) 自學(xué)考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點日語
職稱英語
口譯筆譯
申碩英語
零起點韓語
商務(wù)英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點英語
托福考試
托業(yè)考試
零起點法語
雅思考試
成人英語三級
零起點德語
等級考試
華為認(rèn)證
水平考試
Java認(rèn)證
職稱計算機 微軟認(rèn)證 思科認(rèn)證 Oracle認(rèn)證 Linux認(rèn)證
公 務(wù) 員
導(dǎo)游考試
物 流 師
出版資格
單 證 員
報 關(guān) 員
外 銷 員
價格鑒證
網(wǎng)絡(luò)編輯
駕 駛 員
報檢員
法律顧問
管理咨詢
企業(yè)培訓(xùn)
社會工作者
銀行從業(yè)
教師資格
營養(yǎng)師
保險從業(yè)
普 通 話
證券從業(yè)
跟 單 員
秘書資格
電子商務(wù)
期貨考試
國際商務(wù)
心理咨詢
營 銷 師
司法考試
國際貨運代理人
人力資源管理師
廣告師職業(yè)水平
衛(wèi)生資格 執(zhí)業(yè)醫(yī)師 執(zhí)業(yè)藥師 執(zhí)業(yè)護士
會計從業(yè)資格
基金從業(yè)資格
統(tǒng)計從業(yè)資格
經(jīng)濟師
精算師
統(tǒng)計師
會計職稱
法律顧問
ACCA考試
注冊會計師
資產(chǎn)評估師
審計師考試
高級會計師
注冊稅務(wù)師
國際內(nèi)審師
理財規(guī)劃師
美國注冊會計師
一級建造師
安全工程師
設(shè)備監(jiān)理師
公路監(jiān)理師
公路造價師
二級建造師
招標(biāo)師考試
物業(yè)管理師
電氣工程師
建筑師考試
造價工程師
注冊測繪師
質(zhì)量工程師
巖土工程師
造價員考試
注冊計量師
環(huán)保工程師
化工工程師
咨詢工程師
結(jié)構(gòu)工程師
城市規(guī)劃師
材料員考試
監(jiān)理工程師
房地產(chǎn)估價
土地估價師
安全評價師
房地產(chǎn)經(jīng)紀(jì)人
投資項目管理師
環(huán)境影響評價師
土地登記代理人
繽紛校園 實用文檔 英語學(xué)習(xí) 作文大全 求職招聘 論文下載 訪談|游戲
軟件水平考試
軟件水平考試資訊
軟件水平考試試題
軟件水平考試專項輔導(dǎo)
軟件水平考試交流互動
軟件水平考試交流互動
您現(xiàn)在的位置: 考試吧 > 軟件水平考試 > 復(fù)習(xí)資料 > 程序員資料 > 正文

C語言初學(xué)者入門知識之預(yù)處理

  帶參宏定義的一般形式為: #define 宏名(形參表) 字符串 在字符串中含有各個形參。帶參宏調(diào)用的一般形式為: 宏名(實參表);

  例如:

  #define M(y) y*y+3*y /*宏定義*/

  :

  k=M(5); /*宏調(diào)用*/

  : 在宏調(diào)用時,用實參5去代替形參y, 經(jīng)預(yù)處理宏展開后的語句

  為: k=5*5+3*5

  #define MAX(a,b) (a>b)?a:b

  main(){

  int x,y,max;

  printf("input two numbers: ");

  scanf("%d%d",&x,&y);

  max=MAX(x,y);

  printf("max=%d\n",max);

  }

  上例程序的第一行進行帶參宏定義,用宏名MAX表示條件表達式(a>b)?a:b,形參a,b均出現(xiàn)在條件表達式中。程序第七行max=MAX(x,

  y)為宏調(diào)用,實參x,y,將代換形參a,b.宏展開后該語句為: max=(x>y)?x:y;用于計算x,y中的大數(shù)。對于帶參的宏定義有以下問題需要說明:

  1. 帶參宏定義中,宏名和形參表之間不能有空格出現(xiàn)。

  例如把: #define MAX(a,b) (a>b)?a:b寫為: #define MAX (a,b) (a>b)?a:b 將被認(rèn)為是無參宏定義,宏名MAX代表字符串 (a,b)(a>b)?a:b.

  宏展開時,宏調(diào)用語句: max=MAX(x,y);將變?yōu)椋?max=(a,b)(a>b)?a:b(x,y);這顯然是錯誤的。

  2. 在帶參宏定義中,形式參數(shù)不分配內(nèi)存單元,因此不必作類型定義。而宏調(diào)用中的實參有具體的值。要用它們?nèi)ゴ鷵Q形參,因此必須作類型說明。這是與函數(shù)中的情況不同的。在函數(shù)中,形參和實參是兩個不同的量,各有自己的作用域,調(diào)用時要把實參值賦予形參,進行“值傳遞”.而在帶參宏中,只是符號代換,不存在值傳遞的問題。

  3. 在宏定義中的形參是標(biāo)識符,而宏調(diào)用中的實參可以是表達式。

  #define SQ(y) (y)*(y)

  main(){

  int a,sq;

  printf("input a number: ");

  scanf("%d",&a);

  sq=SQ(a+1);

  printf("sq=%d\n",sq);

  }

  上例中第一行為宏定義,形參為y。程序第七行宏調(diào)用中實參為a+1,是一個表達式,在宏展開時,用a+1代換y,再用(y)*(y) 代換SQ,得到如下語句: sq=(a+1)*(a+1); 這與函數(shù)的調(diào)用是不同的, 函數(shù)調(diào)用時要把實參表達式的,值求出來再賦予形參。 而宏代換中對實參表達式不作計算直接地照原樣代換。

  4. 在宏定義中,字符串內(nèi)的形參通常要用括號括起來以避免出錯。 在上例中的宏定義中(y)*(y)表達式的y都用括號括起來,因此結(jié)果是正確的。如果去掉括號,把程序改為以下形式:

  #define SQ(y) y*y

  main(){

  int a,sq;

  printf("input a number: ");

  scanf("%d",&a);

  sq=SQ(a+1);

  printf("sq=%d\n",sq);

  }

  運行結(jié)果為:input a number:3

  sq=7 同樣輸入3,但結(jié)果卻是不一樣的。問題在哪里呢? 這是由于代換只作符號代換而不作其它處理而造成的。 宏代換后將得到以下語句: sq=a+1*a+1; 由于a為3故sq的值為7.這顯然與題意相違,因此參數(shù)兩邊的括號是不能少的。即使在參數(shù)兩邊加括號還是不夠的,請看下面程序:

  #define SQ(y) (y)*(y)

  main(){

  int a,sq;

  printf("input a number: ");

  scanf("%d",&a);

  sq=160/SQ(a+1);

  printf("sq=%d\n",sq);

  }

  本程序與前例相比,只把宏調(diào)用語句改為: sq=160/SQ(a+1); 運行本程序如輸入值仍為3時,希望結(jié)果為10.但實際運行的結(jié)果如下:input a number:3 sq=160為什么會得這樣的結(jié)果呢?分析宏調(diào)用語句,在宏代換之后變?yōu)椋?sq=160/(a+1)*(a+1);a為3時,由于“/”和“*”運算符優(yōu)先級和結(jié)合性相同, 則先作160/(3+1)得40,再作40*(3+1)最后得160.為了得到正確答案應(yīng)在宏定義中的整個字符串外加括號, 程序修改如下

  #define SQ(y) ((y)*(y))

  main(){

  int a,sq;

  printf("input a number: ");

  scanf("%d",&a);

  sq=160/SQ(a+1);

  printf("sq=%d\n",sq);

  }

  以上討論說明,對于宏定義不僅應(yīng)在參數(shù)兩側(cè)加括號, 也應(yīng)在整個字符串外加括號。

  5. 帶參的宏和帶參函數(shù)很相似,但有本質(zhì)上的不同,除上面已談到的各點外,把同一表達式用函數(shù)處理與用宏處理兩者的結(jié)果有可能是不同的。

  main(){

  int i=1;

  while(i<=5)

  printf("%d\n",SQ(i++));

  }

  SQ(int y)

  {

  return((y)*(y));

  }#define SQ(y) ((y)*(y))

  main(){

  int i=1;

  while(i<=5)

  printf("%d\n",SQ(i++));

  }

  在上例中函數(shù)名為SQ,形參為Y,函數(shù)體表達式為((y)*(y))。在例9.6中宏名為SQ,形參也為y,字符串表達式為(y)*(y))。 兩例是相同的。例9.6的函數(shù)調(diào)用為SQ(i++),例9.7的宏調(diào)用為SQ(i++),實參也是相同的。從輸出結(jié)果來看,卻大不相同。分析如下:在例9.6中,函數(shù)調(diào)用是把實參i值傳給形參y后自增1. 然后輸出函數(shù)值。因而要循環(huán)5次。輸出1~5的平方值。而在例9.7中宏調(diào)用時,只作代換。SQ(i++)被代換為((i++)*(i++))。在第一次循環(huán)時,由于i等于1,其計算過程為:表達式中前一個i初值為1,然后i自增1變?yōu)?,因此表達式中第2個i初值為2,兩相乘的結(jié)果也為2,然后i值再自增1,得3.在第二次循環(huán)時,i值已有初值為3,因此表達式中前一個i為3,后一個i為4, 乘積為12,然后i再自增1變?yōu)?。進入第三次循環(huán),由于i 值已為5,所以這將是最后一次循環(huán)。計算表達式的值為5*6等于30.i值再自增1變?yōu)?,不再滿足循環(huán)條件,停止循環(huán)。從以上分析可以看出函數(shù)調(diào)用和宏調(diào)用二者在形式上相似, 在本質(zhì)上是完全不同的。

  6. 宏定義也可用來定義多個語句,在宏調(diào)用時,把這些語句又代換到源程序內(nèi)。看下面的例子。

  #define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h;

  main(){

  int l=3,w=4,h=5,sa,sb,sc,vv;

  SSSV(sa,sb,sc,vv);

  printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);

  }

  程序第一行為宏定義,用宏名SSSV表示4個賦值語句,4 個形參分別為4個賦值符左部的變量。在宏調(diào)用時,把4 個語句展開并用實參代替形參。使計算結(jié)果送入實參之中。

上一頁  1 2 3 4 下一頁

  相關(guān)推薦:

  2012年軟考系統(tǒng)分析師考試60天完美復(fù)習(xí)計劃

  2012年軟件水平考試網(wǎng)絡(luò)工程師章節(jié)筆記講義匯總

  2012年上半年軟件水平考試成績查詢匯總

文章搜索
軟件水平考試欄目導(dǎo)航
版權(quán)聲明:如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系800@exam8.com,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。