黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

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

C語言初學者入門知識之預處理

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

  例如:

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

  :

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

  : 在宏調用時,用實參5去代替形參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均出現在條件表達式中。程序第七行max=MAX(x,

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

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

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

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

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

  3. 在宏定義中的形參是標識符,而宏調用中的實參可以是表達式。

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

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

  #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);

  }

  運行結果為:input a number:3

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

  #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);

  }

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

  #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);

  }

  以上討論說明,對于宏定義不僅應在參數兩側加括號, 也應在整個字符串外加括號。

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

  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++));

  }

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

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

  #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個賦值符左部的變量。在宏調用時,把4 個語句展開并用實參代替形參。使計算結果送入實參之中。

上一頁  1 2 3 4 下一頁

  相關推薦:

  2012年軟考系統分析師考試60天完美復習計劃

  2012年軟件水平考試網絡工程師章節筆記講義匯總

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

文章搜索
軟件水平考試欄目導航
版權聲明:如果軟件水平考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本軟件水平考試網內容,請注明出處。
主站蜘蛛池模板: 国语性猛交xxxx乱大交 | 日韩视频第1页 | 久久人人爽人人爽人人小说 | 777毛片| 日韩视频在线观看视频 | 国产特黄特色一级特色大片 | 最近中文字幕视频 | 在线观看免费毛片 | 精品国产v无码大片在线观看 | 亚洲第一成网站 | 中国嫩模一级毛片 | 又黄又爽视频在线观看 | 99热日韩| 欧美日韩国产手机在线观看视频 | 性欧洲精品videos' | 天天射天天搞 | 日韩精品亚洲精品485页 | 国产欧美日韩精品专区 | 精品一区二区三区高清免费观看 | 欧美8888 | 国产精品三级一区二区 | 日韩一级免费视频 | www.怡红院| 又爽又黄又无遮挡的视频在线观看 | 最新在线鲁丝片eeuss第1页 | 色综合97天天综合网 | 亚洲xxxx动漫 | 久久久久久88色偷偷 | 狠狠色狠狠色综合日日小蛇 | 午夜日本 | 女厕所vedioxxxx | 欧美日日夜夜 | 午夜视频在线观看完整高清在线 | 欧美一区二区在线 | 视频二区国产 | 色视频免费观看 | 天天摸天天揉天天碰天天弄 | 免费高清特级毛片 | 怡红院免费全部视频在线视频 | 看日本黄色录像 | 最近2019免费中文字幕8 |