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

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

二級C輔導教程及考點分析:第九章 預處理

    7. 可用宏定義表示數據類型,使書寫方便。例如: #define STU struct stu在程序中可用STU作變量說明: STU body[5],*p;#define INTEGER int 在程序中即可用INTEGER作整型變量說明: INTEGER a,b; 應注意用宏定義表示數據類型和用typedef定義數據說明符的區別。宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換, 而是對類型說明符重新命名。被命名的標識符具有類型定義說明的功能。請看下面的例子: #define PIN1 int* typedef (int*) PIN2;從形式上看這兩者相似, 但在實際使用中卻不相同。下面用PIN1,PIN2說明變量時就可以看出它們的區別: PIN1 a,b;在宏代換后變成 int *a,b;表示a是指向整型的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因為PIN2是一個類型說明符。由這個例子可見,宏定義雖然也可表示數據類型, 但畢竟是作字符
    代換。在使用時要分外小心,以避出錯。

    8. 對“輸出格式”作宏定義,可以減少書寫麻煩。例9.3 中就采用了這種方法。
    #define P printf
    #define D "%d\n"
    #define F "%f\n"
    main(){
    int a=5, c=8, e=11;
    float b=3.8, d=9.7, f=21.08;
    P(D F,a,b);
    P(D F,c,d);
    P(D F,e,f);
    }

    帶參宏定義

    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);
    }
    以上討論說明,對于宏定義不僅應在參數兩側加括號, 也應在整個字符串外加括號。

希望與更多計算機等級考試的網友交流,請進入計算機等級考試論壇

更多信息請訪問:考試吧計算機等級考試欄目

上一頁  1 2 3 4 5 下一頁
文章搜索
版權聲明:如果計算機等級考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。
主站蜘蛛池模板: 日本最新在线 | 男女视频网站在线观看 | 美国俄罗斯毛片一区二区 | 三级黄日本 | 秋霞在线高清观看伦理片 | 中国黄色网页 | 成人激情小视频 | 国产一区二区三区免费 | 日韩有码第一页 | 一级特级欧美午夜片免费观看 | 欧美黄色一级片免费看 | 欧美日韩亚洲二区在线 | 欧美人成一本免费观看视频 | 日韩污视频| 999yy成年在线视频免费看 | 91精品国产品国语在线不卡 | 国产精品资源在线播放 | 日本69xxx18hd| 欧美一区二区三区在线 | 欧美69色 | 欧美精品日韩一区二区三区 | 午夜影院0606免费 | 在线观看你懂得 | 久久青草免费免费91线频观看 | 久爱免费观看在线精品 | 黄片a级毛片| 欧美精品国产第一区二区 | 最近的中文字幕免费视频1 最近的中文字幕大全免费版 | 日本黄色www | 天天躁夜夜躁狠狠躁躁 | 五月婷婷视频在线观看 | 成人午夜毛片在线看 | 被男人吃奶很爽的毛片两男一女 | 国产人成 | 国产一二三区视频 | 韩国伦理在线免费观看 | www伊人网 | 麻豆轻量版 | 亚洲午夜影视 | 东京加勒比中文字幕波多野结衣 | 亚洲天堂首页 |