第9章預(yù)編譯及第12章位運(yùn)算--C語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng)第三版)_第1頁(yè)
第9章預(yù)編譯及第12章位運(yùn)算--C語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng)第三版)_第2頁(yè)
第9章預(yù)編譯及第12章位運(yùn)算--C語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng)第三版)_第3頁(yè)
第9章預(yù)編譯及第12章位運(yùn)算--C語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng)第三版)_第4頁(yè)
第9章預(yù)編譯及第12章位運(yùn)算--C語(yǔ)言程序設(shè)計(jì)(譚浩強(qiáng)第三版)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 v第第9 9章章 編譯預(yù)處理編譯預(yù)處理v第第1212章章 位運(yùn)算位運(yùn)算v第第1414章章 調(diào)試中的錯(cuò)誤調(diào)試中的錯(cuò)誤v附錄附錄 其他內(nèi)容:第9章 編譯預(yù)處理作用:作用:對(duì)源程序編譯之前,對(duì)對(duì)源程序編譯之前,對(duì)#開(kāi)頭的命令做一些預(yù)處理開(kāi)頭的命令做一些預(yù)處理種類(lèi):種類(lèi): 宏定義宏定義 #define 文件包含文件包含 #include 條件編譯條件編譯 #if-#else-#endif等等格式:格式: “#”開(kāi)頭開(kāi)頭 占單獨(dú)書(shū)寫(xiě)行占單獨(dú)書(shū)寫(xiě)行 語(yǔ)句尾不加分號(hào)語(yǔ)句尾不加分號(hào)如 if(x=YES) printf(“correct!n”); else if (x=NO) printf(“error!n”

2、);展開(kāi)后: if(x=1) printf(“correct!n”); else if (x=0) printf(“error!n”);9.1 宏定義宏定義不帶參數(shù)宏定義不帶參數(shù)宏定義一般形式:一般形式: #define 宏名宏名 宏體宏體功能功能:用指定標(biāo)識(shí)符用指定標(biāo)識(shí)符(宏名宏名)代替字符序列代替字符序列(宏體宏體)宏名中不允許有空格,而且必須遵循宏名中不允許有空格,而且必須遵循C變量命名規(guī)則。宏名變量命名規(guī)則。宏名一般用一般用大寫(xiě)字母大寫(xiě)字母。宏展開(kāi):預(yù)編譯時(shí)宏展開(kāi):預(yù)編譯時(shí),用宏體替換宏名用宏體替換宏名-不作語(yǔ)法檢查不作語(yǔ)法檢查如 #define YES 1 #define NO 0

3、#define PI 3.1415926 #define OUT printf(“Hello,World”);定義位置定義位置:一般在程序開(kāi)頭一般在程序開(kāi)頭作用域作用域:從定義命令到文件結(jié)束從定義命令到文件結(jié)束#undef可終止宏名作用域可終止宏名作用域 格式:格式: #undef 宏名宏名例 #define YES 1 main() . #undef YES #define YES 0 max() . YES原作用域YES新作用域新作用域宏定義可嵌套,不能遞歸宏定義可嵌套,不能遞歸例 #define MAX MAX+10 ( )引號(hào)中的內(nèi)容與宏名相同不需置換引號(hào)中的內(nèi)容與宏名相同不需置換例

4、#define PI 3.14159 printf(“2*PI=%fn”,PI*2);宏展開(kāi):printf(“2*PI=%fn”,3.14159*2);宏定義中使用必要的括號(hào)宏定義中使用必要的括號(hào)()()例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展開(kāi):var= 80+40 *2;( )( )例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展開(kāi):var= 80+40 *2;帶參數(shù)宏定義帶參數(shù)宏定義一般形式:一般形式: #define 宏名宏名(參數(shù)表參數(shù)表)

5、宏體宏體宏展開(kāi):形參用實(shí)參置換,其它字符保留宏展開(kāi):形參用實(shí)參置換,其它字符保留宏體及各形參外一般應(yīng)加括號(hào)宏體及各形參外一般應(yīng)加括號(hào)()()例例 #define S(a,b) a*b . area=S(3,2);宏展開(kāi)宏展開(kāi): area=3*2;例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展開(kāi):z=x+y*x+y;一般寫(xiě)成:一般寫(xiě)成: #define POWER(x) (x)*(x)宏展開(kāi):宏展開(kāi): z=(x+y)*(x+y);#define MAX(x,y) (x)(y)?(x):(y) .main() int a,b,c,d,t; . t=

