第五章數(shù)據(jù)類型_第1頁
第五章數(shù)據(jù)類型_第2頁
第五章數(shù)據(jù)類型_第3頁
第五章數(shù)據(jù)類型_第4頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第五章第五章 數(shù)據(jù)類型數(shù)據(jù)類型2n任何程序,不管以何種語言寫成,均可任何程序,不管以何種語言寫成,均可以視為刻劃了一個操作集合。并將以一以視為刻劃了一個操作集合。并將以一定順序作用到一定數(shù)據(jù)上。定順序作用到一定數(shù)據(jù)上。n語言的基本不同在于:語言的基本不同在于:n允許的數(shù)據(jù)類型允許的數(shù)據(jù)類型n允許的操作類型允許的操作類型n控制操作順序的機(jī)制。控制操作順序的機(jī)制。3本章主要內(nèi)容本章主要內(nèi)容n數(shù)據(jù)類型的基本概念及相關(guān)屬性數(shù)據(jù)類型的基本概念及相關(guān)屬性n基本數(shù)據(jù)類型基本數(shù)據(jù)類型n復(fù)合數(shù)據(jù)類型復(fù)合數(shù)據(jù)類型45.1 類型和對象的性質(zhì)類型和對象的性質(zhì)n數(shù)據(jù)對象數(shù)據(jù)對象、變量和常量變量和常量n數(shù)據(jù)類型及其規(guī)約數(shù)

2、據(jù)類型及其規(guī)約n簡單數(shù)據(jù)類型的規(guī)約與實現(xiàn)簡單數(shù)據(jù)類型的規(guī)約與實現(xiàn)n數(shù)據(jù)對象的聲明數(shù)據(jù)對象的聲明n類型檢查和類型轉(zhuǎn)換類型檢查和類型轉(zhuǎn)換n數(shù)據(jù)對象的初始化數(shù)據(jù)對象的初始化5數(shù)據(jù)對象數(shù)據(jù)對象n計算機(jī)的數(shù)據(jù)存儲在結(jié)構(gòu)上是簡單的,計算機(jī)的數(shù)據(jù)存儲在結(jié)構(gòu)上是簡單的,通常是由位串構(gòu)成的字節(jié)。通常是由位串構(gòu)成的字節(jié)。n而語言虛擬機(jī)的數(shù)據(jù)存儲則有更復(fù)雜的而語言虛擬機(jī)的數(shù)據(jù)存儲則有更復(fù)雜的組織,如:數(shù)組、棧、數(shù)、字符串、以組織,如:數(shù)組、棧、數(shù)、字符串、以及其它存在于程序執(zhí)行中不同點(diǎn)的數(shù)據(jù)。及其它存在于程序執(zhí)行中不同點(diǎn)的數(shù)據(jù)。n我們稱虛擬機(jī)上一個或多個數(shù)據(jù)片斷運(yùn)我們稱虛擬機(jī)上一個或多個數(shù)據(jù)片斷運(yùn)行時的組合為數(shù)據(jù)對

3、象。行時的組合為數(shù)據(jù)對象。6數(shù)據(jù)對象數(shù)據(jù)對象n在程序運(yùn)行中,存在許多不同類型的不同數(shù)據(jù)在程序運(yùn)行中,存在許多不同類型的不同數(shù)據(jù)對象。這些對象及其相互關(guān)系在運(yùn)行時動態(tài)變對象。這些對象及其相互關(guān)系在運(yùn)行時動態(tài)變化。化。n有些數(shù)據(jù)對象是程序員定義的,如變量、常量、有些數(shù)據(jù)對象是程序員定義的,如變量、常量、數(shù)組、文件等。程序員通過聲明和語句顯式地數(shù)組、文件等。程序員通過聲明和語句顯式地創(chuàng)建和操作它們。創(chuàng)建和操作它們。 n有些數(shù)據(jù)對象是系統(tǒng)定義的,不可為程序員直有些數(shù)據(jù)對象是系統(tǒng)定義的,不可為程序員直接訪問。如:運(yùn)行時存儲棧、子程序激活記錄、接訪問。如:運(yùn)行時存儲棧、子程序激活記錄、文件緩沖、自由空間列

4、表等。這些數(shù)據(jù)對象在文件緩沖、自由空間列表等。這些數(shù)據(jù)對象在運(yùn)行需要時自動產(chǎn)生,不需要時刪除。運(yùn)行需要時自動產(chǎn)生,不需要時刪除。7數(shù)據(jù)對象n標(biāo)量數(shù)據(jù)對象:nNumeric (Integers, Real)nBooleansnCharactersnEnumerationsn復(fù)合對象:nStringnPointern結(jié)構(gòu)化對象:nArraysnRecordsnListsnSetsn抽象數(shù)據(jù)對象:nClassesn活動對象:nTasksnProcesses8數(shù)據(jù)對象數(shù)據(jù)對象n數(shù)據(jù)對象表示了數(shù)據(jù)值的一個容器,是值被數(shù)據(jù)對象表示了數(shù)據(jù)值的一個容器,是值被存放和檢索的地方,而數(shù)據(jù)值是在存儲器中存放和檢索的

5、地方,而數(shù)據(jù)值是在存儲器中以一種特定的位模式表示。以一種特定的位模式表示。n數(shù)據(jù)對象和數(shù)據(jù)值在大多數(shù)語言中均是明確數(shù)據(jù)對象和數(shù)據(jù)值在大多數(shù)語言中均是明確區(qū)分的,如圖所示。區(qū)分的,如圖所示。9數(shù)據(jù)對象數(shù)據(jù)對象n每個數(shù)據(jù)對象有生命期,在生命期內(nèi)可用來每個數(shù)據(jù)對象有生命期,在生命期內(nèi)可用來存放數(shù)據(jù)值。存放數(shù)據(jù)值。n數(shù)據(jù)對象可分為簡單數(shù)據(jù)對象和數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)對象可分為簡單數(shù)據(jù)對象和數(shù)據(jù)結(jié)構(gòu)n數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu) 其他數(shù)據(jù)對象的聚集。其他數(shù)據(jù)對象的聚集。n數(shù)據(jù)對象在其生命期中涉及各種綁定,雖然數(shù)據(jù)對象在其生命期中涉及各種綁定,雖然其屬性不變,但綁定可動態(tài)改變。其屬性不變,但綁定可動態(tài)改變。10數(shù)據(jù)對象:屬性和

6、綁定數(shù)據(jù)對象:屬性和綁定n重要的屬性和綁定有:重要的屬性和綁定有:1、類型、類型n通常在程序翻譯時,關(guān)聯(lián)數(shù)據(jù)對象和它可能的取值集合。通常在程序翻譯時,關(guān)聯(lián)數(shù)據(jù)對象和它可能的取值集合。2、位置、位置n通常不由程序員規(guī)定,而是系統(tǒng)存儲管理負(fù)責(zé)。通常不由程序員規(guī)定,而是系統(tǒng)存儲管理負(fù)責(zé)。3、值、值n由賦值操作完成綁定。由賦值操作完成綁定。4、名、名n通常在聲明時完成綁定,但可被子程序調(diào)用和返回修改通常在聲明時完成綁定,但可被子程序調(diào)用和返回修改5、部件、部件n通常用指針值相連,可通過指針的修改而變動。通常用指針值相連,可通過指針的修改而變動。 返回11變量和常量變量和常量n程序員通過變量來顯式地定義

7、和命名數(shù)據(jù)對象。程序員通過變量來顯式地定義和命名數(shù)據(jù)對象。n一個簡單的變量是有名字的簡單數(shù)據(jù)對象,其一個簡單的變量是有名字的簡單數(shù)據(jù)對象,其內(nèi)容可以發(fā)生變化。內(nèi)容可以發(fā)生變化。n常量是具有名字的數(shù)據(jù)對象,其值在其生命期常量是具有名字的數(shù)據(jù)對象,其值在其生命期內(nèi)永久不變。一個文字(或文字常量)是一個內(nèi)永久不變。一個文字(或文字常量)是一個常量,其名是其值的書寫表示,如常量,其名是其值的書寫表示,如21表示值為表示值為21的整數(shù)常量。的整數(shù)常量。n程序員定義的常量程序員定義的常量其名字由程序員指定。其名字由程序員指定。n常量的綁定由編譯器完成。常量的綁定由編譯器完成。n如如C語言中,語言中,#de

