国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

程序員之程序設(shè)計知識點九

企業(yè)動態(tài)
以下是程序員之程序設(shè)計知識點九。

9.1 宏定義

宏定義有無參數(shù)宏定義和帶參數(shù)宏定義兩種。

無參數(shù)的宏定義的一般形式為

# define 標識符 字符序列

其中# define之后的標識符稱為宏定義名(簡稱宏名),要求宏名與字符序列之間用空格符分隔。這種宏定義要求編譯預(yù)處理程序?qū)⒃闯绦蛑须S后所有的定名的出現(xiàn)(注釋與字符串常量中的除外)均用字符序列替換之。前面經(jīng)常使用的定義符號常量是宏定義的最簡單應(yīng)用。如有:

# define TRUE 1

# define FALSE 0

則在定義它們的源程序文件中,凡定義之后出現(xiàn)的單詞TRUE將用1替代之;出現(xiàn)單詞FALSE將用0替代之。

在宏定義的#之前可以有若干個空格、制表符,但不允許有其它字符。宏定義在源程序中單獨另起一行,換行符是宏定義的結(jié)束標志。如果一個宏定義太長,一行不夠時,可采用續(xù)行的方法。續(xù)行是在鍵人回車符之前先鍵入符號“\”。注意回車要緊接在符號“\”之后,中間不能插入其它符號。

宏定義的有效范圍稱為宏定義名的轄域,轄域從宏定義的定義結(jié)束處開始到其所在的源程序文件末尾。宏定義名的轄域不受分程序結(jié)構(gòu)的影響??梢杂妙A(yù)處理命令#undef終止宏定義名的轄域。

在新的宏定義中,可以使用前面已定義的宏名。例如,

# define R 2.5

# define PI 3.1415926

# define Circle 2*PI*R

# define Area PI* R * R

程序中的Circle被展開為2*3.1415926* 2.***rea被展開為3.1415926*2.5*2.5。

如有必要,宏名可被重復(fù)定義。被重復(fù)定義后,宏名原先的意義被新意義所代替。

通常,無參數(shù)的宏定義多用于定義常量。程序中統(tǒng)一用宏名表示常量值,便于程序前后統(tǒng)一,不易出錯,也便于修改,能提高程序的可讀性和可移植性。特別是給數(shù)組元素個數(shù)一個宏定義,并用宏名定義數(shù)組元素個數(shù)能部分彌補數(shù)組元素個數(shù)固定的不足。

注意:預(yù)處理程序在處理宏定義時,只作字符序列的替換工作,不作任何語法的檢查。如果宏定義不當,錯誤要到預(yù)處理之后的編譯階段才能發(fā)現(xiàn)。宏定義以換行結(jié)束,不需要分號等符號作分隔符。如有以下定定義:

# define PI 3.1415926;

原希望用PI求圓的周長的語句

c=2*PI*r;

經(jīng)宏展開后,變成

c=2*3.1415926*r;

這就不能達到希望的要求。

帶參數(shù)宏定義進一步擴充了無參數(shù)宏定義的能力,在字符序列替換同時還能進行參數(shù)替換。帶參數(shù)定定義的一般形式為

# define 標識符(參數(shù)表)字符序列

其中參數(shù)表中的參數(shù)之間用逗號分隔,字符序列中應(yīng)包含參數(shù)表中的參數(shù)。在定義帶參數(shù)的宏時,宏名標識符與左圓括號之間不允許有空白符,應(yīng)緊接在一起,否則變成了無參數(shù)的宏定義。如有宏定義:

# define MAX(A,B) ((A) > (B)?(A):(B))