6、MAX(a+b,c+d); 宏展開(kāi):t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);main() int a,b,c,d,t; . t=max(a+b,c+d); 用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能用宏定義和函數(shù)實(shí)現(xiàn)同樣的功能思考:比較宏定義和函數(shù)思考:比較宏定義和函數(shù)帶參的宏與函數(shù)區(qū)別帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理過(guò)程不分配內(nèi)存簡(jiǎn)單的字符置換分配內(nèi)存先求實(shí)參值,再代入形參處理時(shí)間預(yù)編譯時(shí)程序運(yùn)行時(shí)參數(shù)類(lèi)型無(wú)類(lèi)型問(wèn)題定義實(shí)參,形參類(lèi)型程序長(zhǎng)度變長(zhǎng)不變運(yùn)行速度不占運(yùn)行時(shí)間調(diào)用和返回占時(shí)間9.2 文件包含文件包含功能:功能:一個(gè)

7、源文件可將另一個(gè)源文件的內(nèi)容全部包含一個(gè)源文件可將另一個(gè)源文件的內(nèi)容全部包含一般形式:一般形式: #include “文件名文件名” 或或 #include #include “file2.c”file1.cfile2.cfile1.cfile2.cABA處理過(guò)程:處理過(guò)程:預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)預(yù)編譯時(shí),用被包含文件的內(nèi)容取代該預(yù)處理命令,再對(duì)處理命令,再對(duì)“包含包含”后的文件作一個(gè)源文件編譯后的文件作一個(gè)源文件編譯 直接按標(biāo)準(zhǔn)目錄搜索直接按標(biāo)準(zhǔn)目錄搜索“”“” 先在先在當(dāng)前目錄當(dāng)前目錄搜索,再搜索標(biāo)準(zhǔn)目錄搜索,再搜索標(biāo)準(zhǔn)目錄被包含文件內(nèi)容被包含文件內(nèi)容源文件源文件(*.c)

8、如:如:#include“file2.c”頭文件頭文件(*.h)系統(tǒng)頭文件系統(tǒng)頭文件 如:如:#include用戶自定義頭文件用戶自定義頭文件 如:如: #include“myhead.h”頭文件應(yīng)包含如下一些內(nèi)容:頭文件應(yīng)包含如下一些內(nèi)容: 類(lèi)型定義類(lèi)型定義 函數(shù)原型函數(shù)原型 內(nèi)聯(lián)函數(shù)聲明內(nèi)聯(lián)函數(shù)聲明 全局?jǐn)?shù)據(jù)聲明全局?jǐn)?shù)據(jù)聲明 常量定義常量定義 包含指令包含指令 宏定義宏定義 注釋注釋頭文件不能包含以下內(nèi)容:頭文件不能包含以下內(nèi)容: 一般函數(shù)定義一般函數(shù)定義 數(shù)據(jù)定義數(shù)據(jù)定義文件包含可嵌套文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “f

9、ile3.c”file2.c Bfile1.cAfile3.cfile2.c例例 文件包含舉例文件包含舉例/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x) (x)*(x)*(x)*(x)#include #include d:shabkcpowers.h#define MAX_POWER 10void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=MAX_POWER;n+) pri

10、ntf(%2dt %3dt %4dt %5dn,n,sqr(n),cube(n),quad(n);9.3 條件編譯條件編譯 功能:根據(jù)指定的標(biāo)識(shí)符是否被定義過(guò),確定在程序編譯功能:根據(jù)指定的標(biāo)識(shí)符是否被定義過(guò),確定在程序編譯階段編譯哪一段程序段。階段編譯哪一段程序段。 形式形式1:#if 表達(dá)式表達(dá)式 程序段程序段1 #else 程序段程序段2 #endif 例例97 根據(jù)需要設(shè)置條件編譯,能將字母全根據(jù)需要設(shè)置條件編譯,能將字母全改為大寫(xiě)輸出,或全改為小寫(xiě)字母輸出。改為大寫(xiě)輸出,或全改為小寫(xiě)字母輸出。#define LETTER1main()char str20=C Language,c;

11、int i; i=0 while(c=stri)!=0) i+;#if LETTER if(c=a & c=Z) c=c-32; #else if(c=A & c=Z) c=c+32; #endif printf(%c,c); 形式形式2:#ifdef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 #else 程序段程序段2 #endif 形式形式3: #ifndef 標(biāo)識(shí)符標(biāo)識(shí)符 程序段程序段1 #else 程序段程序段2 #endif 例:在調(diào)試程序時(shí),常常希望輸出一些所需的信息,而在調(diào)試?yán)涸谡{(diào)試程序時(shí),常常希望輸出一些所需的信息,而在調(diào)試完成后不再輸出這些信息,可在源程序中插入以下的條