8、fine MAX 20n語句語句MAX=4是非法的。是非法的。 返回12數(shù)據(jù)類型數(shù)據(jù)類型n一個數(shù)據(jù)類型是一類數(shù)據(jù)對象加上創(chuàng)建及操作一個數(shù)據(jù)類型是一類數(shù)據(jù)對象加上創(chuàng)建及操作它們的一組操作。它們的一組操作。n每個語言有一個基本數(shù)據(jù)類型集合,是語言固每個語言有一個基本數(shù)據(jù)類型集合,是語言固有的。有的。n有的語言還提供了設(shè)施允許程序員定義新數(shù)據(jù)類型。有的語言還提供了設(shè)施允許程序員定義新數(shù)據(jù)類型。n有的新語言還允許類型本身被語言操作(高階能有的新語言還允許類型本身被語言操作(高階能力)。力)。n每個數(shù)據(jù)類型都包括對其相關(guān)性質(zhì)的每個數(shù)據(jù)類型都包括對其相關(guān)性質(zhì)的規(guī)約規(guī)約以及以及在計算機(jī)中的具體實現(xiàn)在計算機(jī)中

9、的具體實現(xiàn)13數(shù)據(jù)類型的規(guī)約數(shù)據(jù)類型的規(guī)約n數(shù)據(jù)類型的規(guī)約包括:數(shù)據(jù)類型的規(guī)約包括:1、區(qū)分該類型的數(shù)據(jù)對象的屬性、區(qū)分該類型的數(shù)據(jù)對象的屬性2、該類型數(shù)據(jù)對象可具有的值、該類型數(shù)據(jù)對象可具有的值3、定義該類型數(shù)據(jù)對象可能處理的操作、定義該類型數(shù)據(jù)對象可能處理的操作n例如:數(shù)組數(shù)據(jù)類型的規(guī)約例如:數(shù)組數(shù)據(jù)類型的規(guī)約n屬性:維數(shù)、每維的下標(biāo)范圍、元素的數(shù)據(jù)類型等。屬性:維數(shù)、每維的下標(biāo)范圍、元素的數(shù)據(jù)類型等。n值:形成數(shù)值元素有效值的數(shù)的集合。值:形成數(shù)值元素有效值的數(shù)的集合。n操作:選擇個體數(shù)組元素、創(chuàng)建數(shù)組、改變數(shù)組形操作:選擇個體數(shù)組元素、創(chuàng)建數(shù)組、改變數(shù)組形狀,訪問下標(biāo)上下界、完成數(shù)組間

10、的算術(shù)操作等。狀,訪問下標(biāo)上下界、完成數(shù)組間的算術(shù)操作等。返回14數(shù)據(jù)類型的實現(xiàn)數(shù)據(jù)類型的實現(xiàn)n數(shù)據(jù)類型的實現(xiàn)包括:數(shù)據(jù)類型的實現(xiàn)包括:1、存儲表示:用于在計算機(jī)存儲器中表示數(shù)、存儲表示:用于在計算機(jī)存儲器中表示數(shù)據(jù)對象。據(jù)對象。2、數(shù)據(jù)類型操作是以特殊的算法或過程表示、數(shù)據(jù)類型操作是以特殊的算法或過程表示的方式,這些算法和過程操縱數(shù)據(jù)對象的存的方式,這些算法和過程操縱數(shù)據(jù)對象的存儲表示。儲表示。返回15數(shù)據(jù)類型的規(guī)約與實現(xiàn)數(shù)據(jù)類型的規(guī)約與實現(xiàn)n從語法表示來看,規(guī)約和實現(xiàn)大體上獨(dú)從語法表示來看,規(guī)約和實現(xiàn)大體上獨(dú)立于特定的語法形式。立于特定的語法形式。n屬性:表示為聲明或類型定義屬性:表示為聲

11、明或類型定義n值:表示為文字或定義的常量值:表示為文字或定義的常量n操作:可由特殊的符號、固有過程或函數(shù)、操作:可由特殊的符號、固有過程或函數(shù)、或隱含地通過其他語言元素的特殊組合來調(diào)或隱含地通過其他語言元素的特殊組合來調(diào)用。用。16基本(簡單)數(shù)據(jù)類型的規(guī)約基本(簡單)數(shù)據(jù)類型的規(guī)約n簡單數(shù)據(jù)對象包含單個數(shù)據(jù)值,這類數(shù)據(jù)對象簡單數(shù)據(jù)對象包含單個數(shù)據(jù)值,這類數(shù)據(jù)對象稱為基本數(shù)據(jù)類型。稱為基本數(shù)據(jù)類型。n雖然不同的語言有不同的基本類型集合,但整雖然不同的語言有不同的基本類型集合,但整數(shù)、實數(shù)、字符、布爾、枚舉、指針等基本都數(shù)、實數(shù)、字符、布爾、枚舉、指針等基本都是有的。但各自精確的規(guī)約對不同語言會

12、有差是有的。但各自精確的規(guī)約對不同語言會有差異。異。17簡單數(shù)據(jù)類型的規(guī)約:屬性簡單數(shù)據(jù)類型的規(guī)約:屬性n數(shù)據(jù)對象的基本屬性(如類型和名字)通常在數(shù)據(jù)對象的基本屬性(如類型和名字)通常在生命期中是不變的。生命期中是不變的。n有的屬性可存放在描述子中,作為數(shù)據(jù)對象的有的屬性可存放在描述子中,作為數(shù)據(jù)對象的一部分在運(yùn)行時出現(xiàn)。一部分在運(yùn)行時出現(xiàn)。n有的屬性只用于確定其存儲表示,在執(zhí)行中不有的屬性只用于確定其存儲表示,在執(zhí)行中不顯式地出現(xiàn)。顯式地出現(xiàn)。n屬性值和數(shù)據(jù)對象的值是不同的。屬性值和數(shù)據(jù)對象的值是不同的。18簡單數(shù)據(jù)類型的規(guī)約:值簡單數(shù)據(jù)類型的規(guī)約:值n數(shù)據(jù)對象的類型確定了它可包含的可能數(shù)據(jù)

13、對象的類型確定了它可包含的可能值集,但在執(zhí)行中任一點(diǎn),只包含一個值集,但在執(zhí)行中任一點(diǎn),只包含一個來自該集合的單值。來自該集合的單值。n基本數(shù)據(jù)類型定義的值集通常是有序集,基本數(shù)據(jù)類型定義的值集通常是有序集,有最小值和最大值。有最小值和最大值。19簡單數(shù)據(jù)類型的規(guī)約:操作簡單數(shù)據(jù)類型的規(guī)約:操作(1)n操作確定數(shù)據(jù)對象被處理的方式。操作確定數(shù)據(jù)對象被處理的方式。n操作可能是原始操作,也可是用戶定義操作。操作可能是原始操作,也可是用戶定義操作。n操作是一個數(shù)學(xué)函數(shù),對一給定輸入?yún)?shù),有操作是一個數(shù)學(xué)函數(shù),對一給定輸入?yún)?shù),有定義的、唯一確定的結(jié)果。每個操作有作用域、定義的、唯一確定的結(jié)果。每個操