則代碼 y= MAX( p+q, u+v)將被替換成 y=((p+q) >(u+v)?(p+q):(u+v)。

程序中的宏調(diào)用是這樣被替換展開的,分別用宏調(diào)用中的實在參數(shù)字符序列(如p+q和u+V) 替換宏定義字符序列中對應(yīng)所有出現(xiàn)的形式參數(shù)(如用p+q替代所有形式參數(shù)A,用u+V替代所有形式參數(shù)B),而宏定義字符序列中的不是形式參數(shù)的其它字符則保留。這樣形成的字符序列,即為宏調(diào)用的展開替換結(jié)果。宏調(diào)用提供的實在參數(shù)個數(shù)必須與宏定義中的形式參數(shù)個數(shù)相同。

注意:宏調(diào)用與函數(shù)調(diào)用的區(qū)別。函數(shù)調(diào)用在程序運行時實行,而宏展開是在編譯的預(yù)處理階段進行;函數(shù)調(diào)用占用程序運行時間,宏調(diào)用只占編譯時間;函數(shù)調(diào)用對實參有類型要求,而宏調(diào)用實在參數(shù)與宏定義形式參數(shù)之間沒有類型的概念,只有字符序列的對應(yīng)關(guān)系。函數(shù)調(diào)用可返回一個值,宏調(diào)用獲得希望的C代碼。另外,函數(shù)調(diào)用時,實參表達式分別獨立求值在前,執(zhí)行函數(shù)體在后。宏調(diào)用是實在參數(shù)字符序列替換形式參數(shù)。替換后,實在參數(shù)字符序列就與相鄰的字符自然連接,實在參數(shù)的獨立性就不一定依舊存在。如下面的宏定義:

# define SQR(x) x*x

希望實現(xiàn)表達式的平方計算。對于宏調(diào)用

P=SQR(y)

能得到希望的宏展開p= y*y。但對于宏調(diào)用q=SQR(u+v)得到的宏展開是q=u+V*u+V。顯然,后者的展開結(jié)果不是程序設(shè)計者所希望的。為能保持實在參數(shù)替換后的獨立性,應(yīng)在宏定義中給形式參數(shù)加上括號。進一步,為了保證宏調(diào)用的獨立性,作為算式的宏定義也應(yīng)加括

號。如 SQR宏定義改寫成:

# define SQR((x)*(x))

才是正確的宏定義。

對于簡短的表達式計算函數(shù),或為了提高程序的執(zhí)行效率、避免函數(shù)調(diào)用時的分配存儲單元、保留現(xiàn)場、參數(shù)值傳遞、釋放存儲單元等工作。可將函數(shù)定義改寫成宏定義。所以合理使用宏定義,可以使程序更簡潔。

9.2 文件包含

文件包含預(yù)處理命令(簡稱文件包含命令)實現(xiàn)將指定文件的內(nèi)容作為當前源程序的一部分。文件包含預(yù)處理命令的一般形式為

# include “文件名”。

# include<文件名>

文件包含命令為組裝大程序和程序文件復(fù)用提供了一種手段。在編寫程序時,習(xí)慣將公共的常量定義、數(shù)據(jù)類型定義和全局變量的外部說明構(gòu)成一個源文件。稱這類沒有執(zhí)行代碼的文件為頭文件,并以“.h”為文件名的后綴。其它程序文件凡要用到頭文件中定義或說明的程序?qū)ο髸r,就用文件包含命令使它成為自己的一部分。這樣編程的好處是各程序文件使用統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)和常量,能保證程序的一致性,也便于修改程序。頭文件如同標準零件一樣被其它程序文件使用,減少了重復(fù)定義的工作量。

9.3 條件編譯

條件編譯是指在編譯一個源程序文件時,其中部分代碼段能根據(jù)條件成立與否有選擇地被編譯。即編譯程序只編譯沒有條件或條件成立的代碼段,而不編譯不滿足條件的代碼段。

條件編譯為組裝與環(huán)境有關(guān)的大程序提供有力的支持,能提高程序的可移植性和可維護性。通常在研制程序系統(tǒng)時,設(shè)計者將所有與環(huán)境有關(guān)的內(nèi)容編寫成獨立的程序段,并將它們配上相應(yīng)的條件編譯命令。因環(huán)境不同等原因,只要設(shè)定相應(yīng)條件,就能組裝出適應(yīng)環(huán)境要求的新程序。

條件編譯命令主要有三種相似的形式。

(1) #if 表達式

程序段1

# else

程序段2

# endif

其中表達式為常量表達式,其意義是當指定的表達式值為非零時,程序段1參與編譯,程序段2不參與編譯;否則,反之。

這種形式的條件編譯命令使預(yù)處理程序能根據(jù)給定的條件確定哪個程序段參與編譯,哪個程序段不參與編譯。

在上述一般形式中,當程序段2不出現(xiàn)時,也可簡寫為

#if 表達式

程序段

# endif

條件編譯與if語句有重要區(qū)別:條件編譯是在預(yù)處理時判定的,不產(chǎn)生判定代碼,其中一個不滿足條件的程序段不參與編譯,不會產(chǎn)生代碼;且語句是在運行時判定的,且編譯產(chǎn)生判

定代碼和兩個分支程序段的代碼。因此,條件編譯可減少目標程序長度,能提高程序執(zhí)行速度。但條件編譯只能測試常值或常量表達式,而且語句能對表達式作動態(tài)測試。

