面向?qū)ο蠹夹g(shù)與電子oolecture_第1頁(yè)
面向?qū)ο蠹夹g(shù)與電子oolecture_第2頁(yè)
面向?qū)ο蠹夹g(shù)與電子oolecture_第3頁(yè)
面向?qū)ο蠹夹g(shù)與電子oolecture_第4頁(yè)
面向?qū)ο蠹夹g(shù)與電子oolecture_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余9頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、一 從C應(yīng)如高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)類高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)類型的種類與計(jì)算一 從C應(yīng)如高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)類高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)類型的種類與計(jì)算機(jī)硬件所能支持的(位數(shù))據(jù)構(gòu)造有關(guān)高級(jí)程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)長(zhǎng)度與計(jì)算機(jī)的機(jī)器字長(zhǎng)和指令種類關(guān)編譯器和程序編譯產(chǎn)生的程序處理同一數(shù)據(jù)類型的過(guò)程存在差異數(shù)據(jù)類型符號(hào)與機(jī)器字長(zhǎng)的關(guān)系對(duì)例1:已知某計(jì)算機(jī)機(jī)器字長(zhǎng)16 位,下述C 語(yǔ)句的執(zhí)行結(jié)果i=40000;/*若字長(zhǎng)是32 位,可以令分析先將 i 變換為十六進(jìn)數(shù)得40000=0X9c40(若字長(zhǎng)是 32 位且i=2150000000,則 i 變換的十六進(jìn)數(shù)值為 i 為有符號(hào)整(即將占用一位數(shù)的符

2、號(hào)位且符號(hào)位為 1(即為負(fù)數(shù)編譯系統(tǒng)將計(jì)算其視為補(bǔ)碼(即-0X63c0因此執(zhí)行后的輸出結(jié)果-數(shù)據(jù)類型符所對(duì)應(yīng)的機(jī)器、整數(shù)字(有、無(wú)符號(hào)short、unsigned 整數(shù)半字(有、無(wú)符號(hào)long、unsigned整數(shù)雙字(有、無(wú)符號(hào)char、unsigned整數(shù)字節(jié)(有、無(wú)符號(hào)浮點(diǎn)數(shù)浮點(diǎn)數(shù)long浮點(diǎn)數(shù)四字(倍雙字造成思路偏差的關(guān)鍵是數(shù)在編譯轉(zhuǎn)換與輸出轉(zhuǎn)換是先后兩個(gè)不同的環(huán)節(jié)。很難有學(xué)生能將在內(nèi)存中的造成思路偏差的關(guān)鍵是數(shù)在編譯轉(zhuǎn)換與輸出轉(zhuǎn)換是先后兩個(gè)不同的環(huán)節(jié)。很難有學(xué)生能將在內(nèi)存中的數(shù)據(jù)處理與輸入輸出時(shí)進(jìn)行的轉(zhuǎn)換之間的關(guān)系想明例 2:已知某程序內(nèi)的初始數(shù)為:char* p=”acd”;當(dāng)該程

3、序運(yùn)某時(shí)刻時(shí)使指針指向字符串內(nèi)字符c的位置判斷下述四條 C 語(yǔ)中哪一條能夠正確取得該字符串內(nèi)的字符*p-(B) *-(C) *p-(D) *(p-分析:地址數(shù)值為同長(zhǎng)、同類型數(shù)據(jù),故該計(jì)算將涉及到多先策略(即地址變更與對(duì)地址的一次間的優(yōu)先策略。當(dāng)復(fù)合生地址變換與訪內(nèi)操作時(shí)則要是各自運(yùn)算符號(hào)的相對(duì)位置而定。因此很容易的判斷出(B)是正確該問(wèn)題正確解答的關(guān)鍵是正解間接尋址和的順序規(guī)則例3:試說(shuō)明C 語(yǔ)句“i+j;”的計(jì)算策略分析:編譯掃描自左向右,故判斷操作對(duì)象與運(yùn)算的關(guān)系應(yīng)形成和j兩個(gè)部分,又”i+”為一元運(yùn)算,故先予計(jì)算。若編譯器的掃描方逆轉(zhuǎn),則先計(jì)算+j 也是正確使用不同的數(shù)據(jù)類型與數(shù)據(jù)長(zhǎng)度

4、時(shí)應(yīng)考慮其相互間的(編譯)則例4:試判斷出下述C 程序的執(zhí)行結(jié)果16 位字長(zhǎng)的代碼long32 位字長(zhǎng)的代碼long s,l=5; unsignedshortcharc=-charc=-s=l+u*c;/*預(yù)期值為-s=l+u*(unsigned short)c;/*預(yù)期值為-7,但際值為262137,即f(“%ld”,f(%ld,分析:u*c 中的c 先轉(zhuǎn)換成無(wú)符號(hào)整s=l+u*c;/*預(yù)期值為-s=l+u*(unsigned short)c;/*預(yù)期值為-7,但際值為262137,即f(“%ld”,f(%ld,分析:u*c 中的c 先轉(zhuǎn)換成無(wú)符號(hào)整數(shù)(d后完成u*c 計(jì)(乘4 即左移兩位)

5、并獲得中間結(jié)果 4。為計(jì)算 l 與該中間結(jié)和則先使無(wú)符號(hào)整數(shù)的中間結(jié)果轉(zhuǎn)換l 相同的有符號(hào)雙字(4s=65529(即9。與預(yù)期值不一致的根本原在于 c 經(jīng)歷了兩次符號(hào)間的轉(zhuǎn)換。如果在開(kāi)始計(jì)算之前便使所有計(jì)值都一致,則此問(wèn)題就可以避免了。既將“s=l+u*c;” 語(yǔ)句改“s=l+(long)u*c;”。在 VC7 以后的編譯器中可以省略強(qiáng)本例的思考點(diǎn)任何編譯器所支持的數(shù)據(jù)類型轉(zhuǎn)換策略都只能適用于有限的環(huán)境在對(duì)所使開(kāi)發(fā)工具具有的多種轉(zhuǎn)換策略不了解的情況下獲得產(chǎn)品存在缺陷是必然的本例中所用到的不同數(shù)據(jù)類型轉(zhuǎn)換策略如下無(wú)符號(hào)整數(shù)短長(zhǎng)補(bǔ)長(zhǎng)短:截有符號(hào)整數(shù)短長(zhǎng):正補(bǔ)零;負(fù)補(bǔ)長(zhǎng)短:截由此可以得到以下結(jié)使用不

6、同的數(shù)據(jù)類型的混合計(jì)算必須考慮由編譯系統(tǒng)預(yù)先設(shè)定的策略(如長(zhǎng)度轉(zhuǎn)換策略、符號(hào)轉(zhuǎn)換策略、數(shù)值精度轉(zhuǎn)換策略、多重處轉(zhuǎn)換的優(yōu)先策略等使用不同的運(yùn)算符號(hào)所組成的混合數(shù)據(jù)類型計(jì)算,編譯器策略(如長(zhǎng)度轉(zhuǎn)換策略、符號(hào)轉(zhuǎn)換策略、數(shù)值精度轉(zhuǎn)換策略、多重處轉(zhuǎn)換的優(yōu)先策略等使用不同的運(yùn)算符號(hào)所組成的混合數(shù)據(jù)類型計(jì)算,編譯器會(huì)安依照符元數(shù)優(yōu)先策略生成機(jī)器代指針是地址數(shù)據(jù),經(jīng)指針的訪內(nèi)操作是機(jī)器指令的間址操作指針類型是用來(lái)決定指針?biāo)淼牡刂窋?shù)據(jù)的變址的理論上不同類型的指針也可以強(qiáng)制,但從安全觀點(diǎn)用小地的指針強(qiáng)制指向較大刻度的指針5:若機(jī)器字長(zhǎng)為16 位,試判斷下述C 語(yǔ)句的執(zhí)行結(jié)果longchar*f(“%x”,*p

7、);/*若將p 分別改為p+1 p+3,則結(jié)果如何分析:在機(jī)器字長(zhǎng)為16 位的計(jì)算機(jī)內(nèi),long 類型字長(zhǎng)度對(duì)其進(jìn)行字節(jié)類型char 強(qiáng)制時(shí),將按字節(jié)取出對(duì)應(yīng)內(nèi)存的long 類型數(shù)據(jù)的內(nèi)存布局如下所述,故輸出結(jié)果為 1低位字低位字字節(jié) 低位字字在 C 語(yǔ)言內(nèi)的數(shù)組與指針的處理機(jī)制大體相同,根本區(qū)別是數(shù)組讀的指從函看不同執(zhí)行程序單元間程序開(kāi)發(fā)的過(guò)程看,必須(確定名稱和數(shù)據(jù)類型、定義(賦予名稱的實(shí)體意義、最(執(zhí)行程序的機(jī)器代碼P使用參數(shù)單向傳遞是出于保護(hù)各自過(guò)程作用域數(shù)據(jù)的目的使用全程變量或指針作參數(shù)可以使用參數(shù)單向傳遞是出于保護(hù)各自過(guò)程作用域數(shù)據(jù)的目的使用全程變量或指針作參數(shù)可以實(shí)現(xiàn)數(shù)據(jù)的雙向傳

8、遞(但不能定制函數(shù)的返回?cái)?shù)據(jù)若是指針,則可以對(duì)其進(jìn)行任何指針允許的操作例 6:試判斷下述程序執(zhí)行后的輸出結(jié)果*returnvoid分析:對(duì)執(zhí)行f 函數(shù)后所返回的變量pub 的地址作間得到其內(nèi)再與被加數(shù)相加,等效于 3+4+5=12C/C+程序內(nèi)函數(shù)與數(shù)據(jù)具有等價(jià)的地位(函數(shù)型指針為典型代表函數(shù)型指針?lè)祷氐闹羔様?shù)據(jù)類型(*函數(shù)指針名(參數(shù)類例 7:函數(shù)型指針的應(yīng)用,pf=&max;/*函數(shù)地址附值rs=pf(9.0,2.4);/* 函數(shù)指的簡(jiǎn)化形式在 C 程序內(nèi)函數(shù)型指針多以函數(shù)的參數(shù)出現(xiàn)在虛函數(shù)中虛函數(shù)格式返回類型 在 C 程序內(nèi)函數(shù)型指針多以函數(shù)的參數(shù)出現(xiàn)在虛函數(shù)中虛函數(shù)格式返回類型 函數(shù)名

9、(參數(shù)類型,指針類型(*(參數(shù)虛函數(shù)的定義格式返回類型 函數(shù)(參數(shù)名 1(*虛函數(shù)名(參數(shù)代碼體例 8:利用虛函數(shù)設(shè)計(jì)的求圓周長(zhǎng)和面積 C 程序代constfloatfloatcircle_len(floatradio)returnfloat circle_area(float radio)return pai* radio *radio; floatcircle_js(floatradio,float(*f)(float)returnf(radio); void main()float有限程序作用的概程序加工的對(duì)象是數(shù)據(jù)數(shù)據(jù)在其生命周期內(nèi)分為全程(局即 global)和局部(local某個(gè)特

10、定數(shù)據(jù)只與某段程序的特定處理相關(guān),最具體的體現(xiàn)為 語(yǔ)言的類別和運(yùn)行期的變量生命周期的控制C 語(yǔ)言內(nèi)四種附類extern的數(shù)據(jù)在作用域之;ic的數(shù)據(jù)的生命周期不作用域的影響auto的數(shù)據(jù)的生命周期僅作用域register的數(shù)據(jù)須在寄存器內(nèi)完成計(jì)例 9:試判斷執(zhí)行該程序后的結(jié)void分析:兩個(gè)i 的生命周期別分是global local,auto的數(shù)據(jù)的生命周期僅作用域register的數(shù)據(jù)須在寄存器內(nèi)完成計(jì)例 9:試判斷執(zhí)行該程序后的結(jié)void分析:兩個(gè)i 的生命周期別分是global local,則其對(duì)應(yīng)的類別分別是icauto。因f 函數(shù)處在main 函數(shù)的作用域內(nèi),所該域內(nèi)的i 變量,故輸

11、出結(jié)果1首編譯器提供的內(nèi)存內(nèi)存模式是根據(jù)不同的程序代碼與數(shù)據(jù)規(guī)模而預(yù)先設(shè)定的程序在運(yùn)行時(shí)的內(nèi)存駐留格局。內(nèi)存模式通過(guò) C 編譯附加參數(shù)設(shè)定根據(jù)代碼和數(shù)據(jù)的內(nèi)存駐留格局可以分為 tiny、small、mediumcompact、largehuge等模式十六位計(jì)算機(jī)為例的C當(dāng)只是一個(gè)局部的數(shù)據(jù)需要改變內(nèi)存駐留格局時(shí)可以使用編譯附模函數(shù)代數(shù)據(jù)默認(rèn)調(diào)用的庫(kù)段段地址段段地址唯與代碼段共用唯唯多唯唯多多多多多存模式保留字通知編譯器(C 的內(nèi)存模式保留字有 near、far、huge在使用時(shí)應(yīng)遵守如下約定同類存模式保留字通知編譯器(C 的內(nèi)存模式保留字有 near、far、huge在使用時(shí)應(yīng)遵守如下約定同類

12、的附加關(guān)鍵字要一farad( far,(far,三個(gè)模式附加關(guān)鍵字只能順向轉(zhuǎn)三個(gè)模式附加關(guān)鍵字不能改變已(庫(kù)函數(shù)的返回值類doublefarvoidf(“%f”,sin(.5);/*顯示結(jié)直接C 語(yǔ)言使用段和段基語(yǔ)句可直接訪內(nèi)。段和段基語(yǔ)句的關(guān)鍵字為_(kāi)segment 段名=內(nèi)址_based(段名) 段偏移名=偏移值與其配套的算_segment sg=0 xb800; unsignedchar_based(sg)*p=0;簡(jiǎn)單的彩色屬若使用配套的算符則*(p+i)=0 x84 一項(xiàng)可改寫(xiě)為二一些C 例 13二一些C 例 13:可將前一例改為如_asm匯編程序例 14:已知主頻為 40MHz(即周

13、期為 0.025s)的某接口,欲對(duì)其最位打入一個(gè) 1s 的脈沖,可在 C 程序中嵌入如下的匯編程序#define#definevoid目的:在 C 編譯階段實(shí)現(xiàn)一些區(qū)段動(dòng)態(tài)的符號(hào)替換格式:#預(yù)處理指示關(guān)參量替換預(yù)處理語(yǔ)句#include”常數(shù)例#define pai 3.14 #definepai2(pai+pai)常數(shù)不是常量;括號(hào)不能少替換預(yù)處理語(yǔ)句#include”常數(shù)例#define pai 3.14 #definepai2(pai+pai)常數(shù)不是常量;括號(hào)不能少變量17:#definea#define#define#define C 語(yǔ)言中的宏實(shí)際上是在編譯之前由編譯器完成的一種符

14、號(hào)集群替換。因此,切不可將之與。依據(jù)替換位置的不同,C 語(yǔ)言的宏又有所謂宏函數(shù)和宏過(guò)程之分如:#define max(x,y) (x)(y)?(x):(y)是宏函而:#definepti(nf(“%d”,n)和#definept(sf(“s”)就是宏過(guò)使用宏的最大問(wèn)題是容易產(chǎn)生二意#define sq(x)void main()%d”,j,i);/*顯示結(jié)果為:12 而不是 代名代名符#define sq(x)void main()%d”,j,i);/*顯示結(jié)果為:12 而不是 代名代名符是一種特殊的常數(shù)代#define TEST TESTvoidmain()在替換中使用參由于#define

15、語(yǔ)句本身的作用就是在通知編譯器如何進(jìn)行各種符號(hào)C 語(yǔ)言還專門提供了一個(gè)特殊的符號(hào)作為未來(lái)的參數(shù)標(biāo)識(shí),被稱為符號(hào)參數(shù)。符號(hào)參數(shù)用“#”和“#”表示。前者意為處換;后者意在處的變量名續(xù)#define pr(x) pr#define pai1 3.14#definepai2#definepaiout(x)void/*輸出結(jié)果為paiout(2); /*輸出結(jié)果為#define alfa(x,y)void ();void#undefalfa#definealfa2.72 void sb()內(nèi)存的動(dòng)態(tài)實(shí)模式下 C 程序的靜態(tài)內(nèi)存#define alfa(x,y)void ();void#undefalf

16、a#definealfa2.72 void sb()內(nèi)存的動(dòng)態(tài)實(shí)模式下 C 程序的靜態(tài)內(nèi)存堆棧區(qū)可以通過(guò)編譯參數(shù)設(shè)定,但最大不超過(guò) 動(dòng)態(tài)的占用不同位置的內(nèi)存需通過(guò)使用不同的內(nèi)存分配庫(kù)數(shù)實(shí)現(xiàn)內(nèi)存的動(dòng)態(tài)分配庫(kù)函數(shù)的內(nèi)存的動(dòng)態(tài)分配庫(kù)函數(shù)均由位于 malloc.h 的頭文件中予。(1)動(dòng)態(tài)占用本地堆棧區(qū)的庫(kù)函數(shù) void* 特點(diǎn):最大容量小于 32KB;無(wú)須使用庫(kù)函;(2)動(dòng)態(tài)占用程序內(nèi)數(shù)據(jù)區(qū)的庫(kù)函數(shù) void* 特點(diǎn):最大容量可達(dá) 64KB;要使用庫(kù)函數(shù)“void 所兩 者均為 堆棧 區(qū),默認(rèn)容量為 2048 字節(jié)程序代公共全程、靜態(tài)分配區(qū)默認(rèn)DS、態(tài)分配的程序內(nèi)數(shù)據(jù)(nearSP(頂本地棧局部動(dòng)態(tài)數(shù)據(jù)占用區(qū)態(tài)分配的外部堆數(shù)據(jù)(far內(nèi)存(3)動(dòng)態(tài)占用外部數(shù)據(jù)區(qū)的庫(kù)函數(shù) void far* 特點(diǎn):最大容量視剩余內(nèi)存容量而定內(nèi)存(3)動(dòng)態(tài)占用外部數(shù)據(jù)區(qū)的庫(kù)函數(shù) void far* 特點(diǎn):最大容量視剩余內(nèi)存容量而定;以 64KB 自動(dòng)分段;要用庫(kù)函數(shù)“void_ffree(void所占內(nèi)存(4)

溫馨提示

  • 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)論