幻燈片-C語言程序設計視頻教程-徐紅波-第2章_第1頁
幻燈片-C語言程序設計視頻教程-徐紅波-第2章_第2頁
幻燈片-C語言程序設計視頻教程-徐紅波-第2章_第3頁
幻燈片-C語言程序設計視頻教程-徐紅波-第2章_第4頁
幻燈片-C語言程序設計視頻教程-徐紅波-第2章_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C程序設計(chn x sh j)講師(jingsh):徐紅波Email: x_h_b共二十一頁 第9章 預處理命令(mng lng) ANSI C標準規(guī)定可以在C源程序中加入一些“預處理命令”,以改進程序設計環(huán)境,提高編程效率。這些預處理命令是由ANSI C統(tǒng)一規(guī)定的,但是它不是C語言本身的組成部分,不能直接對它們進行編譯(因為編譯程序不能識別它們)。必須在對程序進行通常的編譯(包括詞法和語法分析、代碼生成、優(yōu)化等)之前,先對程序中這些特殊的命令進行“預處理”,即根據(jù)預處理命令對程序作相應的處理(例如,若程序中用#define命令定義了一個(y )符號常量A,則在預處理時將程序中所有的A都置

2、換為指定的字符串。若程序中用#include命令包含一個(y )文件“stdio.h”,則在預處理時將stdio.h文件中的實際內(nèi)容替代該命令)。共二十一頁經(jīng)過預處理后的程序不再包括預處理命令了,最后再由編譯程序對預處理后的源程序進行通常的編譯處理,得到可供執(zhí)行的目標代碼。現(xiàn)在使用的許多(xdu)C編譯系統(tǒng)都包括了預處理、編譯和連接部分,在進行編譯時一氣呵成。因此不少用戶誤認為預處理命令是C語言的一部分,甚至以為它們是C語句,這是不對的。必須正確區(qū)分預處理命令和C語句,區(qū)分預處理和編譯,才能正確使用預處理命令。共二十一頁C提供(tgng)的預處理功能主要有以下3種:1、宏定義2、文件包含3、條

3、件編譯分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)。共二十一頁9.1 宏定義(dngy)9.1.1 不帶參數(shù)的宏定義(dngy)用一個指定的標識符(即名字)來代表一個字符串,它的一般形式(xngsh)為#define 標識符 字符串例如:#define PI 3.1415926這種方法使用戶能以一個簡單的名字代替一個長的字符串,因此把這個標識符(名字)稱為“宏名”,在預編譯時將宏名替換成字符串的過程稱為“宏展開”。#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)宏名一般習慣用大寫字母表示,以便與變量名相區(qū)別,但這并非規(guī)定,也可用小寫字母。(2)使用宏名代替(dit)一個字符串,可以減少程序中重復書寫某些字符串的工作量。(3)宏定義是用宏名代替一個字符串,也就是作簡單的置換,不作正確性檢查。(4)宏定義不是C語句,不必在行末加分號。(5)#define命令

5、出現(xiàn)在程序中函數(shù)的外面,宏名的有效范圍為定義命令之后到本源文件結束。(6)可以用#undef命令終止宏定義的作用域。(7)在進行宏定義時,可以引用已定義的宏名,可以層層置換。例9.2在宏定義中引用已定義的宏名(8)對程序中用雙撇號括起來的字符串內(nèi)的字符,即使與宏名相同,也不進行置換。(9)宏定義是專門用于預處理命令的一個專用名詞,它與定義變量的含義不同,只作字符替換,不分配內(nèi)存空間。共二十一頁9.1.2 帶參數(shù)(cnsh)的宏定義帶參數(shù)的宏定義不是(b shi)進行簡單的字符串替換,還要進行參數(shù)替換。其定義的一般形式為#define 宏名(參數(shù)表) 字符串字符串中包含在括號中所指定的參數(shù)。例如

6、:#define S(a, b) a*barea=S(3, 2); 例9.3使用帶參數(shù)的宏共二十一頁說明(shumng):(1)對帶參數(shù)的宏的展開只是將語句中的宏名后面括號(kuho)內(nèi)的實參字符串代替#define命令行中的形參。(2)在宏定義時,在宏名與帶參數(shù)的括號之間不應加空格;否則,將空格以后的字符都作為替代字符串的一部分。共二十一頁帶參數(shù)(cnsh)的宏定義與函數(shù)是不同的,主要有:(1)函數(shù)調用時,先求出實參表達式的值,然后帶入形參。而使用帶參數(shù)的宏只是進行簡單的字符代替。(2)函數(shù)調用是在程序運行時處理的,為形參分配臨時的內(nèi)存單元。而宏展開則是在編譯前進行的,在展開時并不分配內(nèi)存單