條件編譯預(yù)處理命令也可呈嵌套結(jié)構(gòu)。特別是為了便于描述# else后的程序段又是條件編譯情況,引人須處理命令符# elif。它的意思就是# else #if。所以條件編譯須處理命令更一般的形式為

# if 表達式 1

程序段1

# elif 表達式 2

程序段2

# elif 表達式 n

程序段n

# else

程序段 n+l

# endif

(2) # ifdef 標識符

程序段1

# else

程序段2

# endif

其中標識符是一個宏名,上述意義是當宏名已被定義,則程序段里參與編譯,程序段2不參與編譯;否則,反之。這里的程序段可以是任何C代碼行,也可以包含預(yù)處理命令行。其中的標識符只要求已定義與否,與標識符被定義成什么是無關(guān)的。如標識符只用于這個目的,常用以下形式的宏定義來定義這類標識符:

# define 標識符

即標識符之后為空,直接以換行結(jié)束該宏定義命令。

在上述一般形式中,如果程序段2為空,則可簡寫成如下一般形式:

# ifdef 標識符

程序段

# endif

條件編譯主要作用是能提高程序的通用性,應(yīng)用于不同的計算機系統(tǒng)編譯不同的源程序段。條件編譯另一種應(yīng)用是在程序中插入調(diào)試狀態(tài)下輸出中間結(jié)果的代碼。如:

# ifdef DEBUG

printf(“a=%d, b=%d \n”, a, b);

# endif

程序在調(diào)試狀態(tài)下與包含宏定義命令

# define BEBUG

的頭文件一起編譯;在要獲得最終目標程序時,不與包含該宏定義命令的頭文件一起編譯。這樣,在調(diào)試通過后,不必再修改程序,已獲得了正確的最終程序。為了日后程序維護,將調(diào)試時使用的程序代碼留在源程序中是專業(yè)程序員習(xí)慣采用的方法。因為這些代碼的存在不影響最終目標碼,但有助于日后修改程序時的調(diào)試需要。

(3) # ifndef 標識符

程序段1

# else

程序段2

# endif

這種條件編譯形式與前面介紹的形式的唯一差異是***行的ifdef改為ifndef。其意義是當標識符末被定義時,程序段1參與編譯,程序段2不參與編譯;否則,反之。在上述形式中,當程序段2不出現(xiàn)時,可簡寫成:

# infdef 標識符

程序段

# endif

9.4 帶參數(shù)的主函數(shù)

在操作系統(tǒng)下執(zhí)行某個C程序,是環(huán)境對C程序的啟動,可以看作是對該程序的main()函數(shù)的調(diào)用。main()函數(shù)執(zhí)行結(jié)束后,控制返回環(huán)境。為能從環(huán)境向C程序傳遞信息,啟動C程序的命令行可帶有任選的參數(shù)。命令行的一般形式為

程序名 參數(shù)1 參數(shù)2……參數(shù)n

其中程序名和各參數(shù)之間用空白符分隔。

為能讓main()函數(shù)讀取命令行中的參數(shù),環(huán)境將多個參數(shù)以兩個參數(shù)形式傳遞給main()函數(shù)、其中***個參數(shù)(習(xí)慣記作argc) 表示命令行中參數(shù)的個數(shù)(包括程序名);第二個參數(shù)(習(xí)慣記作argv)是一個字符指針數(shù)組。其中argv[0] 指向程序名字符串的***個字符,argv[1]指向參數(shù)1字符串的***個字符,…,argv[argc-1] 指向***一個參數(shù)字符串的***個字符。如果利因山等于1,則表示程序名后面沒有參數(shù)。下面的例子用于說明main()函數(shù)對參數(shù)argc

與argv的引用方法。

【例9.l】 回打啟動程序時的命令行各參數(shù)。

# include

void main(int argc, char *argv[] /* 或char **argv; */)