14、作有作用域、值域。操作的動作定義了對給定參數(shù)的結(jié)果。值域。操作的動作定義了對給定參數(shù)的結(jié)果。n算法可用于刻劃操作的動作,但其他規(guī)約也是算法可用于刻劃操作的動作,但其他規(guī)約也是可以的。如可用乘法表來刻劃乘法的動作??梢缘?。如可用乘法表來刻劃乘法的動作。20簡單數(shù)據(jù)類型的規(guī)約:操作簡單數(shù)據(jù)類型的規(guī)約:操作(2)n操作的基調(diào)(操作的基調(diào)(signature)定義了操作的作用域中定義了操作的作用域中參數(shù)的數(shù)量、順序和類型,以及結(jié)果值域的順序和類參數(shù)的數(shù)量、順序和類型,以及結(jié)果值域的順序和類型。數(shù)學(xué)記號:型。數(shù)學(xué)記號:OP:type1type2typentype也稱為函數(shù)原形也稱為函數(shù)原形n操作有單元、

15、二元和多元。操作有單元、二元和多元。n動作的精確規(guī)約需要比參數(shù)類型更多的信息。動作的精確規(guī)約需要比參數(shù)類型更多的信息。n特別地,參數(shù)類型的存儲表示通常確定那些參數(shù)如何被操作,特別地,參數(shù)類型的存儲表示通常確定那些參數(shù)如何被操作,如:二進(jìn)制數(shù)的乘法和十進(jìn)制數(shù)的乘法有很大不同。如:二進(jìn)制數(shù)的乘法和十進(jìn)制數(shù)的乘法有很大不同。n這樣,在操作的規(guī)約中,常給出動作的非形式的描述。這樣,在操作的規(guī)約中,常給出動作的非形式的描述。n一旦參數(shù)的存儲表示確定,動作的精確規(guī)約是操作實一旦參數(shù)的存儲表示確定,動作的精確規(guī)約是操作實現(xiàn)的一部分。現(xiàn)的一部分。21簡單數(shù)據(jù)類型的規(guī)約:操作簡單數(shù)據(jù)類型的規(guī)約:操作(3)n有時

16、難于確定操作的精確規(guī)約為數(shù)學(xué)函數(shù),有有時難于確定操作的精確規(guī)約為數(shù)學(xué)函數(shù),有四個主要因素。四個主要因素。1、操作對某些輸入無定義。、操作對某些輸入無定義。2、隱含的參數(shù)、隱含的參數(shù)操作會訪問其他隱含參數(shù)(全局操作會訪問其他隱含參數(shù)(全局變量;非局部變量)。變量;非局部變量)。3、副作用(隱含結(jié)果)、副作用(隱含結(jié)果)可能修改其他數(shù)據(jù)對象??赡苄薷钠渌麛?shù)據(jù)對象。4、自我修改(歷史敏感性)、自我修改(歷史敏感性)操作修改自己的內(nèi)操作修改自己的內(nèi)部結(jié)構(gòu)、或是執(zhí)行中保持的局部數(shù)據(jù)、或是代碼。部結(jié)構(gòu)、或是執(zhí)行中保持的局部數(shù)據(jù)、或是代碼。n操作的結(jié)果還依賴于歷史調(diào)用。操作的結(jié)果還依賴于歷史調(diào)用。n例:隨機(jī)

17、數(shù)產(chǎn)生器。例:隨機(jī)數(shù)產(chǎn)生器。nLISP中可自我修改代碼。中可自我修改代碼。22基本數(shù)據(jù)類型的實現(xiàn)基本數(shù)據(jù)類型的實現(xiàn)n存儲表示存儲表示n基本類型的存儲受低層計算機(jī)的影響很大。基本類型的存儲受低層計算機(jī)的影響很大。n如:整數(shù)或?qū)崝?shù)幾乎就是在低層硬件中使用的數(shù)如:整數(shù)或?qū)崝?shù)幾乎就是在低層硬件中使用的數(shù)的整數(shù)或浮點(diǎn)數(shù)表示。的整數(shù)或浮點(diǎn)數(shù)表示。n對字符值,硬件或操作系統(tǒng)字符碼被使用。對字符值,硬件或操作系統(tǒng)字符碼被使用。n基本理由:基本理由:n如使用硬件存儲表示,則該類型數(shù)據(jù)基本操作可如使用硬件存儲表示,則該類型數(shù)據(jù)基本操作可以用硬件提供的基本操作實現(xiàn)。以用硬件提供的基本操作實現(xiàn)。n否則,將使用軟件仿真

18、,從而帶來效率損失。否則,將使用軟件仿真,從而帶來效率損失。 23基本數(shù)據(jù)類型的實現(xiàn)基本數(shù)據(jù)類型的實現(xiàn)n基本數(shù)據(jù)類型的屬性被類似地處理?;緮?shù)據(jù)類型的屬性被類似地處理。1、為了效率,很多語言設(shè)計為屬性由編譯器確定。、為了效率,很多語言設(shè)計為屬性由編譯器確定。n屬性本身并不存放在運(yùn)行時存儲表示中屬性本身并不存放在運(yùn)行時存儲表示中存儲表示通常直接使存儲表示通常直接使用硬件,如:用硬件,如:C、Fortran、Pascal等。等。2、數(shù)據(jù)對象的屬性可存放在描述子中作為運(yùn)行時數(shù)據(jù)對象的一、數(shù)據(jù)對象的屬性可存放在描述子中作為運(yùn)行時數(shù)據(jù)對象的一部分,如:部分,如:LISP、Prolog等,這里靈活性是主要