12、件編完成后不再輸出這些信息,可在源程序中插入以下的條件編譯段:譯段: #ifdef DEBUG printf(”x=%d,y=%d,z=%dn”,x,y,z); #endif1、有以下程序、有以下程序 # define f(x) (x*x) void main() int i1, i2; i1=f(8)/f(4) ; i2=f(4+4)/f(2+2) ; printf(%d, %dn,i1,i2); 程序運(yùn)行后的輸出結(jié)果是程序運(yùn)行后的輸出結(jié)果是_A_。 A)64, 28 B)4, 4 C)4, 3 D)64, 642、C語(yǔ)言的編譯系統(tǒng)對(duì)宏命令對(duì)處理是語(yǔ)言的編譯系統(tǒng)對(duì)宏命令對(duì)處理是_D_。(A)

13、 在程序運(yùn)行時(shí)進(jìn)行的在程序運(yùn)行時(shí)進(jìn)行的(B) 在程序連接時(shí)進(jìn)行的在程序連接時(shí)進(jìn)行的(C) 和和C程序中的其它語(yǔ)句同時(shí)進(jìn)行編譯的程序中的其它語(yǔ)句同時(shí)進(jìn)行編譯的(D) 在對(duì)源程序中其它成分正式編譯之前進(jìn)行在對(duì)源程序中其它成分正式編譯之前進(jìn)行3、以下有關(guān)宏替換的敘述錯(cuò)誤的是、以下有關(guān)宏替換的敘述錯(cuò)誤的是_C_。A)宏名不具有類(lèi)型)宏名不具有類(lèi)型 B)宏替換不占用運(yùn)行時(shí)間)宏替換不占用運(yùn)行時(shí)間C)宏名必須用大寫(xiě)字母表示)宏名必須用大寫(xiě)字母表示D)宏替換只是字符替換)宏替換只是字符替換8*8/4*4=644+4*4+4/2+2*2+2=28小小 結(jié)結(jié)v 編譯預(yù)處理的種類(lèi):編譯預(yù)處理的種類(lèi): 宏定義宏定義

14、 #define 文件包含文件包含 #include 條件編譯條件編譯 #if-#else-#endif等等v 格式:格式: “#”開(kāi)頭開(kāi)頭 占單獨(dú)書(shū)寫(xiě)行占單獨(dú)書(shū)寫(xiě)行 語(yǔ)句尾不加分號(hào)語(yǔ)句尾不加分號(hào) v位運(yùn)算符和位運(yùn)算位運(yùn)算符和位運(yùn)算v位段位段第12章 位運(yùn)算 C語(yǔ)言能完成語(yǔ)言能完成匯編語(yǔ)言匯編語(yǔ)言的一些功能,這是的一些功能,這是C語(yǔ)言的重要特色。語(yǔ)言的重要特色。 計(jì)算機(jī)用于檢測(cè)控制領(lǐng)域中常用到計(jì)算機(jī)用于檢測(cè)控制領(lǐng)域中常用到位運(yùn)算位運(yùn)算。要學(xué)習(xí)和掌握。要學(xué)習(xí)和掌握。12 . 1 位運(yùn)算符和位運(yùn)算位運(yùn)算符和位運(yùn)算 位運(yùn)算位運(yùn)算 進(jìn)行進(jìn)行二進(jìn)制二進(jìn)制位位的運(yùn)算的運(yùn)算 。C 語(yǔ)言提供的位運(yùn)算符:語(yǔ)言提

