C華南農(nóng)業(yè)大學(xué)c語言實用_第1頁
C華南農(nóng)業(yè)大學(xué)c語言實用_第2頁
C華南農(nóng)業(yè)大學(xué)c語言實用_第3頁
C華南農(nóng)業(yè)大學(xué)c語言實用_第4頁
C華南農(nóng)業(yè)大學(xué)c語言實用_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學(xué)1C華南農(nóng)業(yè)大學(xué)c語言實用8.1宏定義8.1.1無參數(shù)宏定義無參數(shù)宏定義的一般形式:#define標(biāo)識符字符串(常量或代碼串)例:#definePI3.1415926作用:用PI來代表“3.1415926”。以一個簡單的名字代替長的符號串。稱這個標(biāo)識符為“宏名”,在編譯時將宏名替換成字符串的過程稱為“宏展開”。

#define是宏定義命令。第1頁/共16頁例:從鍵盤輸入字符(個數(shù)不多于100),欲統(tǒng)計輸入字符中英文字母的個數(shù)。注:輸入字符‘#’時,或輸入字符個數(shù)多于100時,輸入結(jié)束。#include"stdio.h"#defineMAX

100main(){intn,count=0;charch;for(n=0;n<MAX;n++){ch=getchar();if(ch==’#’)break;if(ch>=’a’&&ch<=’z’||ch>=’A’&&ch<=’Z’)count++;}printf("Thenumberofletters:%d\n",count);}第2頁/共16頁無參宏定義說明:為了使宏名和變量名相區(qū)別。通常宏名用大寫字母表示。符號常量不僅可以定義常數(shù),也可以定義字符、字符串、說明符號。如:#defineENDSTRING‘\0’如果程序中用雙引號括住的字符串內(nèi)包含與符號常量有相同的名字,預(yù)編譯時并不進行宏替換。如:#defineBOOK“TheRedandTheBlack”main(){printf("%\ns",BOOK);}

運行結(jié)果:

TheRedandTheBlack如果將程序改為:#defineBOOK“TheRedandTheBlack”main(){printf("%\ns",“BOOK”);}

運行結(jié)果:

BOOK第3頁/共16頁無參宏定義說明(續(xù)):宏定義語句的末尾不必加分號。

例如:#defineMAXIMUM20;錯誤

……if(max==MAXIMUM)break;

經(jīng)過宏展開后,其中的if語句變?yōu)椋?/p>

if(max==20;)break;

顯然,上述if語句存在語法錯誤。在字符串中若出現(xiàn)運算符,通常需在合適的位置加括號。例如:#defineS(3+4)可以用#undef命令取消宏定義。一般形式:#undef標(biāo)識符第4頁/共16頁8.1.2帶參宏定義帶參宏定義的一般形式:#define標(biāo)識符(形參表)字符串其中,形參表是由一個或多個形參組成。帶參宏調(diào)用的一般形式:宏名(實參表);第5頁/共16頁例:編寫一個程序,求3個數(shù)中的最大數(shù),要求用帶參數(shù)的宏實現(xiàn)。

#include<stdio.h>#defineMAX1(a,b)((a)>(b)?(a):(b))#defineMAX2(a,b,c)(MAX1(a,b)>(c)?MAX1(a,b):(c))main(){inta=23;printf("MAX=%d\n",MAX2(13+5,4,a));}第6頁/共16頁帶參數(shù)的宏與函數(shù)有本質(zhì)上的區(qū)別:函數(shù)在定義和調(diào)用中所使用的形參和實參都受數(shù)據(jù)類型的限制,而帶參數(shù)宏的形參和實參可以是任意數(shù)據(jù)類型。函數(shù)有一定的數(shù)據(jù)類型,且數(shù)據(jù)類型是不變的。而帶參數(shù)的宏一般是一個運算表達式,它沒有固定的數(shù)據(jù)類型。函數(shù)調(diào)用時,先計算實參表達式的值,然后帶入形參。而宏定義展開時,只是替換。函數(shù)調(diào)用是在程序運行時處理的,將分配臨時的存儲單元。而宏擴展是在編譯時進行的,展開時即不分配內(nèi)存單元,不傳遞值,也沒有“返回值”的概念。使用宏次數(shù)多時,宏展開后源程序增長,而函數(shù)調(diào)用不使源程序變長。第7頁/共16頁使用帶參數(shù)的宏,應(yīng)注意:

1.對于宏定義的形參要根據(jù)需要加上圓括號,以免發(fā)生運算錯誤。

#defineMULTI(x)((x)*(x))……a=15;b=3;p=MULTI(a+b)*10;

經(jīng)過預(yù)編譯,該賦值語句變?yōu)椋?/p>

p=((a+b)*(a+b))*10;

如果定義中沒有使用相應(yīng)的括號,定義為:

#defineMULTI(x)(x*x)

預(yù)編譯后的賦值語句變?yōu)椋?/p>

p=a+b*a+b*10;

顯然與原題意不符。

2.宏名與括號之間不能有空格。

#defineS(r)

PI*r*r錯第8頁/共16頁8.2文件包含文件包含也是一種預(yù)處理語句,它的作用是使一個源程序文件將另一個源程序文件的全部包含進來。一般形式為:#include<文件名>或#include“文件名”第9頁/共16頁“文件包含”示意圖file1.cfile2.cfile1.c

包含#include”file2.c”B

ABA(a)(b)(c)第10頁/共16頁8.3條件編譯8.3.1條件編譯命令的形式常用的有三種形式:形式一:

#ifdef宏名程序段1;

#else

程序段2;

#endif

或者:#ifdef宏名程序段;#endif第11頁/共16頁8.3.1條件編譯命令的形式(續(xù))

形式二:

#ifndef宏名程序段1;

#else

程序段2;

#endif其中,#ifndef語句的功能與#ifdef相反,如果宏名未定義則編譯程序段1,否則編譯程序2。

或者:#ifndef宏名程序段;#endif第12頁/共16頁8.3.1條件編譯命令的形式(續(xù))

形式三:

#if常數(shù)表達式程序段1;

#else

程序段2;

#endif

功能:首先計算“常數(shù)表達式”的值,如果為真(非零),就編譯“程序段1”,否則編譯“程序段2”。如果沒有#else部分,則當(dāng)“常數(shù)表達式”的值為0時,直接跳過#endif?;蛘撸?if常數(shù)表達式程序段;#endif第13頁/共16頁例:閱讀程序。#include<stdio.h>main(){#ifNULLprintf("NULLisnon-zerovalue!\n");#elseprintf("NULLiszeroval

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論