19、目標(biāo)。通常等,這里靈活性是主要目標(biāo)。通常硬件不提供對描述子的直接表示。硬件不提供對描述子的直接表示。n數(shù)據(jù)對象的表示通常獨(dú)立于存儲位置,這樣給定類型數(shù)據(jù)對象的表示通常獨(dú)立于存儲位置,這樣給定類型的每個對象有相同的表示(除位置不同),通常用需的每個對象有相同的表示(除位置不同),通常用需要的內(nèi)存塊的尺寸(大?。﹣砻枋?,同時也涉及屬性要的內(nèi)存塊的尺寸(大?。﹣砻枋?,同時也涉及屬性和值在塊中的布局。和值在塊中的布局。n通常內(nèi)存塊的每一個字或字節(jié)的地址用于表示數(shù)據(jù)對通常內(nèi)存塊的每一個字或字節(jié)的地址用于表示數(shù)據(jù)對象的位置。象的位置。24基本數(shù)據(jù)類型的實現(xiàn)基本數(shù)據(jù)類型的實現(xiàn)n操作的實現(xiàn)操作的實現(xiàn)1、直接作

20、為硬件操作、直接作為硬件操作n如:整數(shù)表示為硬件整數(shù),如:整數(shù)表示為硬件整數(shù),+,也直接用硬件實現(xiàn)。,也直接用硬件實現(xiàn)。2、作為過程或函數(shù)子程序、作為過程或函數(shù)子程序n如:平方根操作。如:平方根操作。n如數(shù)據(jù)對象不使用硬件表示,則所有操作必須是軟件仿真,如數(shù)據(jù)對象不使用硬件表示,則所有操作必須是軟件仿真,通常以子程序的形式。通常以子程序的形式。3、作為、作為In-line(內(nèi)嵌)代碼序列。(內(nèi)嵌)代碼序列。n這也是操作的軟件實現(xiàn)形式,但不是使用短小的子程序,這也是操作的軟件實現(xiàn)形式,但不是使用短小的子程序,而是將子程序中操作代碼拷貝到程序中的調(diào)用點(diǎn)。而是將子程序中操作代碼拷貝到程序中的調(diào)用點(diǎn)。

21、返回25數(shù)據(jù)對象的聲明數(shù)據(jù)對象的聲明n編寫程序時,程序員確定數(shù)據(jù)對象的名字和類編寫程序時,程序員確定數(shù)據(jù)對象的名字和類型。還要確定:生命期、在程序中的活動范圍、型。還要確定:生命期、在程序中的活動范圍、相關(guān)操作等。相關(guān)操作等。n聲明:一種程序語句,告知語言翻譯器關(guān)于數(shù)聲明:一種程序語句,告知語言翻譯器關(guān)于數(shù)據(jù)對象的信息。據(jù)對象的信息。n如聲明語句放在特定的程序或類定義中,則指明了如聲明語句放在特定的程序或類定義中,則指明了對象希望的生命期。對象希望的生命期。n聲明可以是顯式的,也可以是隱含的或缺省的。聲明可以是顯式的,也可以是隱含的或缺省的。聲明可以為數(shù)據(jù)對象賦上初始值,也可指定常聲明可以為數(shù)

22、據(jù)對象賦上初始值,也可指定常量值。量值。26數(shù)據(jù)對象的聲明數(shù)據(jù)對象的聲明n操作的聲明操作的聲明n翻譯時需要的關(guān)于操作的信息,主要是其基翻譯時需要的關(guān)于操作的信息,主要是其基調(diào)調(diào)signature。n對基本操作,不需顯式的參數(shù)類型和結(jié)果類對基本操作,不需顯式的參數(shù)類型和結(jié)果類型聲明,是語言中固有的。型聲明,是語言中固有的。n對程序員定義的操作,則必須指定之。對程序員定義的操作,則必須指定之。n如:如:sub: intfloatfloat = float Sub (int x,float y) 27聲明的目的聲明的目的1、選擇存儲表示、選擇存儲表示n聲明可以給語言翻譯器提供關(guān)于數(shù)據(jù)類型和數(shù)據(jù)對象屬

23、性的聲明可以給語言翻譯器提供關(guān)于數(shù)據(jù)類型和數(shù)據(jù)對象屬性的信息,使得翻譯器可以確定數(shù)據(jù)對象的最佳的存儲表示,從信息,使得翻譯器可以確定數(shù)據(jù)對象的最佳的存儲表示,從而減少整體的存儲需求和被翻譯程序的執(zhí)行時間。而減少整體的存儲需求和被翻譯程序的執(zhí)行時間。2、存儲管理、存儲管理聲明使其更為高效聲明使其更為高效n聲明可以提供關(guān)于數(shù)據(jù)對象生命期的信息,從而使得在程序聲明可以提供關(guān)于數(shù)據(jù)對象生命期的信息,從而使得在程序執(zhí)行過程中進(jìn)行更高效的存儲管理。執(zhí)行過程中進(jìn)行更高效的存儲管理。n如:在如:在C語言中,在子程序頭部聲明的數(shù)據(jù)對象有相同的生命語言中,在子程序頭部聲明的數(shù)據(jù)對象有相同的生命期,這樣可以在進(jìn)入子

24、程序時分配一個整體的塊來存放所有期,這樣可以在進(jìn)入子程序時分配一個整體的塊來存放所有的數(shù)據(jù)對象,而在退出子程序時釋放。的數(shù)據(jù)對象,而在退出子程序時釋放。n其它動態(tài)創(chuàng)建的數(shù)據(jù)對象則需單獨(dú)處理。其它動態(tài)創(chuàng)建的數(shù)據(jù)對象則需單獨(dú)處理。28聲明的目的聲明的目的3、多態(tài)操作、多態(tài)操作包括重載和真正多態(tài)包括重載和真正多態(tài)n大多數(shù)語言均使用特殊的符號來表示一組不同的操作,具體大多數(shù)語言均使用特殊的符號來表示一組不同的操作,具體操作的選擇將依賴于參數(shù)的數(shù)據(jù)類型。此即所謂重載。如:操作的選擇將依賴于參數(shù)的數(shù)據(jù)類型。此即所謂重載。如:可以是整數(shù)加、實數(shù)加,甚至可用于字符和字符串操作??梢允钦麛?shù)加、實數(shù)加,甚至可用于

25、字符和字符串操作。n重載是一個在語法層次上處理的概念。由編譯器處理。重載是一個在語法層次上處理的概念。由編譯器處理。n真正的多態(tài)通常是語義級別的概念,操作符的具體動作的確真正的多態(tài)通常是語義級別的概念,操作符的具體動作的確定是在運(yùn)行時進(jìn)行。如:函數(shù)語言中,類型可以作為參數(shù)帶定是在運(yùn)行時進(jìn)行。如:函數(shù)語言中,類型可以作為參數(shù)帶入,從而使函數(shù)的動作的選擇依據(jù)類型實參而確定。恒等函入,從而使函數(shù)的動作的選擇依據(jù)類型實參而確定。恒等函數(shù)就是典型的多態(tài)。數(shù)就是典型的多態(tài)。n面向?qū)ο蟮睦^承機(jī)制也提供了所謂的包含多態(tài)性,即子類的面向?qū)ο蟮睦^承機(jī)制也提供了所謂的包含多態(tài)性,即子類的對象可用于父類對象出現(xiàn)的地方

26、。對象可用于父類對象出現(xiàn)的地方。4、類型檢查、類型檢查最重要的目標(biāo),屬語義檢查,目標(biāo)是排最重要的目標(biāo),屬語義檢查,目標(biāo)是排錯,分靜態(tài)或動態(tài)類型檢查。類型檢查提供了很好的錯,分靜態(tài)或動態(tài)類型檢查。類型檢查提供了很好的防止錯誤的機(jī)制。防止錯誤的機(jī)制。返回29類型檢查和類型轉(zhuǎn)換類型檢查和類型轉(zhuǎn)換n計算機(jī)硬件固有的數(shù)據(jù)存儲表示通常不含類型信息。計算機(jī)硬件固有的數(shù)據(jù)存儲表示通常不含類型信息。數(shù)據(jù)上的基本原始操作也不需類型檢查。如一個位串:數(shù)據(jù)上的基本原始操作也不需類型檢查。如一個位串:1110010011n可能是整數(shù)、實數(shù)、字符串、或指令,沒有辦法來區(qū)可能是整數(shù)、實數(shù)、字符串、或指令,沒有辦法來區(qū)分。分

27、。n硬件提供的基本操作(如加法),不能檢查其參數(shù)是硬件提供的基本操作(如加法),不能檢查其參數(shù)是否為整數(shù),他們僅僅是位串。否為整數(shù),他們僅僅是位串。n匯編語言或機(jī)器語言編程中常見的錯誤源于錯誤的操匯編語言或機(jī)器語言編程中常見的錯誤源于錯誤的操作類型,這種錯誤難于發(fā)現(xiàn),因為操作并不以明顯的作類型,這種錯誤難于發(fā)現(xiàn),因為操作并不以明顯的方式失敗。操作可進(jìn)行,但結(jié)果沒有意義。方式失敗。操作可進(jìn)行,但結(jié)果沒有意義。n有時這種錯誤可在連續(xù)的一串操作后出錯,有時程序停止也有時這種錯誤可在連續(xù)的一串操作后出錯,有時程序停止也不出錯。不出錯。30類型檢查類型檢查n類型檢查:指檢查程序中每個操作均接類型檢查:指

28、檢查程序中每個操作均接收了正確數(shù)目的正確類型參數(shù),可在運(yùn)收了正確數(shù)目的正確類型參數(shù),可在運(yùn)行時完成,即動態(tài)類型檢查;或編譯時行時完成,即動態(tài)類型檢查;或編譯時檢查,即靜態(tài)類型檢查。檢查,即靜態(tài)類型檢查。 n高級語言的主要優(yōu)點(diǎn)之一:可提供對所高級語言的主要優(yōu)點(diǎn)之一:可提供對所有(或幾乎所有)操作的類型檢查。有(或幾乎所有)操作的類型檢查。31動態(tài)類型檢查動態(tài)類型檢查n需類型標(biāo)志,不需對變量聲明(即變量需類型標(biāo)志,不需對變量聲明(即變量是無類型的)。是無類型的)。n優(yōu)點(diǎn):編程的靈活性。程序員不需考慮類型優(yōu)點(diǎn):編程的靈活性。程序員不需考慮類型問題,具有較高靈活性。問題,具有較高靈活性。n缺點(diǎn):缺點(diǎn):

29、n程序難于調(diào)試,不能完全消去所有參數(shù)類型錯誤。程序難于調(diào)試,不能完全消去所有參數(shù)類型錯誤。程序測試不可能檢測所有的路徑。程序測試不可能檢測所有的路徑。n需要在執(zhí)行過程中保持類型信息,需存儲空間。需要在執(zhí)行過程中保持類型信息,需存儲空間。n動態(tài)檢查需以軟件實現(xiàn),有時間花銷。動態(tài)檢查需以軟件實現(xiàn),有時間花銷。32靜態(tài)類型檢查靜態(tài)類型檢查n需要的信息通常由程序員在聲明中及在其他語需要的信息通常由程序員在聲明中及在其他語言結(jié)構(gòu)中提供。需要:言結(jié)構(gòu)中提供。需要:1、對每個操作,其參數(shù)的數(shù)量、順序、類型及結(jié)果、對每個操作,其參數(shù)的數(shù)量、順序、類型及結(jié)果類型。類型。2、對每個變量,被關(guān)聯(lián)的命名數(shù)據(jù)對象的類型