7、元,不進行值得傳遞處理,也沒有“返回值”的概念。(3)對函數(shù)中的實參和形參都要定義類型,二者的類型要求一致,如不一致,應進行類型轉換。而宏不存在類型問題,宏名無類型,它的參數(shù)也無類型,只是一個符號代表,展開時代入指定的字符串即可。宏定義時,字符串可以是任何類型的數(shù)據(jù)(shj)。(4)調用函數(shù)只可得到一個返回值,而用宏可以設法得到幾個結果。例9.4通過宏展開得到若干個結果(5)使用宏次數(shù)多時,宏展開后源程序變長,因為每展開一次都使程序增長,而函數(shù)調用不會使源程序變長。(6)宏替換不占運行時間,只占編譯時間。而函數(shù)調用則占運行時間(分配單元、保留現(xiàn)場、值傳遞、返回)。例9.5用宏代表輸出格式共二十

8、一頁9.2 “文件包含(bohn)”處理所謂“文件(wnjin)包含”處理是指一個源文件(wnjin)可以將另外一個源文件(wnjin)的全部內(nèi)容包含進來,即將另外的文件(wnjin)包含到本文件(wnjin)之中。C語言提供了#include命令用來實現(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)一個#include命令只能指定一個被包含文件,如果要包含n個文件,要用n個#i

10、nclude命令。(2)如果文件1包含文件2,而在文件2中要用到文件3的內(nèi)容,則可在文件1中用兩個include命令分別包含文件2和文件3,而且(r qi)文件3應出現(xiàn)在文件2之前。(3)在一個被包含文件中又可以包含另一個被包含文件,即文件包含是可以嵌套的。(4)在#include命令中,文件名可以用雙撇號或尖括號括起來。(5)被包含文件與其所在的文件,在預編譯后已成為同一個文件。共二十一頁9.3 條件(tiojin)編譯一般情況下,源程序中所有行都參加編譯(biny)。但是有時希望程序中一部分內(nèi)容只在滿足一定條件時才進行編譯(biny),也就是對這一部分內(nèi)容指定編譯(biny)的條件,這就是

11、“條件編譯(biny)”。有時,希望在滿足某條件時對某一組語句進行編譯(biny),而當條件不滿足時則編譯(biny)另一組語句。共二十一頁條件編譯(biny)命令有以下幾種形式:(1)#ifdef 標識符程序段1#else程序段2#endif共二十一頁(2)#ifndef 標識符程序段1#else程序段2#endif共二十一頁(3)#if 表達式程序段1#else程序段2#endif例9.7輸入一行字母字符,根據(jù)需要(xyo)設置條件編譯,使之能將字母全改為大寫輸出,或全改為小寫字母輸出共二十一頁習題(xt)9.1 定義一個帶參數(shù)的宏,使兩個參數(shù)的值互換,并寫出程序,輸入兩個數(shù)作為使用宏時的

12、實參。輸出已交換(jiohun)或的兩個值。9.2 輸入兩個整數(shù),求它們相除的余數(shù)。用帶參數(shù)的宏來實現(xiàn),編程序。9.3 三角形的面積為area=sqrt(s(s-a)(s-b)(s-c)其中s=(a+b+c)/2。a、b、c為三角形的三邊。定義兩個帶參數(shù)的宏,一個用來求s,另一個宏用來求area。寫程序,在程序中用帶實參的宏名來求面積area。共二十一頁9.4 給年份year定義一個宏,以判別該年份是否閏年。提示:宏名可定為LEAP_YEAR,形參為y,即定義宏的形式為#define LEAP_YEAR(y) (讀者設計的字符串)在程序中用以下語句輸出結果: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 請設計輸出實數(shù)的格式,實數(shù)用“%6.2f”格式輸出。要求:(1)一行輸出1個實數(shù);(2)一行內(nèi)輸出2個實數(shù);(3)一行內(nèi)輸出3個實數(shù)。9.7 設計所需的各種的輸出格式(包括整數(shù)、實數(shù)、字符串等),用一個文件名“format.h”把這些(zhxi)信息都放到此文件內(nèi),另編一個程序文件,用#include “format.h”命令,以確保能使用這些(zhxi)格式。共二十一頁9.8 分別用函數(shù)和帶參數(shù)的宏,從3個數(shù)中找出最大數(shù)。9.10 用條件編譯(biny)方法實現(xiàn)以下功能:輸入一行電報文字,可以任選兩種輸出:一為原文輸出;一為將字母變成其下一字母,其他非字母字符不變。用#define命令來控制是否要譯成密碼。例如:#define CHANGE 1則輸出密碼。若#define CHANGE 0則不譯成密碼,按源碼輸出。共二十一頁內(nèi)容摘要C程序設計。Email: x_h_b。現(xiàn)在使用的許多C編譯系統(tǒng)都包括了預處理、編譯和連接部分,在進行編譯時一氣呵成。(2)使用宏名代替一個字符串,可以減

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論