{ int k;

for( k=l; k

printf(“%c”,argv[k],k printf(“\n\n”);

}

如上述程序的執(zhí)行程序名為echopro.exe,執(zhí)行該程序的命令行為:

echopro Hello world!

則程序?qū)⑤敵?/p>

Hello world!

在以上命令行中,根據(jù)約定,main()函數(shù)的參數(shù)argc的值為3;argv[0],argv[1],argv[2]分別指向字符串“echopro”、“Hello”、“world!”的***個字符。在程序的printf()函數(shù)調(diào)用中,字符輸出格式%c輸出一個字符,若是已輸出了命令行***一個參數(shù),該格式將輸出一個換行符,若是輸出其它參數(shù),則輸出一個空白符。

因函數(shù)的數(shù)組參數(shù)是指向數(shù)組首元素的指針變量,所以在主函數(shù)main()中可對argv施行增量運算。例如,在argv[0]指針指向程序名字符串的***個字符情況下,對argv施增量運算++argv后,argv[0](或*argv)就指向參數(shù)1的***個字符c利用argv的這一性質(zhì),可改寫上述程序為以下形式:

# include

void main(int argc,char **argv)

{ while(--argc>0)

printf(“%s%c”,*++argv,argc>1? '':'\n');

}

這里,++argv使指針argv先加1,讓它一開始就指向參數(shù)1;逐次增回,使它遍歷指向各參數(shù)。又利用函數(shù)printf()的***個格式參數(shù)是字符串表達式,上述程序?qū)rintf()的調(diào)用可改寫成:

printf((argc> l) ? “%s”:“%s\n”,* ++argv);

【例9.2】 假定啟動程序時給出的命令行參數(shù)是一串整數(shù),程序?qū)⑷空麛?shù)求和后輸出。

# include

# include

void main( int argc,char **argv)

{ int k,s;

for(s=0, k=l;)

s+=atoi(*++agv); /* 從數(shù)字字符串譯出整數(shù) */

printf( “\t%d\n”, s);

}

 

【編輯推薦】

  1. 程序員之程序設(shè)計知識點八
  2. 程序員之程序設(shè)計知識點七
  3. 程序員之程序設(shè)計知識點三(1)
  4. 更多軟考資料請點擊51CTO軟考專題
責任編輯:張攀 來源: 考試大
相關(guān)推薦

2010-12-27 10:08:22

程序員

2011-01-18 11:41:26

程序員

2011-01-11 11:37:03

程序員

2011-01-07 10:54:39

程序員

2011-01-14 11:03:32

程序員

2010-12-23 11:18:16

程序員

2010-12-24 10:23:50

程序員

2011-01-05 14:53:53

程序員

2010-12-30 10:18:54

程序員

2019-10-17 15:10:33

PHP程序員Linux

2021-05-05 11:32:36

MySQL數(shù)據(jù)庫索引

2014-10-30 10:09:44

程序員程序設(shè)計師

2019-07-15 12:40:02

Linux基礎(chǔ)知識程序員

2017-09-11 11:15:31

Android提升效率

2018-04-23 09:16:47

程序員知識體系

2012-03-06 09:22:46

程序員

2013-08-20 09:33:59

程序員

2014-04-16 11:39:52

2013-08-08 14:13:18

程序員

2009-07-15 09:29:24

Java程序員
點贊
收藏

51CTO技術(shù)棧公眾號