30、。、對每個變量,被關(guān)聯(lián)的命名數(shù)據(jù)對象的類型。3、每個常量數(shù)據(jù)對象的類型。、每個常量數(shù)據(jù)對象的類型。n編譯器在翻譯的早期階段收集聲明中的類型信編譯器在翻譯的早期階段收集聲明中的類型信息,以后將用于類型檢查。息,以后將用于類型檢查。n靜態(tài)檢查涉及語言的多個方面:聲明、數(shù)據(jù)控靜態(tài)檢查涉及語言的多個方面:聲明、數(shù)據(jù)控制結(jié)構(gòu)、分開編譯等。制結(jié)構(gòu)、分開編譯等。33靜態(tài)與動態(tài)類型檢查靜態(tài)與動態(tài)類型檢查n靜態(tài)檢查將針對程序中的所有操作進(jìn)行,所有靜態(tài)檢查將針對程序中的所有操作進(jìn)行,所有可能的執(zhí)行路徑均被檢查。因此,關(guān)于類型錯可能的執(zhí)行路徑均被檢查。因此,關(guān)于類型錯誤的進(jìn)一步測試是不需要的,因而不需類型標(biāo)誤的進(jìn)一

31、步測試是不需要的,因而不需類型標(biāo)記和運(yùn)行時類型檢查。記和運(yùn)行時類型檢查。n在多數(shù)語言中,對某些語言結(jié)構(gòu)的靜態(tài)檢查在在多數(shù)語言中,對某些語言結(jié)構(gòu)的靜態(tài)檢查在某種情況下是不可能的。解決方案:某種情況下是不可能的。解決方案:n采用動態(tài)類型檢查或不檢查。采用動態(tài)類型檢查或不檢查。 34類型檢查類型檢查n強(qiáng)類型強(qiáng)類型n如果我們可以靜態(tài)地檢測程序中的所有類型錯誤,如果我們可以靜態(tài)地檢測程序中的所有類型錯誤,則稱語言是強(qiáng)賦類型的。則稱語言是強(qiáng)賦類型的。n通常類型為程序提供了一個安全層次。通常類型為程序提供了一個安全層次。n一個函數(shù)一個函數(shù)f: SR稱為類型安全的,如果稱為類型安全的,如果f的執(zhí)行不會產(chǎn)生的執(zhí)

32、行不會產(chǎn)生R以外的值。以外的值。n類型安全的操作均不需動態(tài)檢查。類型安全的操作均不需動態(tài)檢查。n很少有語言是真正強(qiáng)類型的。很少有語言是真正強(qiáng)類型的。n類型推導(dǎo)類型推導(dǎo)n如果解釋不會出現(xiàn)二義性,則類型聲明可以省去。如果解釋不會出現(xiàn)二義性,則類型聲明可以省去??捎烧Z言實現(xiàn)推導(dǎo)出失去的類型信息??捎烧Z言實現(xiàn)推導(dǎo)出失去的類型信息。 35類型轉(zhuǎn)換和類型的強(qiáng)制轉(zhuǎn)換類型轉(zhuǎn)換和類型的強(qiáng)制轉(zhuǎn)換n如果在類型檢查中,參數(shù)的實際類型和操作期望的類如果在類型檢查中,參數(shù)的實際類型和操作期望的類型間出現(xiàn)不匹配,則有兩種處理方案:型間出現(xiàn)不匹配,則有兩種處理方案:1、指出出錯、指出出錯2、通過強(qiáng)制(隱式的類型轉(zhuǎn)換)來改變實

33、際參數(shù)的類型為正確、通過強(qiáng)制(隱式的類型轉(zhuǎn)換)來改變實際參數(shù)的類型為正確類型。類型。n類型轉(zhuǎn)換的基調(diào)為:類型轉(zhuǎn)換的基調(diào)為:nconversion-op : type1type2n將一個對象變?yōu)榱硪活愋偷膶ο?。將一個對象變?yōu)榱硪活愋偷膶ο?。n大多數(shù)語言以兩種方式提供類型轉(zhuǎn)換:大多數(shù)語言以兩種方式提供類型轉(zhuǎn)換:1、作為固有函數(shù),程序員可顯式地調(diào)用。、作為固有函數(shù),程序員可顯式地調(diào)用。n如:將實數(shù)變成整數(shù),如:將實數(shù)變成整數(shù),Pascal中的中的round,C中的中的(int) x2、作為強(qiáng)制,自動在類型失配時調(diào)用。、作為強(qiáng)制,自動在類型失配時調(diào)用。n如:整數(shù)和實數(shù)間相加,總是先將整數(shù)轉(zhuǎn)變?yōu)閷崝?shù)。如

