面向?qū)ο蠹夹g(shù)與電子oolecture_第1頁
面向?qū)ο蠹夹g(shù)與電子oolecture_第2頁
面向?qū)ο蠹夹g(shù)與電子oolecture_第3頁
面向?qū)ο蠹夹g(shù)與電子oolecture_第4頁
面向?qū)ο蠹夹g(shù)與電子oolecture_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、遞(但不能定制函數(shù)的返回數(shù)據(jù)若是指針,則可以對其進行任何指針允許的操作例 6:試判斷下述程序執(zhí)行后的輸出結(jié)果*returnvoid分析:對執(zhí)行f 函數(shù)后所返回的變量pub 的地址作間得到其內(nèi)再與被加數(shù)相加,等效于 3+4+5=12C/C+程序內(nèi)函數(shù)與數(shù)據(jù)具有等價的地位(函數(shù)型指針為典型代表函數(shù)型指針返回的指針數(shù)據(jù)類型(*函數(shù)指針名(參數(shù)類例 7:函數(shù)型指針的應(yīng)用,pf=&max;/*函數(shù)地址附值rs=pf(9.0,2.4);/* 函數(shù)指的簡化形式在 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è)計的求圓周長和面積 C 程序代constfloatfloatcircle_len(floatradio)returnfloat circle_area(float radio)return pai* radio *radio; floatcircle_js(floatradio,float(*f)(float)returnf(radio); void main()float有限程序作用的概程序加工的對象是數(shù)據(jù)數(shù)據(jù)在其生命周期內(nèi)分為全程(局即 global)和局部(local某個特

10、定數(shù)據(jù)只與某段程序的特定處理相關(guān),最具體的體現(xiàn)為 語言的類別和運行期的變量生命周期的控制C 語言內(nèi)四種附類extern的數(shù)據(jù)在作用域之;ic的數(shù)據(jù)的生命周期不作用域的影響auto的數(shù)據(jù)的生命周期僅作用域register的數(shù)據(jù)須在寄存器內(nèi)完成計例 9:試判斷執(zhí)行該程序后的結(jié)void分析:兩個i 的生命周期別分是global local,auto的數(shù)據(jù)的生命周期僅作用域register的數(shù)據(jù)須在寄存器內(nèi)完成計例 9:試判斷執(zhí)行該程序后的結(jié)void分析:兩個i 的生命周期別分是global local,則其對應(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è)定的程序在運行時的內(nèi)存駐留格局。內(nèi)存模式通過 C 編譯附加參數(shù)設(shè)定根據(jù)代碼和數(shù)據(jù)的內(nèi)存駐留格局可以分為 tiny、small、mediumcompact、largehuge等模式十六位計算機為例的C當(dāng)只是一個局部的數(shù)據(jù)需要改變內(nèi)存駐留格局時可以使用編譯附模函數(shù)代數(shù)據(jù)默認調(diào)用的庫段段地址段段地址唯與代碼段共用唯唯多唯唯多多多多多存模式保留字通知編譯器(C 的內(nèi)存模式保留字有 near、far、huge在使用時應(yīng)遵守如下約定同類存模式保留字通知編譯器(C 的內(nèi)存模式保留字有 near、far、huge在使用時應(yīng)遵守如下約定同類

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

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

14、號集群替換。因此,切不可將之與。依據(jù)替換位置的不同,C 語言的宏又有所謂宏函數(shù)和宏過程之分如:#define max(x,y) (x)(y)?(x):(y)是宏函而:#definepti(nf(“%d”,n)和#definept(sf(“s”)就是宏過使用宏的最大問題是容易產(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、語句本身的作用就是在通知編譯器如何進行各種符號C 語言還專門提供了一個特殊的符號作為未來的參數(shù)標(biāo)識,被稱為符號參數(shù)。符號參數(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)存的動態(tài)實模式下 C 程序的靜態(tài)內(nèi)存#define alfa(x,y)void ();void#undefalf

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

溫馨提示

  • 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

提交評論