日本伊人色综合网| 国产精品久久二区二区| 欧美国产日韩一二三区| 在线观看日韩av| 91精品国产免费| 成人免费在线一区二区三区| a视频在线看| 美女一区二区三区视频| 亚洲精品一区av| 国产精品影视在线观看| 亚洲精品电影久久久| 久久综合福利| 欧美在线中文字幕| 三年中国国语在线播放免费| 一区二区日韩欧美| 中国精品18videos性欧美| 日韩中文在线中文网三级| 高清视频一区| 日韩国产激情| 婷婷久久一区| 99精品欧美一区二区三区小说 | 久久久亚洲福利精品午夜| 国产日韩第一页| 中文字幕在线观看第三页| 精品系列免费在线观看| 最新亚洲国产精品| 激情综合网俺也去| 二区三区不卡| 9191精品国产综合久久久久久| 成人激情av| 国产激情一区二区三区桃花岛亚洲| 91香蕉视频污在线| 久久只精品国产| 国产精品久久久999| 亚洲 中文字幕 日韩 无码| 色棕色天天综合网| 欧美吞精做爰啪啪高潮| 中文在线a√在线8| 西西人体一区二区| 欧美一区二区国产| 亚洲成人资源| 久久免费精品国产久精品久久久久| 天堂中文8资源在线8| 久久婷婷一区| 国外色69视频在线观看| 视频一区欧美| 精品国产乱码久久久久| 成人午夜影视| 国产精品亚洲一区二区三区妖精 | 幼a在线观看| 欧美亚洲丝袜传媒另类| 成人影音在线| 不卡区在线中文字幕| 成人乱色短篇合集| 久久国内精品| 欧美猛男超大videosgay| 一区二区三区视频网| 免费观看成人av| 国产精品h在线观看| 一本色道久久综合亚洲精品高清| 97久久久免费福利网址| av最新在线| 一本色道久久综合亚洲aⅴ蜜桃 | 黑人巨大精品欧美黑白配亚洲| 国产精品欧美激情在线观看 | 456国产精品| 欧美一级大片| 97香蕉超级碰碰久久免费的优势| 亚洲精品一区二区在线看| 亚洲欧美日韩在线综合 | 欧美亚洲自偷自偷| 99视频在线免费| 7777精品伊人久久久大香线蕉完整版 | 国产精品jizz在线观看麻豆| 丝袜美腿亚洲色图| 777.av| 99久久精品一区| 在线看片黄色| 日韩第一页在线| 成人一区二区不卡免费| 在线观看欧美日韩| 欧美在线亚洲综合一区| 国产精品啪视频| 日韩成人精品| 亚洲欧美国产精品va在线观看| 99riav在线| 精品欧美aⅴ在线网站| 午夜激情av在线| 日韩欧美黄色影院| www在线免费观看视频| 欧美日韩电影一区| 97超碰国产一区二区三区| 久久免费视频在线观看| 日本sm残虐另类| 四虎影视精品成人| 日韩欧美999| 日本高清中文字幕二区在线| 婷婷丁香激情综合| 午夜男人视频在线观看| 中文字幕国产日韩| 精品国产黄a∨片高清在线| 国产高清在线一区二区| 中文字幕欧美一| 一二三四中文在线| 亚洲综合在线视频| 欧美性猛交7777777| 色综合久久88色综合天天6| 欧洲亚洲视频| 成人精品视频在线| 国产精品国产精品国产专区不蜜 | 亚洲午夜精品国产| 国产综合一区二区| 久久视频免费在线| 欧美三级资源在线| 精精国产xxxx视频在线中文版 | 国产精品波多野结衣| 国产精品资源网| jizz日韩| 91在线免费看片| 国产精品美女| 亚洲精品第一区二区三区| 欧美在线观看一区| 综合国产在线| 精品视频二区| 精品国产伦一区二区三区观看体验| 欧美黑人疯狂性受xxxxx野外| 激情视频在线观看一区二区三区| 欧美性猛交xxxx黑人| 四虎成人av| 涩涩涩999| 久久亚洲春色中文字幕久久久| 亚洲黄色免费av| 欧美精品国产精品日韩精品| 国产精品午夜一区二区三区| 国产精品免费视频一区二区| 久久激情五月婷婷| 国产视频一视频二| 一区二区三区四区乱视频| 国产免费av高清在线| 精品裸体舞一区二区三区| 成人在线视频免费看| 日韩av色在线| 亚洲国产美女| 欧美成人xxxxx| 欧美性大战久久久久久久蜜臀 | 欧美一二三视频| 亚洲免费观看高清完整版在线观看| 日本亚洲欧美| 99在线观看视频| 成人一区二区三区| 美女被人操视频在线观看| 国产日韩在线视频| 国产一区二区三区美女| 日韩欧美一区二区三区在线观看| 国产精品6699| 国产毛片精品视频| 国产在线|日韩| 999日本视频| 欧美精品久久天天躁| 青青草97国产精品免费观看 | 波多野结衣作品集| 538在线一区二区精品国产| 日韩精品电影在线| av线上观看| 亚洲成人久久电影| 精品日韩免费| 日韩五码在线观看| 欧美色偷偷大香| 男女性色大片免费观看一区二区| 色8久久影院午夜场| 成人免费观看在线网址| 欧美一区二区久久| 成人亚洲精品久久久久软件| 台湾佬综合网| 狠狠精品干练久久久无码中文字幕| 亚洲图片自拍偷拍| 日韩国产91| 狠狠色噜噜狠狠色综合久| 国产性色av一区二区| 狠狠色丁香久久综合频道| 依人在线免费视频| 国产精品一级久久久| 一区二区三欧美| 偷拍与自拍一区| 精品亚洲国内自在自线福利| 欧美性生活一级片| 在线中文字幕电影| 国产欧美精品在线播放| 久久一区二区三区四区| 国产精品久久久久久麻豆一区软件 | 黄在线免费观看| 欧美国产第二页| 久久国产精品一区二区| 国产精品毛片一区二区三区四区| 在线观看成人av| 欧美一区二区久久久| 亚洲国产高清aⅴ视频| 老妇喷水一区二区三区| 欧美日韩中字| 看欧美ab黄色大片视频免费|