34、:整數(shù)和實數(shù)間相加,總是先將整數(shù)轉(zhuǎn)變?yōu)閷崝?shù)。36類型轉(zhuǎn)換和類型的強(qiáng)制轉(zhuǎn)換類型轉(zhuǎn)換和類型的強(qiáng)制轉(zhuǎn)換n強(qiáng)制的基本原則是不失信息。強(qiáng)制的基本原則是不失信息。n這類強(qiáng)制稱為這類強(qiáng)制稱為widening或或promotion。n如強(qiáng)制會丟失信息,則稱為變窄(如強(qiáng)制會丟失信息,則稱為變窄(narrowing)n類型轉(zhuǎn)換可能需要數(shù)據(jù)對象在運(yùn)行時存儲表示的改類型轉(zhuǎn)換可能需要數(shù)據(jù)對象在運(yùn)行時存儲表示的改變,如:變,如:COBOL和和PL/1中,數(shù)值以字符串方式存中,數(shù)值以字符串方式存放,要相加需先轉(zhuǎn)換,結(jié)果又要轉(zhuǎn)換為字符串。放,要相加需先轉(zhuǎn)換,結(jié)果又要轉(zhuǎn)換為字符串。n有的語言中不提供類型強(qiáng)制,類型不匹配即被視為

35、有的語言中不提供類型強(qiáng)制,類型不匹配即被視為出錯。出錯。n而有的語言則盡可能在不匹配時采用強(qiáng)制(如而有的語言則盡可能在不匹配時采用強(qiáng)制(如C)。)。返回37賦值和初始化賦值和初始化n賦值是一基本操作,改變值到數(shù)據(jù)對象的綁定,賦值是一基本操作,改變值到數(shù)據(jù)對象的綁定,這個改變是操作的副作用。這個改變是操作的副作用。n有的語言中,賦值語句也返回值(作為表達(dá)式有的語言中,賦值語句也返回值(作為表達(dá)式處理),該返回值包含被賦值拷貝的數(shù)據(jù)對象。處理),該返回值包含被賦值拷貝的數(shù)據(jù)對象。nPascal中,賦值的規(guī)約為:中,賦值的規(guī)約為:Assignment (:=) : integer1integer2v

36、oid.ninteger2值賦給值賦給integer1無顯式返回。無顯式返回。nC中,規(guī)約為:中,規(guī)約為:Assignment (=) : integer1integer2integer3ninteger2值的拷貝賦給值的拷貝賦給integer1,n同時創(chuàng)建并返回包含同時創(chuàng)建并返回包含integer2值的新數(shù)據(jù)對象值的新數(shù)據(jù)對象integer3.38賦值賦值n考慮賦值考慮賦值 X := Xn右邊的右邊的X稱右端值,用于引用包含在命名數(shù)據(jù)對象稱右端值,用于引用包含在命名數(shù)據(jù)對象中的值,中的值,r-值。值。n左邊的左邊的X用于引用將包含新值的數(shù)據(jù)對象的位置,用于引用將包含新值的數(shù)據(jù)對象的位置,稱為

37、左值,稱為左值,l-值。值。n賦值操作定義為:賦值操作定義為:1、計算第一個操作數(shù)表達(dá)式的左值(存儲位置)。、計算第一個操作數(shù)表達(dá)式的左值(存儲位置)。2、計算第二個操作數(shù)表達(dá)式的右值。、計算第二個操作數(shù)表達(dá)式的右值。3、將右值賦給左值對象。、將右值賦給左值對象。4、返回右值作為操作的結(jié)果。、返回右值作為操作的結(jié)果。39賦值賦值n賦賦值值的的兩兩個個不不同同視視角角(A=B)40初始化初始化n未初始化變量(或未初始化數(shù)據(jù)對象)是一個數(shù)據(jù)對未初始化變量(或未初始化數(shù)據(jù)對象)是一個數(shù)據(jù)對象,已被創(chuàng)建,但未賦值,即有象,已被創(chuàng)建,但未賦值,即有l(wèi)-值,但沒有值,但沒有r-值。值。n創(chuàng)建對象僅涉及存儲

38、塊的分配,塊中原有位模式不會創(chuàng)建對象僅涉及存儲塊的分配,塊中原有位模式不會改變。改變。n有的語言創(chuàng)建時不需初始化,初始化是在以后顯式地有的語言創(chuàng)建時不需初始化,初始化是在以后顯式地通過賦值進(jìn)行的。也可以在變量聲明時進(jìn)行顯式的初通過賦值進(jìn)行的。也可以在變量聲明時進(jìn)行顯式的初始化工作,此時,需要編譯器產(chǎn)生相應(yīng)的賦值代碼并始化工作,此時,需要編譯器產(chǎn)生相應(yīng)的賦值代碼并插入到目標(biāo)程序中。插入到目標(biāo)程序中。n在變量聲明后立即進(jìn)行初始化工作是程序員應(yīng)有的良在變量聲明后立即進(jìn)行初始化工作是程序員應(yīng)有的良好習(xí)慣之一。好習(xí)慣之一。n有的語言,創(chuàng)建時自動初始化(隱式初始化)。有的語言,創(chuàng)建時自動初始化(隱式初始化

39、)。n未初始化變量是程序錯誤的重要原因之一。未初始化變量是程序錯誤的重要原因之一。返回415.2 基本數(shù)據(jù)類型基本數(shù)據(jù)類型 n整數(shù)整數(shù)n浮點(diǎn)實數(shù)浮點(diǎn)實數(shù)n定點(diǎn)實數(shù)定點(diǎn)實數(shù)n枚舉枚舉n布爾布爾42數(shù)值數(shù)據(jù)類型:整數(shù)數(shù)值數(shù)據(jù)類型:整數(shù)n規(guī)約:整數(shù)類型的對象除了其類型外,通常沒規(guī)約:整數(shù)類型的對象除了其類型外,通常沒有其它屬性。該類型的整數(shù)值的集合形成了數(shù)有其它屬性。該類型的整數(shù)值的集合形成了數(shù)學(xué)中研究的無限整數(shù)集的一個在有限界內(nèi)的有學(xué)中研究的無限整數(shù)集的一個在有限界內(nèi)的有序子集。序子集。n最大整數(shù)值有時被表示為一個定義的常量,如:最大整數(shù)值有時被表示為一個定義的常量,如:PASCAL中的中的max

40、int,其實際值由語言實現(xiàn),其實際值由語言實現(xiàn)者根據(jù)具體的計算機(jī)硬件確定。者根據(jù)具體的計算機(jī)硬件確定。nC語言有四種不同的整數(shù)規(guī)約:語言有四種不同的整數(shù)規(guī)約:int、short、long、char。43數(shù)值數(shù)據(jù)類型:整數(shù)(操作)數(shù)值數(shù)據(jù)類型:整數(shù)(操作)n整數(shù)數(shù)據(jù)對象上的操作:整數(shù)數(shù)據(jù)對象上的操作:n算術(shù)操作:二元算術(shù)操作的規(guī)約為:算術(shù)操作:二元算術(shù)操作的規(guī)約為:nBinOp : integer integer integern二元操作包括:、二元操作包括:、/、mod等。等。n一元算術(shù)操作的規(guī)約為:一元算術(shù)操作的規(guī)約為:UnaryOp : integer integern一元操作有:、以及其

41、它,如:絕對值。一元操作有:、以及其它,如:絕對值。44數(shù)值數(shù)據(jù)類型:整數(shù)(操作)數(shù)值數(shù)據(jù)類型:整數(shù)(操作)n關(guān)系操作:關(guān)系操作: nRelOp : integer integer Booleann關(guān)系操作有:大于、小于、相等、不等、等等關(guān)系操作有:大于、小于、相等、不等、等等n賦值:賦值:nassignment : integer integer voidnassignment : integer integer integern位操作:也分二元和一元。如:位操作:也分二元和一元。如:&、|、 realMax: real real real47數(shù)值數(shù)據(jù)類型:浮點(diǎn)實數(shù)數(shù)值數(shù)據(jù)類型:浮點(diǎn)

42、實數(shù)(實現(xiàn)實現(xiàn))n浮點(diǎn)實數(shù)的存儲表示通常基于底層的硬件表示,浮點(diǎn)實數(shù)的存儲表示通?;诘讓拥挠布硎?,其中存儲位置被分為尾數(shù)和指數(shù)。在大多數(shù)語其中存儲位置被分為尾數(shù)和指數(shù)。在大多數(shù)語言實現(xiàn),言實現(xiàn),IEEE 標(biāo)準(zhǔn)標(biāo)準(zhǔn)754被用為浮點(diǎn)數(shù)定義的被用為浮點(diǎn)數(shù)定義的標(biāo)準(zhǔn)。標(biāo)準(zhǔn)。n有單精度和雙精度浮點(diǎn)數(shù)之分。二者通常由硬有單精度和雙精度浮點(diǎn)數(shù)之分。二者通常由硬件算術(shù)操作支持其加、減、乘、除,而求冪操件算術(shù)操作支持其加、減、乘、除,而求冪操作通常由軟件仿真。作通常由軟件仿真。n如果同時支持單精度和雙精度,則必須給予程如果同時支持單精度和雙精度,則必須給予程序員相應(yīng)的聲明機(jī)制。序員相應(yīng)的聲明機(jī)制。返回48數(shù)

43、值數(shù)據(jù)類型:定點(diǎn)實數(shù)數(shù)值數(shù)據(jù)類型:定點(diǎn)實數(shù)(規(guī)約規(guī)約)n大多數(shù)硬件包含了整數(shù)和浮點(diǎn)數(shù)對象,然而,大多數(shù)硬件包含了整數(shù)和浮點(diǎn)數(shù)對象,然而,有很多應(yīng)用需要特定的有理數(shù),如:表示錢的有很多應(yīng)用需要特定的有理數(shù),如:表示錢的元和分的數(shù)據(jù)對象。這些數(shù)不能寫成整數(shù)或浮元和分的數(shù)據(jù)對象。這些數(shù)不能寫成整數(shù)或浮點(diǎn)數(shù)。因此,需要定點(diǎn)數(shù)。點(diǎn)數(shù)。因此,需要定點(diǎn)數(shù)。n定點(diǎn)數(shù)表示為固定長度的數(shù)位,在給定位置為定點(diǎn)數(shù)表示為固定長度的數(shù)位,在給定位置為小數(shù)點(diǎn)。如,小數(shù)點(diǎn)。如,COBOL語言中,有如下聲明:語言中,有如下聲明:X PICTURE 999V9949數(shù)值數(shù)據(jù)類型:定點(diǎn)實數(shù)數(shù)值數(shù)據(jù)類型:定點(diǎn)實數(shù)(實現(xiàn)實現(xiàn))n定點(diǎn)實

44、數(shù)可直接由硬件支持或用軟件仿真。如定點(diǎn)實數(shù)可直接由硬件支持或用軟件仿真。如PL/1中,中,DECLARE X FIXED DECIMAL(10,3),), Y FIXED DECIMAL(10,2),), Z FIXED DECIMAL(10,2););nX為帶為帶3個小數(shù)位的十位十進(jìn)制數(shù),個小數(shù)位的十位十進(jìn)制數(shù),Y和和Z有兩個小數(shù)位。有兩個小數(shù)位。X的的比例因子比例因子SF為為3,Y和和Z為為2。nvalue(X) = rvalue(X) 10-SFn即,即,X值為值為103.421,其右值為,其右值為103421。n考慮語句:考慮語句:Z X Yn實際加法的代碼為:實際加法的代碼為:Z (

45、X 10Y)/ 10n考慮考慮X Y,則:,則:n積積 rvalue(X) rvalue(Y)nSF = SF(X) + SF(Y),SF為小數(shù)點(diǎn)位置為小數(shù)點(diǎn)位置50數(shù)值數(shù)據(jù)類型:實數(shù)的不同表示數(shù)值數(shù)據(jù)類型:實數(shù)的不同表示n實實數(shù)數(shù)1.5的的不不同同表表示示返回51基本數(shù)據(jù)類型:枚舉類型基本數(shù)據(jù)類型:枚舉類型n我們通常希望一個變量只在一組符號值中選一我們通常希望一個變量只在一組符號值中選一值。如:變量值。如:變量StudentClass只有四種可能值:只有四種可能值:freshman, sophomore, junior, 和和senior。當(dāng)然,可以用整數(shù)來代表這四者,但必須由程當(dāng)然,可以用

