




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C程序設(shè)計(jì)(chn x sh j)講師(jingsh):徐紅波Email: x_h_b共二十一頁 第9章 預(yù)處理命令(mng lng) ANSI C標(biāo)準(zhǔn)規(guī)定可以在C源程序中加入一些“預(yù)處理命令”,以改進(jìn)程序設(shè)計(jì)環(huán)境,提高編程效率。這些預(yù)處理命令是由ANSI C統(tǒng)一規(guī)定的,但是它不是C語言本身的組成部分,不能直接對它們進(jìn)行編譯(因?yàn)榫幾g程序不能識別它們)。必須在對程序進(jìn)行通常的編譯(包括詞法和語法分析、代碼生成、優(yōu)化等)之前,先對程序中這些特殊的命令進(jìn)行“預(yù)處理”,即根據(jù)預(yù)處理命令對程序作相應(yīng)的處理(例如,若程序中用#define命令定義了一個(gè)(y )符號常量A,則在預(yù)處理時(shí)將程序中所有的A都置
2、換為指定的字符串。若程序中用#include命令包含一個(gè)(y )文件“stdio.h”,則在預(yù)處理時(shí)將stdio.h文件中的實(shí)際內(nèi)容替代該命令)。共二十一頁經(jīng)過預(yù)處理后的程序不再包括預(yù)處理命令了,最后再由編譯程序?qū)︻A(yù)處理后的源程序進(jìn)行通常的編譯處理,得到可供執(zhí)行的目標(biāo)代碼?,F(xiàn)在使用的許多(xdu)C編譯系統(tǒng)都包括了預(yù)處理、編譯和連接部分,在進(jìn)行編譯時(shí)一氣呵成。因此不少用戶誤認(rèn)為預(yù)處理命令是C語言的一部分,甚至以為它們是C語句,這是不對的。必須正確區(qū)分預(yù)處理命令和C語句,區(qū)分預(yù)處理和編譯,才能正確使用預(yù)處理命令。共二十一頁C提供(tgng)的預(yù)處理功能主要有以下3種:1、宏定義2、文件包含3、條
3、件編譯分別用宏定義命令、文件包含命令、條件編譯命令來實(shí)現(xiàn)。共二十一頁9.1 宏定義(dngy)9.1.1 不帶參數(shù)的宏定義(dngy)用一個(gè)指定的標(biāo)識符(即名字)來代表一個(gè)字符串,它的一般形式(xngsh)為#define 標(biāo)識符 字符串例如:#define PI 3.1415926這種方法使用戶能以一個(gè)簡單的名字代替一個(gè)長的字符串,因此把這個(gè)標(biāo)識符(名字)稱為“宏名”,在預(yù)編譯時(shí)將宏名替換成字符串的過程稱為“宏展開”。#define是宏定義命令。共二十一頁例9.1使用不帶參數(shù)(cnsh)的宏定義#include #define PI 3.1415926void main()float l,
4、s, r, v;printf(“input radius:”);scanf(“%f”, &r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf(“l(fā)=%10.4fns=%10.4fnv=%10.4fn”, l, s, v);共二十一頁說明(shumng):(1)宏名一般習(xí)慣用大寫字母表示,以便與變量名相區(qū)別,但這并非規(guī)定,也可用小寫字母。(2)使用宏名代替(dit)一個(gè)字符串,可以減少程序中重復(fù)書寫某些字符串的工作量。(3)宏定義是用宏名代替一個(gè)字符串,也就是作簡單的置換,不作正確性檢查。(4)宏定義不是C語句,不必在行末加分號。(5)#define命令
5、出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結(jié)束。(6)可以用#undef命令終止宏定義的作用域。(7)在進(jìn)行宏定義時(shí),可以引用已定義的宏名,可以層層置換。例9.2在宏定義中引用已定義的宏名(8)對程序中用雙撇號括起來的字符串內(nèi)的字符,即使與宏名相同,也不進(jìn)行置換。(9)宏定義是專門用于預(yù)處理命令的一個(gè)專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。共二十一頁9.1.2 帶參數(shù)(cnsh)的宏定義帶參數(shù)的宏定義不是(b shi)進(jìn)行簡單的字符串替換,還要進(jìn)行參數(shù)替換。其定義的一般形式為#define 宏名(參數(shù)表) 字符串字符串中包含在括號中所指定的參數(shù)。例如
6、:#define S(a, b) a*barea=S(3, 2); 例9.3使用帶參數(shù)的宏共二十一頁說明(shumng):(1)對帶參數(shù)的宏的展開只是將語句中的宏名后面括號(kuho)內(nèi)的實(shí)參字符串代替#define命令行中的形參。(2)在宏定義時(shí),在宏名與帶參數(shù)的括號之間不應(yīng)加空格;否則,將空格以后的字符都作為替代字符串的一部分。共二十一頁帶參數(shù)(cnsh)的宏定義與函數(shù)是不同的,主要有:(1)函數(shù)調(diào)用時(shí),先求出實(shí)參表達(dá)式的值,然后帶入形參。而使用帶參數(shù)的宏只是進(jìn)行簡單的字符代替。(2)函數(shù)調(diào)用是在程序運(yùn)行時(shí)處理的,為形參分配臨時(shí)的內(nèi)存單元。而宏展開則是在編譯前進(jìn)行的,在展開時(shí)并不分配內(nèi)存單
7、元,不進(jìn)行值得傳遞處理,也沒有“返回值”的概念。(3)對函數(shù)中的實(shí)參和形參都要定義類型,二者的類型要求一致,如不一致,應(yīng)進(jìn)行類型轉(zhuǎn)換。而宏不存在類型問題,宏名無類型,它的參數(shù)也無類型,只是一個(gè)符號代表,展開時(shí)代入指定的字符串即可。宏定義時(shí),字符串可以是任何類型的數(shù)據(jù)(shj)。(4)調(diào)用函數(shù)只可得到一個(gè)返回值,而用宏可以設(shè)法得到幾個(gè)結(jié)果。例9.4通過宏展開得到若干個(gè)結(jié)果(5)使用宏次數(shù)多時(shí),宏展開后源程序變長,因?yàn)槊空归_一次都使程序增長,而函數(shù)調(diào)用不會使源程序變長。(6)宏替換不占運(yùn)行時(shí)間,只占編譯時(shí)間。而函數(shù)調(diào)用則占運(yùn)行時(shí)間(分配單元、保留現(xiàn)場、值傳遞、返回)。例9.5用宏代表輸出格式共二十
8、一頁9.2 “文件包含(bohn)”處理所謂“文件(wnjin)包含”處理是指一個(gè)源文件(wnjin)可以將另外一個(gè)源文件(wnjin)的全部內(nèi)容包含進(jìn)來,即將另外的文件(wnjin)包含到本文件(wnjin)之中。C語言提供了#include命令用來實(shí)現(xiàn)“文件(wnjin)包含”的操作。其一般形式為:#include “文件名”或#include 共二十一頁例9.6將例9.5的格式(g shi)宏做成頭文件,把它包含在用戶程序中(1)將格式(g shi)宏做成頭文件format.h#define PR printf#define NL “n”#define D “%d”#define D1
9、D NL#define D2 D D D NL#define D3 D D D NL#define D4 D D D D NL#define S “%s”(2)主文件file1.c#include #include “format.h”void main()int a, b, c, d;char string=“CHINA”;a=1;b=2;c=3;d=4;PR(D1,a);PR(D2,a,b);PR(D3,a,b,c);PR(D4,a,b,c,d);PR(S,string);共二十一頁說明(shumng):(1)一個(gè)#include命令只能指定一個(gè)被包含文件,如果要包含n個(gè)文件,要用n個(gè)#i
10、nclude命令。(2)如果文件1包含文件2,而在文件2中要用到文件3的內(nèi)容,則可在文件1中用兩個(gè)include命令分別包含文件2和文件3,而且(r qi)文件3應(yīng)出現(xiàn)在文件2之前。(3)在一個(gè)被包含文件中又可以包含另一個(gè)被包含文件,即文件包含是可以嵌套的。(4)在#include命令中,文件名可以用雙撇號或尖括號括起來。(5)被包含文件與其所在的文件,在預(yù)編譯后已成為同一個(gè)文件。共二十一頁9.3 條件(tiojin)編譯一般情況下,源程序中所有行都參加編譯(biny)。但是有時(shí)希望程序中一部分內(nèi)容只在滿足一定條件時(shí)才進(jìn)行編譯(biny),也就是對這一部分內(nèi)容指定編譯(biny)的條件,這就是
11、“條件編譯(biny)”。有時(shí),希望在滿足某條件時(shí)對某一組語句進(jìn)行編譯(biny),而當(dāng)條件不滿足時(shí)則編譯(biny)另一組語句。共二十一頁條件編譯(biny)命令有以下幾種形式:(1)#ifdef 標(biāo)識符程序段1#else程序段2#endif共二十一頁(2)#ifndef 標(biāo)識符程序段1#else程序段2#endif共二十一頁(3)#if 表達(dá)式程序段1#else程序段2#endif例9.7輸入一行字母字符,根據(jù)需要(xyo)設(shè)置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出共二十一頁習(xí)題(xt)9.1 定義一個(gè)帶參數(shù)的宏,使兩個(gè)參數(shù)的值互換,并寫出程序,輸入兩個(gè)數(shù)作為使用宏時(shí)的
12、實(shí)參。輸出已交換(jiohun)或的兩個(gè)值。9.2 輸入兩個(gè)整數(shù),求它們相除的余數(shù)。用帶參數(shù)的宏來實(shí)現(xiàn),編程序。9.3 三角形的面積為area=sqrt(s(s-a)(s-b)(s-c)其中s=(a+b+c)/2。a、b、c為三角形的三邊。定義兩個(gè)帶參數(shù)的宏,一個(gè)用來求s,另一個(gè)宏用來求area。寫程序,在程序中用帶實(shí)參的宏名來求面積area。共二十一頁9.4 給年份year定義一個(gè)宏,以判別該年份是否閏年。提示:宏名可定為LEAP_YEAR,形參為y,即定義宏的形式為#define LEAP_YEAR(y) (讀者設(shè)計(jì)的字符串)在程序中用以下語句輸出結(jié)果:if (LEAP_YEAR(year
13、) printf(“%d is a leap year.n”, year); else printf(“%d is not a leap year.n”, year);9.6 請?jiān)O(shè)計(jì)輸出實(shí)數(shù)的格式,實(shí)數(shù)用“%6.2f”格式輸出。要求:(1)一行輸出1個(gè)實(shí)數(shù);(2)一行內(nèi)輸出2個(gè)實(shí)數(shù);(3)一行內(nèi)輸出3個(gè)實(shí)數(shù)。9.7 設(shè)計(jì)所需的各種的輸出格式(包括整數(shù)、實(shí)數(shù)、字符串等),用一個(gè)文件名“format.h”把這些(zhxi)信息都放到此文件內(nèi),另編一個(gè)程序文件,用#include “format.h”命令,以確保能使用這些(zhxi)格式。共二十一頁9.8 分別用函數(shù)和帶參數(shù)的宏,從3個(gè)數(shù)中找出最大數(shù)。9.10 用條件編譯(biny)方法實(shí)現(xiàn)以下功能:輸入一行電報(bào)文字,可以任選兩種輸出:一為原文輸出;一為將字母變成其下一字母,其他非字母字符不變。用#define命令來控制是否要譯成密碼。例如:#define CHANGE 1則輸出密碼。若#define CHANGE 0則不譯成密碼,按源碼輸出。共二十一頁內(nèi)容摘要C程序設(shè)計(jì)。Email: x_h_b?,F(xiàn)在使用的許多C編譯系統(tǒng)都包括了預(yù)處理、編譯和連接部分,在進(jìn)行編譯時(shí)一氣呵成。(2)使用宏名代替一個(gè)字符串,可以減
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025部門級安全培訓(xùn)考試試題標(biāo)準(zhǔn)卷
- 2024-2025車間安全培訓(xùn)考試試題及參考答案(模擬題)
- 2024-2025安全培訓(xùn)考試試題【綜合卷】
- 【部編版】四年級語文下冊習(xí)作《故事新編》精美課件
- 2025鋼筋班組承包合同
- 2025農(nóng)產(chǎn)品采購合同樣本協(xié)議
- 2025上海賽寶網(wǎng)絡(luò)科技發(fā)展有限公司合同代理協(xié)議匯編
- 2025《設(shè)備購銷合同模板》
- 2025年合成材料抗氧化劑項(xiàng)目建議書
- 2025二手房屋買賣合同官方版空白
- DB3301∕T 0451-2024 醫(yī)學(xué)美容機(jī)構(gòu)電子病歷系統(tǒng)技術(shù)規(guī)范
- 《大國浮沉500年:經(jīng)濟(jì)和地理背后的世界史》記錄
- 水工維護(hù)初級工技能鑒定理論考試題庫(含答案)
- 運(yùn)維項(xiàng)目進(jìn)度計(jì)劃
- 商場中央空調(diào)租賃協(xié)議模板
- 十八項(xiàng)核心制度
- 浙江省杭州市2023-2024學(xué)年六年級下學(xué)期期中模擬測試數(shù)學(xué)試卷(人教版)
- 國家開放大學(xué)《Python語言基礎(chǔ)》實(shí)驗(yàn)4:條件分支結(jié)構(gòu)基本應(yīng)用參考答案
- OTA代運(yùn)營協(xié)議文檔
- 內(nèi)分泌科常見急危重癥搶救流程
- 污染源權(quán)重分析報(bào)告
評論
0/150
提交評論