15、供的位運(yùn)算符:說(shuō)明:說(shuō)明: 除除以外,均為雙目運(yùn)算符,是兩個(gè)二進(jìn)位進(jìn)行運(yùn)算。以外,均為雙目運(yùn)算符,是兩個(gè)二進(jìn)位進(jìn)行運(yùn)算。 運(yùn)算量運(yùn)算量只能是整型或字符型數(shù)據(jù),不能為實(shí)型數(shù)據(jù)只能是整型或字符型數(shù)據(jù),不能為實(shí)型數(shù)據(jù) 。運(yùn)算符含義運(yùn)算符含義&按位與取反|按位或右移1.按位與運(yùn)算符(按位與運(yùn)算符(&) 相應(yīng)位有一個(gè)二進(jìn)位為相應(yīng)位有一個(gè)二進(jìn)位為0,則結(jié)果為,則結(jié)果為0; 兩個(gè)都為兩個(gè)都為1,結(jié)果才為,結(jié)果才為1。例如:例如:3 & 5 3 = 0 0 0 0 0 0 1 1 & 5 = 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 值為值為1 例如:例如

16、: (-3) & ( -5) 先用補(bǔ)碼表示,然后運(yùn)算。先用補(bǔ)碼表示,然后運(yùn)算。 (-3)= 1 1 1 1 1 1 0 1 & (-5)= 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 12.按位或運(yùn)算符(按位或運(yùn)算符(|) 相應(yīng)位兩個(gè)中只要有一個(gè)為相應(yīng)位兩個(gè)中只要有一個(gè)為1,結(jié)果即為,結(jié)果即為1。例如:例如:060|017 0 0 1 1 0 0 0 0 (|) 0 0 0 0 1 1 1 1 0 0 1 1 1 1 1 1 3.異或運(yùn)算符異或運(yùn)算符() 相應(yīng)位兩個(gè)二進(jìn)位同號(hào),結(jié)果為相應(yīng)位兩個(gè)二進(jìn)位同號(hào),結(jié)果為0;異號(hào)則為;異號(hào)則為1。例如:例如:071052

17、0 0 1 1 1 0 0 1 () 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 14.取反運(yùn)算符(取反運(yùn)算符() 對(duì)一個(gè)二進(jìn)制數(shù)按位取反,將對(duì)一個(gè)二進(jìn)制數(shù)按位取反,將0變變1,1變變0。 0 0 0 1 1 0 0 1 1 1 1 0 0 1 1 05.左移運(yùn)算符(左移運(yùn)算符() 將一個(gè)數(shù)的各二進(jìn)位全部左移若干位(高位溢出,低位補(bǔ)將一個(gè)數(shù)的各二進(jìn)位全部左移若干位(高位溢出,低位補(bǔ)0)。)。 例如:例如:a=15;a=a1; a=15; 00001111 a=a) 將一個(gè)數(shù)的各二進(jìn)位全部右移若干位。將一個(gè)數(shù)的各二進(jìn)位全部右移若干位。分算術(shù)右移和邏輯右移。分算術(shù)右移和邏輯右移。

18、例如:例如:a=14;a=a1; a=14; 00001110 a=a1; 00000111 a=7=14/2 右移右移1位相當(dāng)于該數(shù)除以位相當(dāng)于該數(shù)除以2(變小)。(變?。?。(邏輯右移)(邏輯右移)7.位運(yùn)算賦值運(yùn)算符位運(yùn)算賦值運(yùn)算符 &= |= = 2)/(b1)(b2)/(b1)的值是的值是 A A 。 A0 B2 C4 D82、&作單目運(yùn)算符時(shí)表示的功能是作單目運(yùn)算符時(shí)表示的功能是_。書(shū)上兩個(gè)綜合性例子。書(shū)上兩個(gè)綜合性例子。例例12.1 取一個(gè)整數(shù)取一個(gè)整數(shù) a 從低端開(kāi)始的從低端開(kāi)始的 4 7 位。位。 (1) 使使 a 右移右移4 位(目的是使位(目的是使 a 的第

19、的第4 位右移到第位右移到第0位)位) b= a 4(2) 設(shè)置一個(gè)右端設(shè)置一個(gè)右端4 位全為位全為1 其余全為其余全為 0 的數(shù),的數(shù), 方法是:方法是: (04) (見(jiàn)下面所示) 0: 1111.111111 04: 1111.110000 (左移4位) c= ( 04 ; c= ( 04) ; d= b& c ; printf(%o,%dn, a , a) ; printf(%o,%dn, d , d) ;a15 87 4 3 015 4 3 0 12.2 位運(yùn)算舉例位運(yùn)算舉例位段:位段: C語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占語(yǔ)言允許在一個(gè)結(jié)構(gòu)體中以位為單位來(lái)指定其成員所占內(nèi)存長(zhǎng)度。這種以位為單位的成員稱(chēng)為內(nèi)存長(zhǎng)度。這種以位為單位的成員稱(chēng)為“位段位段”。利用位段能。利用位段能夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。夠用較少的位數(shù)存儲(chǔ)數(shù)據(jù)。 12.3 位段位段 信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一個(gè)信息的存取一般以字節(jié)為單位。實(shí)際上,有時(shí)存儲(chǔ)一

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論