46、整數(shù)來代表這四者,但必須由程序員來維護(hù)這類變量的操作安全性及使用的類序員來維護(hù)這類變量的操作安全性及使用的類型正確性。型正確性。n規(guī)約:枚舉是一個不同值的有序列表,由程序規(guī)約:枚舉是一個不同值的有序列表,由程序員確定其文字名及它們的順序。如員確定其文字名及它們的順序。如C中:中:Emun StudentClass Fresh, Soph, Junior, Senior;Emun EmploySex Male, Female;52基本數(shù)據(jù)類型:枚舉類型基本數(shù)據(jù)類型:枚舉類型(實現(xiàn)實現(xiàn))n枚舉類型的基本操作為關(guān)系操作、賦值,枚舉類型的基本操作為關(guān)系操作、賦值,以及后繼和前驅(qū)。以及后繼和前驅(qū)。n實現(xiàn)

47、:枚舉類型數(shù)據(jù)對象的存儲表示是實現(xiàn):枚舉類型數(shù)據(jù)對象的存儲表示是直接的,在枚舉序列中的每個值在運(yùn)行直接的,在枚舉序列中的每個值在運(yùn)行時被表示為整數(shù),通常為時被表示為整數(shù),通常為0、1、2、之一。有的語言也可由程序員指定值。之一。有的語言也可由程序員指定值。枚舉類型上的操作的實現(xiàn)也是直接的,枚舉類型上的操作的實現(xiàn)也是直接的,直接使用硬件提供的基本操作。直接使用硬件提供的基本操作。返回53基本數(shù)據(jù)類型:布爾類型基本數(shù)據(jù)類型:布爾類型n大多數(shù)語言提供數(shù)據(jù)類型表示大多數(shù)語言提供數(shù)據(jù)類型表示true和和false,通常稱為布爾或邏輯類型。通常稱為布爾或邏輯類型。n規(guī)約:布爾類型的數(shù)據(jù)對象取二值之一。在某

48、規(guī)約:布爾類型的數(shù)據(jù)對象取二值之一。在某些語言中,可將其考慮為語言定義的枚舉類型。些語言中,可將其考慮為語言定義的枚舉類型。Type Boolean = (false, true);n其順序為其順序為false true。n布爾類型對象上的操作為一般的邏輯操作。布爾類型對象上的操作為一般的邏輯操作。54基本數(shù)據(jù)類型:布爾類型基本數(shù)據(jù)類型:布爾類型(實現(xiàn)實現(xiàn))n實現(xiàn):布爾數(shù)據(jù)對象的存儲表示是一個實現(xiàn):布爾數(shù)據(jù)對象的存儲表示是一個二進(jìn)制位。通常,為了可以直接訪問,二進(jìn)制位。通常,為了可以直接訪問,而表示為單個可編址單元。而表示為單個可編址單元。n用一個特殊位來表示,用一個特殊位來表示,0為假,為假

49、,1為真。為真。n或者,或者,0為假,其余非零值為真。為假,其余非零值為真。n也有其它數(shù)據(jù)類型可用于布爾型的表示,也有其它數(shù)據(jù)類型可用于布爾型的表示,而而C中沒有布爾型。中沒有布爾型。返回555.3 復(fù)合數(shù)據(jù)類型復(fù)合數(shù)據(jù)類型n字符串字符串n指針指針n文件文件56字符串字符串n字符串是一個字符構(gòu)成的序列。幾乎所字符串是一個字符構(gòu)成的序列。幾乎所有的語言均有字符串類型。有的語言均有字符串類型。n規(guī)約和語法:至少有三種不同的字符串規(guī)約和語法:至少有三種不同的字符串類型處理方式:類型處理方式:1、固定聲明長度。在程序中聲明字符串對象、固定聲明長度。在程序中聲明字符串對象的固定長度。賦給該對象的值總是該

50、長度的的固定長度。賦給該對象的值總是該長度的字符串。新串值賦給該數(shù)據(jù)對象將導(dǎo)致長度字符串。新串值賦給該數(shù)據(jù)對象將導(dǎo)致長度調(diào)整:減短或補(bǔ)足。調(diào)整:減短或補(bǔ)足。PASCAL和和COBOL中中常采用此技術(shù)。常采用此技術(shù)。57字符串字符串2、有界變長。字符串?dāng)?shù)據(jù)對象具有固定的最大長度,、有界變長。字符串?dāng)?shù)據(jù)對象具有固定的最大長度,但實際的字符串值長度可以小于此,甚至是空串。但實際的字符串值長度可以小于此,甚至是空串。執(zhí)行過程中,字符串長度會發(fā)生變化,但超長時需執(zhí)行過程中,字符串長度會發(fā)生變化,但超長時需減短。減短。3、無界長度。字符串?dāng)?shù)據(jù)對象可以具有任意長度,、無界長度。字符串?dāng)?shù)據(jù)對象可以具有任意長度

51、,而且長度可以在執(zhí)行過程中動態(tài)地?zé)o界變化。而且長度可以在執(zhí)行過程中動態(tài)地?zé)o界變化。n前兩種方法允許翻譯時確定每個字符串?dāng)?shù)據(jù)對前兩種方法允許翻譯時確定每個字符串?dāng)?shù)據(jù)對象的存儲分配。第三種方法需要存儲的運(yùn)行時象的存儲分配。第三種方法需要存儲的運(yùn)行時動態(tài)分配。動態(tài)分配。58字符串:操作字符串:操作(1)1、串聯(lián)、串聯(lián)n將兩個字符串連接在一起以形成一個長串。如:將兩個字符串連接在一起以形成一個長串。如:“BLOCK”|“HEAD”產(chǎn)生產(chǎn)生“BLOCKHEAD”。2、串上的關(guān)系操作、串上的關(guān)系操作n包括一般的相等、大于、小于等均可用于字符串。包括一般的相等、大于、小于等均可用于字符串。由于字符本身是有序

52、的,因此可以擴(kuò)展形成字符串由于字符本身是有序的,因此可以擴(kuò)展形成字符串的字典序。的字典序。3、使用定位下標(biāo)的子串選擇、使用定位下標(biāo)的子串選擇n很多語言提供了選擇子串的操作。如:很多語言提供了選擇子串的操作。如:FORTRAN中,中,NEXT STR (6:10)將將STR中從位置中從位置6到到10的的5個字符賦給個字符賦給NEXT。如果允許子串選擇出現(xiàn)在賦。如果允許子串選擇出現(xiàn)在賦值的兩邊,則其語義必須仔細(xì)定義。值的兩邊,則其語義必須仔細(xì)定義。59字符串:操作字符串:操作(2)4、I/O格式格式n程序設(shè)計語言中提供的某些字符串操作常常程序設(shè)計語言中提供的某些字符串操作常常是為了幫助輸出數(shù)據(jù)的格

53、式化或?qū)⒏袷交氖菫榱藥椭敵鰯?shù)據(jù)的格式化或?qū)⒏袷交妮斎肓鞣纸绯尚〉臄?shù)據(jù)單元。如:輸入流分界成小的數(shù)據(jù)單元。如:C和和FORTRAN中的格式化中的格式化I/O特性。特性。5、使用模式匹配的子串選擇、使用模式匹配的子串選擇n由于不知道子串在大串中的位置,模式匹配由于不知道子串在大串中的位置,模式匹配則成為一種重要的方法。如:則成為一種重要的方法。如:SNOBOL4就就提供了強(qiáng)大的模式匹配操作。提供了強(qiáng)大的模式匹配操作。60字符串:實現(xiàn)字符串:實現(xiàn)n三種不同的方法使用不同的存儲表示。對固定三種不同的方法使用不同的存儲表示。對固定長度的字符串操作可以有硬件支持。其它方式長度的字符串操作可以有硬件支

54、持。其它方式則需要軟件仿真。則需要軟件仿真。返回61指針指針n通常,不是引入一系列可變長的鏈接數(shù)據(jù)對象類型,通常,不是引入一系列可變長的鏈接數(shù)據(jù)對象類型,而是提供設(shè)施來允許使用指針將數(shù)據(jù)對象鏈接在一起而是提供設(shè)施來允許使用指針將數(shù)據(jù)對象鏈接在一起而形成某種結(jié)構(gòu),這樣需要如下幾個語言特性:而形成某種結(jié)構(gòu),這樣需要如下幾個語言特性:1、基本數(shù)據(jù)類型指針(、基本數(shù)據(jù)類型指針(pointer),也稱引用或訪),也稱引用或訪問類型。問類型。n指針對象包含另一個數(shù)據(jù)對象的位置(左值),空指針為指針對象包含另一個數(shù)據(jù)對象的位置(左值),空指針為nil或或null。2、定長數(shù)據(jù)對象的創(chuàng)建操作、定長數(shù)據(jù)對象的創(chuàng)

55、建操作n創(chuàng)建操作分配一個存儲塊,并返回其左值,可用于存放對創(chuàng)建操作分配一個存儲塊,并返回其左值,可用于存放對象的右值。這種創(chuàng)建操作和聲明創(chuàng)建方式有兩個差別:象的右值。這種創(chuàng)建操作和聲明創(chuàng)建方式有兩個差別:na.數(shù)據(jù)對象不需要名字?jǐn)?shù)據(jù)對象不需要名字nb.可在程序執(zhí)行中任何位置創(chuàng)建可在程序執(zhí)行中任何位置創(chuàng)建3、取引用操作、取引用操作n允許跟隨指針到其指向的對象。允許跟隨指針到其指向的對象。62指針數(shù)據(jù)類型:規(guī)約指針數(shù)據(jù)類型:規(guī)約n指針數(shù)據(jù)類型定義一類數(shù)據(jù)對象,它們的值是指針數(shù)據(jù)類型定義一類數(shù)據(jù)對象,它們的值是其它數(shù)據(jù)對象的位置。指針類型的對象有兩種其它數(shù)據(jù)對象的位置。指針類型的對象有兩種處理方式:

56、處理方式:1、指針只能引用單個類型的數(shù)據(jù)對象。、指針只能引用單個類型的數(shù)據(jù)對象。n如如C、PASCAL和和Ada等語言,需要進(jìn)行指針類型聲明和等語言,需要進(jìn)行指針類型聲明和相應(yīng)的靜態(tài)類型檢查。相應(yīng)的靜態(tài)類型檢查。2、指針可以引用任意類型的數(shù)據(jù)對象。、指針可以引用任意類型的數(shù)據(jù)對象。n如:如:SMALLTALK語言,數(shù)據(jù)對象本身帶有描述子,需要語言,數(shù)據(jù)對象本身帶有描述子,需要進(jìn)行動態(tài)類型檢查。也可以不進(jìn)行類型檢查。進(jìn)行動態(tài)類型檢查。也可以不進(jìn)行類型檢查。63指針數(shù)據(jù)類型:操作指針數(shù)據(jù)類型:操作n創(chuàng)建操作為一定長數(shù)據(jù)對象分配存儲空間,創(chuàng)建操作為一定長數(shù)據(jù)對象分配存儲空間,并創(chuàng)建指向該新數(shù)據(jù)對象的

57、指針,該指針可并創(chuàng)建指向該新數(shù)據(jù)對象的指針,該指針可以存放到指針數(shù)據(jù)對象中。如:以存放到指針數(shù)據(jù)對象中。如:PASCAL和和Ada中的中的new,C中的系統(tǒng)函數(shù)中的系統(tǒng)函數(shù)malloc。n選擇操作允許跟蹤指針值以達(dá)到指定的數(shù)據(jù)選擇操作允許跟蹤指針值以達(dá)到指定的數(shù)據(jù)對象。因為指針是普通的數(shù)據(jù)對象,指針數(shù)對象。因為指針是普通的數(shù)據(jù)對象,指針數(shù)據(jù)對象本身也可以用一般的選擇機(jī)制。如:據(jù)對象本身也可以用一般的選擇機(jī)制。如:*用于取指針的右值,并將其變成左值,用用于取指針的右值,并將其變成左值,用左值訪問數(shù)據(jù)。左值訪問數(shù)據(jù)。64指針數(shù)據(jù)類型:實現(xiàn)指針數(shù)據(jù)類型:實現(xiàn)n指針數(shù)據(jù)對象被表示為存儲位置(包含指針數(shù)

58、據(jù)對象被表示為存儲位置(包含另一個存儲位置的地址,該地址是表示另一個存儲位置的地址,該地址是表示該指針指向的數(shù)據(jù)對象的存儲塊的基地該指針指向的數(shù)據(jù)對象的存儲塊的基地址)。指針值的兩種存儲表示:址)。指針值的兩種存儲表示:1、絕對地址:指針值可以表示為數(shù)據(jù)對象所、絕對地址:指針值可以表示為數(shù)據(jù)對象所在存儲塊的實際存儲地址。在存儲塊的實際存儲地址。2、相對地址:指針值可以表示為從某基地址、相對地址:指針值可以表示為從某基地址開始的位移量。數(shù)據(jù)對象是被分配在一個大開始的位移量。數(shù)據(jù)對象是被分配在一個大的存儲堆中。的存儲堆中。65指針數(shù)據(jù)類型:實現(xiàn)指針數(shù)據(jù)類型:實現(xiàn)n當(dāng)使用絕對地址時,由創(chuàng)建操作創(chuàng)建的

59、數(shù)據(jù)對象可以當(dāng)使用絕對地址時,由創(chuàng)建操作創(chuàng)建的數(shù)據(jù)對象可以分配在存儲區(qū)中的任意地方,通常,該分配發(fā)生在一分配在存儲區(qū)中的任意地方,通常,該分配發(fā)生在一個存儲堆區(qū)域中。使用絕對地址的選擇操作將更為高個存儲堆區(qū)域中。使用絕對地址的選擇操作將更為高效,因為指針值提供了直接的訪問。缺點(diǎn)是存儲管理效,因為指針值提供了直接的訪問。缺點(diǎn)是存儲管理更為困難,因為數(shù)據(jù)對象不能隨意在存儲中移動,存更為困難,因為數(shù)據(jù)對象不能隨意在存儲中移動,存儲的回收必須逐個進(jìn)行。儲的回收必須逐個進(jìn)行。n使用相對地址需要一個存儲塊的初始分配,可以是每使用相對地址需要一個存儲塊的初始分配,可以是每種類型各有一個區(qū)域,也可以是所有數(shù)據(jù)

60、對象共有一種類型各有一個區(qū)域,也可以是所有數(shù)據(jù)對象共有一個區(qū)域。每個區(qū)域管理為一個堆。缺點(diǎn)是選擇操作需個區(qū)域。每個區(qū)域管理為一個堆。缺點(diǎn)是選擇操作需要更大的代價,優(yōu)點(diǎn)是存儲塊可以整體任意移動,整要更大的代價,優(yōu)點(diǎn)是存儲塊可以整體任意移動,整個區(qū)域可以處理為一個數(shù)據(jù)對象。個區(qū)域可以處理為一個數(shù)據(jù)對象。返回66文件和文件和I/On文件是一種數(shù)據(jù)結(jié)構(gòu),具有兩個特殊性質(zhì):文件是一種數(shù)據(jù)結(jié)構(gòu),具有兩個特殊性質(zhì):1、通常表示在外存上,比其它數(shù)據(jù)類型也要大得多。、通常表示在外存上,比其它數(shù)據(jù)類型也要大得多。2、生命期長,通常會跨越創(chuàng)建它的程序的生命期而、生命期長,通常會跨越創(chuàng)建它的程序的生命期而存在。存在。n順序文

溫馨提示

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

評論

0/150

提交評論