第五章數(shù)據(jù)類(lèi)型_第1頁(yè)
第五章數(shù)據(jù)類(lèi)型_第2頁(yè)
第五章數(shù)據(jù)類(lèi)型_第3頁(yè)
第五章數(shù)據(jù)類(lèi)型_第4頁(yè)
已閱讀5頁(yè),還剩69頁(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)介

第五章數(shù)據(jù)類(lèi)型1任何程序,不管以何種語(yǔ)言寫(xiě)成,均可以視為刻劃了一個(gè)操作集合。并將以一定順序作用到一定數(shù)據(jù)上。語(yǔ)言的基本不同在于:允許的數(shù)據(jù)類(lèi)型允許的操作類(lèi)型控制操作順序的機(jī)制。2本章主要內(nèi)容數(shù)據(jù)類(lèi)型的基本概念及相關(guān)屬性基本數(shù)據(jù)類(lèi)型復(fù)合數(shù)據(jù)類(lèi)型35.1類(lèi)型和對(duì)象的性質(zhì)數(shù)據(jù)對(duì)象、變量和常量數(shù)據(jù)類(lèi)型及其規(guī)約簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約與實(shí)現(xiàn)數(shù)據(jù)對(duì)象的聲明類(lèi)型檢查和類(lèi)型轉(zhuǎn)換數(shù)據(jù)對(duì)象的初始化4數(shù)據(jù)對(duì)象計(jì)算機(jī)的數(shù)據(jù)存儲(chǔ)在結(jié)構(gòu)上是簡(jiǎn)單的,通常是由位串構(gòu)成的字節(jié)。而語(yǔ)言虛擬機(jī)的數(shù)據(jù)存儲(chǔ)則有更復(fù)雜的組織,如:數(shù)組、棧、數(shù)、字符串、以及其它存在于程序執(zhí)行中不同點(diǎn)的數(shù)據(jù)。我們稱虛擬機(jī)上一個(gè)或多個(gè)數(shù)據(jù)片斷運(yùn)行時(shí)的組合為數(shù)據(jù)對(duì)象。5數(shù)據(jù)對(duì)象在程序運(yùn)行中,存在許多不同類(lèi)型的不同數(shù)據(jù)對(duì)象。這些對(duì)象及其相互關(guān)系在運(yùn)行時(shí)動(dòng)態(tài)變化。有些數(shù)據(jù)對(duì)象是程序員定義的,如變量、常量、數(shù)組、文件等。程序員通過(guò)聲明和語(yǔ)句顯式地創(chuàng)建和操作它們。有些數(shù)據(jù)對(duì)象是系統(tǒng)定義的,不可為程序員直接訪問(wèn)。如:運(yùn)行時(shí)存儲(chǔ)棧、子程序激活記錄、文件緩沖、自由空間列表等。這些數(shù)據(jù)對(duì)象在運(yùn)行需要時(shí)自動(dòng)產(chǎn)生,不需要時(shí)刪除。6數(shù)據(jù)對(duì)象標(biāo)量數(shù)據(jù)對(duì)象:Numeric(Integers,Real)BooleansCharactersEnumerations復(fù)合對(duì)象:StringPointer結(jié)構(gòu)化對(duì)象:ArraysRecordsListsSets抽象數(shù)據(jù)對(duì)象:Classes活動(dòng)對(duì)象:TasksProcesses7數(shù)據(jù)對(duì)象數(shù)據(jù)對(duì)象表示了數(shù)據(jù)值的一個(gè)容器,是值被存放和檢索的地方,而數(shù)據(jù)值是在存儲(chǔ)器中以一種特定的位模式表示。數(shù)據(jù)對(duì)象和數(shù)據(jù)值在大多數(shù)語(yǔ)言中均是明確區(qū)分的,如圖所示。8數(shù)據(jù)對(duì)象每個(gè)數(shù)據(jù)對(duì)象有生命期,在生命期內(nèi)可用來(lái)存放數(shù)據(jù)值。數(shù)據(jù)對(duì)象可分為簡(jiǎn)單數(shù)據(jù)對(duì)象和數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)—其他數(shù)據(jù)對(duì)象的聚集。數(shù)據(jù)對(duì)象在其生命期中涉及各種綁定,雖然其屬性不變,但綁定可動(dòng)態(tài)改變。9數(shù)據(jù)對(duì)象:屬性和綁定重要的屬性和綁定有:1、類(lèi)型通常在程序翻譯時(shí),關(guān)聯(lián)數(shù)據(jù)對(duì)象和它可能的取值集合。2、位置通常不由程序員規(guī)定,而是系統(tǒng)存儲(chǔ)管理負(fù)責(zé)。3、值由賦值操作完成綁定。4、名通常在聲明時(shí)完成綁定,但可被子程序調(diào)用和返回修改5、部件通常用指針值相連,可通過(guò)指針的修改而變動(dòng)。返回10變量和常量程序員通過(guò)變量來(lái)顯式地定義和命名數(shù)據(jù)對(duì)象。一個(gè)簡(jiǎn)單的變量是有名字的簡(jiǎn)單數(shù)據(jù)對(duì)象,其內(nèi)容可以發(fā)生變化。常量是具有名字的數(shù)據(jù)對(duì)象,其值在其生命期內(nèi)永久不變。一個(gè)文字(或文字常量)是一個(gè)常量,其名是其值的書(shū)寫(xiě)表示,如21表示值為21的整數(shù)常量。程序員定義的常量——其名字由程序員指定。常量的綁定由編譯器完成。如C語(yǔ)言中,#defineMAX20語(yǔ)句MAX=4是非法的。返回11數(shù)據(jù)類(lèi)型一個(gè)數(shù)據(jù)類(lèi)型是一類(lèi)數(shù)據(jù)對(duì)象加上創(chuàng)建及操作它們的一組操作。每個(gè)語(yǔ)言有一個(gè)基本數(shù)據(jù)類(lèi)型集合,是語(yǔ)言固有的。有的語(yǔ)言還提供了設(shè)施允許程序員定義新數(shù)據(jù)類(lèi)型。有的新語(yǔ)言還允許類(lèi)型本身被語(yǔ)言操作(高階能力)。每個(gè)數(shù)據(jù)類(lèi)型都包括對(duì)其相關(guān)性質(zhì)的規(guī)約以及在計(jì)算機(jī)中的具體實(shí)現(xiàn)12數(shù)據(jù)類(lèi)型的規(guī)約數(shù)據(jù)類(lèi)型的規(guī)約包括:1、區(qū)分該類(lèi)型的數(shù)據(jù)對(duì)象的屬性2、該類(lèi)型數(shù)據(jù)對(duì)象可具有的值3、定義該類(lèi)型數(shù)據(jù)對(duì)象可能處理的操作例如:數(shù)組數(shù)據(jù)類(lèi)型的規(guī)約屬性:維數(shù)、每維的下標(biāo)范圍、元素的數(shù)據(jù)類(lèi)型等。值:形成數(shù)值元素有效值的數(shù)的集合。操作:選擇個(gè)體數(shù)組元素、創(chuàng)建數(shù)組、改變數(shù)組形狀,訪問(wèn)下標(biāo)上下界、完成數(shù)組間的算術(shù)操作等。返回13數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)包括:1、存儲(chǔ)表示:用于在計(jì)算機(jī)存儲(chǔ)器中表示數(shù)據(jù)對(duì)象。2、數(shù)據(jù)類(lèi)型操作是以特殊的算法或過(guò)程表示的方式,這些算法和過(guò)程操縱數(shù)據(jù)對(duì)象的存儲(chǔ)表示。返回14數(shù)據(jù)類(lèi)型的規(guī)約與實(shí)現(xiàn)從語(yǔ)法表示來(lái)看,規(guī)約和實(shí)現(xiàn)大體上獨(dú)立于特定的語(yǔ)法形式。屬性:表示為聲明或類(lèi)型定義值:表示為文字或定義的常量操作:可由特殊的符號(hào)、固有過(guò)程或函數(shù)、或隱含地通過(guò)其他語(yǔ)言元素的特殊組合來(lái)調(diào)用。15基本(簡(jiǎn)單)數(shù)據(jù)類(lèi)型的規(guī)約簡(jiǎn)單數(shù)據(jù)對(duì)象包含單個(gè)數(shù)據(jù)值,這類(lèi)數(shù)據(jù)對(duì)象稱為基本數(shù)據(jù)類(lèi)型。雖然不同的語(yǔ)言有不同的基本類(lèi)型集合,但整數(shù)、實(shí)數(shù)、字符、布爾、枚舉、指針等基本都是有的。但各自精確的規(guī)約對(duì)不同語(yǔ)言會(huì)有差異。16簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約:屬性數(shù)據(jù)對(duì)象的基本屬性(如類(lèi)型和名字)通常在生命期中是不變的。有的屬性可存放在描述子中,作為數(shù)據(jù)對(duì)象的一部分在運(yùn)行時(shí)出現(xiàn)。有的屬性只用于確定其存儲(chǔ)表示,在執(zhí)行中不顯式地出現(xiàn)。屬性值和數(shù)據(jù)對(duì)象的值是不同的。17簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約:值數(shù)據(jù)對(duì)象的類(lèi)型確定了它可包含的可能值集,但在執(zhí)行中任一點(diǎn),只包含一個(gè)來(lái)自該集合的單值?;緮?shù)據(jù)類(lèi)型定義的值集通常是有序集,有最小值和最大值。18簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約:操作(1)操作確定數(shù)據(jù)對(duì)象被處理的方式。操作可能是原始操作,也可是用戶定義操作。操作是一個(gè)數(shù)學(xué)函數(shù),對(duì)一給定輸入?yún)?shù),有定義的、唯一確定的結(jié)果。每個(gè)操作有作用域、值域。操作的動(dòng)作定義了對(duì)給定參數(shù)的結(jié)果。算法可用于刻劃操作的動(dòng)作,但其他規(guī)約也是可以的。如可用乘法表來(lái)刻劃乘法的動(dòng)作。19簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約:操作(2)操作的基調(diào)(signature)——定義了操作的作用域中參數(shù)的數(shù)量、順序和類(lèi)型,以及結(jié)果值域的順序和類(lèi)型。數(shù)學(xué)記號(hào):OP:type1×type2×…typentype—也稱為函數(shù)原形操作有單元、二元和多元。動(dòng)作的精確規(guī)約需要比參數(shù)類(lèi)型更多的信息。特別地,參數(shù)類(lèi)型的存儲(chǔ)表示通常確定那些參數(shù)如何被操作,如:二進(jìn)制數(shù)的乘法和十進(jìn)制數(shù)的乘法有很大不同。這樣,在操作的規(guī)約中,常給出動(dòng)作的非形式的描述。一旦參數(shù)的存儲(chǔ)表示確定,動(dòng)作的精確規(guī)約是操作實(shí)現(xiàn)的一部分。20簡(jiǎn)單數(shù)據(jù)類(lèi)型的規(guī)約:操作(3)有時(shí)難于確定操作的精確規(guī)約為數(shù)學(xué)函數(shù),有四個(gè)主要因素。1、操作對(duì)某些輸入無(wú)定義。2、隱含的參數(shù)——操作會(huì)訪問(wèn)其他隱含參數(shù)(全局變量;非局部變量)。3、副作用(隱含結(jié)果)——可能修改其他數(shù)據(jù)對(duì)象。4、自我修改(歷史敏感性)——操作修改自己的內(nèi)部結(jié)構(gòu)、或是執(zhí)行中保持的局部數(shù)據(jù)、或是代碼。操作的結(jié)果還依賴于歷史調(diào)用。例:隨機(jī)數(shù)產(chǎn)生器。LISP中可自我修改代碼。21基本數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)存儲(chǔ)表示基本類(lèi)型的存儲(chǔ)受低層計(jì)算機(jī)的影響很大。如:整數(shù)或?qū)崝?shù)幾乎就是在低層硬件中使用的數(shù)的整數(shù)或浮點(diǎn)數(shù)表示。對(duì)字符值,硬件或操作系統(tǒng)字符碼被使用?;纠碛桑喝缡褂糜布鎯?chǔ)表示,則該類(lèi)型數(shù)據(jù)基本操作可以用硬件提供的基本操作實(shí)現(xiàn)。否則,將使用軟件仿真,從而帶來(lái)效率損失。22基本數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)基本數(shù)據(jù)類(lèi)型的屬性被類(lèi)似地處理。1、為了效率,很多語(yǔ)言設(shè)計(jì)為屬性由編譯器確定。屬性本身并不存放在運(yùn)行時(shí)存儲(chǔ)表示中——存儲(chǔ)表示通常直接使用硬件,如:C、Fortran、Pascal等。2、數(shù)據(jù)對(duì)象的屬性可存放在描述子中作為運(yùn)行時(shí)數(shù)據(jù)對(duì)象的一部分,如:LISP、Prolog等,這里靈活性是主要目標(biāo)。通常硬件不提供對(duì)描述子的直接表示。數(shù)據(jù)對(duì)象的表示通常獨(dú)立于存儲(chǔ)位置,這樣給定類(lèi)型的每個(gè)對(duì)象有相同的表示(除位置不同),通常用需要的內(nèi)存塊的尺寸(大?。﹣?lái)描述,同時(shí)也涉及屬性和值在塊中的布局。通常內(nèi)存塊的每一個(gè)字或字節(jié)的地址用于表示數(shù)據(jù)對(duì)象的位置。23基本數(shù)據(jù)類(lèi)型的實(shí)現(xiàn)操作的實(shí)現(xiàn)1、直接作為硬件操作如:整數(shù)表示為硬件整數(shù),+,-也直接用硬件實(shí)現(xiàn)。2、作為過(guò)程或函數(shù)子程序如:平方根操作。如數(shù)據(jù)對(duì)象不使用硬件表示,則所有操作必須是軟件仿真,通常以子程序的形式。3、作為In-line(內(nèi)嵌)代碼序列。這也是操作的軟件實(shí)現(xiàn)形式,但不是使用短小的子程序,而是將子程序中操作代碼拷貝到程序中的調(diào)用點(diǎn)。返回24數(shù)據(jù)對(duì)象的聲明編寫(xiě)程序時(shí),程序員確定數(shù)據(jù)對(duì)象的名字和類(lèi)型。還要確定:生命期、在程序中的活動(dòng)范圍、相關(guān)操作等。聲明:一種程序語(yǔ)句,告知語(yǔ)言翻譯器關(guān)于數(shù)據(jù)對(duì)象的信息。如聲明語(yǔ)句放在特定的程序或類(lèi)定義中,則指明了對(duì)象希望的生命期。聲明可以是顯式的,也可以是隱含的或缺省的。聲明可以為數(shù)據(jù)對(duì)象賦上初始值,也可指定常量值。25數(shù)據(jù)對(duì)象的聲明操作的聲明翻譯時(shí)需要的關(guān)于操作的信息,主要是其基調(diào)signature。對(duì)基本操作,不需顯式的參數(shù)類(lèi)型和結(jié)果類(lèi)型聲明,是語(yǔ)言中固有的。對(duì)程序員定義的操作,則必須指定之。如:sub:int×float→float

=>floatSub(intx,floaty)26聲明的目的1、選擇存儲(chǔ)表示聲明可以給語(yǔ)言翻譯器提供關(guān)于數(shù)據(jù)類(lèi)型和數(shù)據(jù)對(duì)象屬性的信息,使得翻譯器可以確定數(shù)據(jù)對(duì)象的最佳的存儲(chǔ)表示,從而減少整體的存儲(chǔ)需求和被翻譯程序的執(zhí)行時(shí)間。2、存儲(chǔ)管理——聲明使其更為高效聲明可以提供關(guān)于數(shù)據(jù)對(duì)象生命期的信息,從而使得在程序執(zhí)行過(guò)程中進(jìn)行更高效的存儲(chǔ)管理。如:在C語(yǔ)言中,在子程序頭部聲明的數(shù)據(jù)對(duì)象有相同的生命期,這樣可以在進(jìn)入子程序時(shí)分配一個(gè)整體的塊來(lái)存放所有的數(shù)據(jù)對(duì)象,而在退出子程序時(shí)釋放。其它動(dòng)態(tài)創(chuàng)建的數(shù)據(jù)對(duì)象則需單獨(dú)處理。27聲明的目的3、多態(tài)操作——包括重載和真正多態(tài)大多數(shù)語(yǔ)言均使用特殊的符號(hào)來(lái)表示一組不同的操作,具體操作的選擇將依賴于參數(shù)的數(shù)據(jù)類(lèi)型。此即所謂重載。如:+可以是整數(shù)加、實(shí)數(shù)加,甚至可用于字符和字符串操作。重載是一個(gè)在語(yǔ)法層次上處理的概念。由編譯器處理。真正的多態(tài)通常是語(yǔ)義級(jí)別的概念,操作符的具體動(dòng)作的確定是在運(yùn)行時(shí)進(jìn)行。如:函數(shù)語(yǔ)言中,類(lèi)型可以作為參數(shù)帶入,從而使函數(shù)的動(dòng)作的選擇依據(jù)類(lèi)型實(shí)參而確定。恒等函數(shù)就是典型的多態(tài)。面向?qū)ο蟮睦^承機(jī)制也提供了所謂的包含多態(tài)性,即子類(lèi)的對(duì)象可用于父類(lèi)對(duì)象出現(xiàn)的地方。4、類(lèi)型檢查——最重要的目標(biāo),屬語(yǔ)義檢查,目標(biāo)是排錯(cuò),分靜態(tài)或動(dòng)態(tài)類(lèi)型檢查。類(lèi)型檢查提供了很好的防止錯(cuò)誤的機(jī)制。返回28類(lèi)型檢查和類(lèi)型轉(zhuǎn)換計(jì)算機(jī)硬件固有的數(shù)據(jù)存儲(chǔ)表示通常不含類(lèi)型信息。數(shù)據(jù)上的基本原始操作也不需類(lèi)型檢查。如一個(gè)位串:111001……0011可能是整數(shù)、實(shí)數(shù)、字符串、或指令,沒(méi)有辦法來(lái)區(qū)分。硬件提供的基本操作(如加法),不能檢查其參數(shù)是否為整數(shù),他們僅僅是位串。匯編語(yǔ)言或機(jī)器語(yǔ)言編程中常見(jiàn)的錯(cuò)誤源于錯(cuò)誤的操作類(lèi)型,這種錯(cuò)誤難于發(fā)現(xiàn),因?yàn)椴僮鞑⒉灰悦黠@的方式失敗。操作可進(jìn)行,但結(jié)果沒(méi)有意義。有時(shí)這種錯(cuò)誤可在連續(xù)的一串操作后出錯(cuò),有時(shí)程序停止也不出錯(cuò)。29類(lèi)型檢查類(lèi)型檢查:指檢查程序中每個(gè)操作均接收了正確數(shù)目的正確類(lèi)型參數(shù),可在運(yùn)行時(shí)完成,即動(dòng)態(tài)類(lèi)型檢查;或編譯時(shí)檢查,即靜態(tài)類(lèi)型檢查。高級(jí)語(yǔ)言的主要優(yōu)點(diǎn)之一:可提供對(duì)所有(或幾乎所有)操作的類(lèi)型檢查。30動(dòng)態(tài)類(lèi)型檢查需類(lèi)型標(biāo)志,不需對(duì)變量聲明(即變量是無(wú)類(lèi)型的)。優(yōu)點(diǎn):編程的靈活性。程序員不需考慮類(lèi)型問(wèn)題,具有較高靈活性。缺點(diǎn):程序難于調(diào)試,不能完全消去所有參數(shù)類(lèi)型錯(cuò)誤。程序測(cè)試不可能檢測(cè)所有的路徑。需要在執(zhí)行過(guò)程中保持類(lèi)型信息,需存儲(chǔ)空間。動(dòng)態(tài)檢查需以軟件實(shí)現(xiàn),有時(shí)間花銷(xiāo)。31靜態(tài)類(lèi)型檢查需要的信息通常由程序員在聲明中及在其他語(yǔ)言結(jié)構(gòu)中提供。需要:1、對(duì)每個(gè)操作,其參數(shù)的數(shù)量、順序、類(lèi)型及結(jié)果類(lèi)型。2、對(duì)每個(gè)變量,被關(guān)聯(lián)的命名數(shù)據(jù)對(duì)象的類(lèi)型。3、每個(gè)常量數(shù)據(jù)對(duì)象的類(lèi)型。編譯器在翻譯的早期階段收集聲明中的類(lèi)型信息,以后將用于類(lèi)型檢查。靜態(tài)檢查涉及語(yǔ)言的多個(gè)方面:聲明、數(shù)據(jù)控制結(jié)構(gòu)、分開(kāi)編譯等。32靜態(tài)與動(dòng)態(tài)類(lèi)型檢查靜態(tài)檢查將針對(duì)程序中的所有操作進(jìn)行,所有可能的執(zhí)行路徑均被檢查。因此,關(guān)于類(lèi)型錯(cuò)誤的進(jìn)一步測(cè)試是不需要的,因而不需類(lèi)型標(biāo)記和運(yùn)行時(shí)類(lèi)型檢查。在多數(shù)語(yǔ)言中,對(duì)某些語(yǔ)言結(jié)構(gòu)的靜態(tài)檢查在某種情況下是不可能的。解決方案:采用動(dòng)態(tài)類(lèi)型檢查或不檢查。33類(lèi)型檢查強(qiáng)類(lèi)型如果我們可以靜態(tài)地檢測(cè)程序中的所有類(lèi)型錯(cuò)誤,則稱語(yǔ)言是強(qiáng)賦類(lèi)型的。通常類(lèi)型為程序提供了一個(gè)安全層次。一個(gè)函數(shù)f:S→R稱為類(lèi)型安全的,如果f的執(zhí)行不會(huì)產(chǎn)生R以外的值。類(lèi)型安全的操作均不需動(dòng)態(tài)檢查。很少有語(yǔ)言是真正強(qiáng)類(lèi)型的。類(lèi)型推導(dǎo)如果解釋不會(huì)出現(xiàn)二義性,則類(lèi)型聲明可以省去。可由語(yǔ)言實(shí)現(xiàn)推導(dǎo)出失去的類(lèi)型信息。34類(lèi)型轉(zhuǎn)換和類(lèi)型的強(qiáng)制轉(zhuǎn)換如果在類(lèi)型檢查中,參數(shù)的實(shí)際類(lèi)型和操作期望的類(lèi)型間出現(xiàn)不匹配,則有兩種處理方案:1、指出出錯(cuò)2、通過(guò)強(qiáng)制(隱式的類(lèi)型轉(zhuǎn)換)來(lái)改變實(shí)際參數(shù)的類(lèi)型為正確類(lèi)型。類(lèi)型轉(zhuǎn)換的基調(diào)為:conversion-op:type1→type2將一個(gè)對(duì)象變?yōu)榱硪活?lèi)型的對(duì)象。大多數(shù)語(yǔ)言以兩種方式提供類(lèi)型轉(zhuǎn)換:1、作為固有函數(shù),程序員可顯式地調(diào)用。如:將實(shí)數(shù)變成整數(shù),Pascal中的round,C中的(int)x2、作為強(qiáng)制,自動(dòng)在類(lèi)型失配時(shí)調(diào)用。如:整數(shù)和實(shí)數(shù)間相加,總是先將整數(shù)轉(zhuǎn)變?yōu)閷?shí)數(shù)。35類(lèi)型轉(zhuǎn)換和類(lèi)型的強(qiáng)制轉(zhuǎn)換強(qiáng)制的基本原則是不失信息。這類(lèi)強(qiáng)制稱為widening或promotion。如強(qiáng)制會(huì)丟失信息,則稱為變窄(narrowing)類(lèi)型轉(zhuǎn)換可能需要數(shù)據(jù)對(duì)象在運(yùn)行時(shí)存儲(chǔ)表示的改變,如:COBOL和PL/1中,數(shù)值以字符串方式存放,要相加需先轉(zhuǎn)換,結(jié)果又要轉(zhuǎn)換為字符串。有的語(yǔ)言中不提供類(lèi)型強(qiáng)制,類(lèi)型不匹配即被視為出錯(cuò)。而有的語(yǔ)言則盡可能在不匹配時(shí)采用強(qiáng)制(如C)。返回36賦值和初始化賦值是一基本操作,改變值到數(shù)據(jù)對(duì)象的綁定,這個(gè)改變是操作的副作用。有的語(yǔ)言中,賦值語(yǔ)句也返回值(作為表達(dá)式處理),該返回值包含被賦值拷貝的數(shù)據(jù)對(duì)象。Pascal中,賦值的規(guī)約為:Assignment(:=):integer1×integer2→eger2值賦給integer1無(wú)顯式返回。C中,規(guī)約為:Assignment(=):integer1×integer2→integer3integer2值的拷貝賦給integer1,同時(shí)創(chuàng)建并返回包含integer2值的新數(shù)據(jù)對(duì)象integer3.37賦值考慮賦值X:=X右邊的X稱右端值,用于引用包含在命名數(shù)據(jù)對(duì)象中的值,r-值。左邊的X用于引用將包含新值的數(shù)據(jù)對(duì)象的位置,稱為左值,l-值。賦值操作定義為:1、計(jì)算第一個(gè)操作數(shù)表達(dá)式的左值(存儲(chǔ)位置)。2、計(jì)算第二個(gè)操作數(shù)表達(dá)式的右值。3、將右值賦給左值對(duì)象。4、返回右值作為操作的結(jié)果。38賦值賦值的兩個(gè)不同視角(A=B)39初始化未初始化變量(或未初始化數(shù)據(jù)對(duì)象)是一個(gè)數(shù)據(jù)對(duì)象,已被創(chuàng)建,但未賦值,即有l(wèi)-值,但沒(méi)有r-值。創(chuàng)建對(duì)象僅涉及存儲(chǔ)塊的分配,塊中原有位模式不會(huì)改變。有的語(yǔ)言創(chuàng)建時(shí)不需初始化,初始化是在以后顯式地通過(guò)賦值進(jìn)行的。也可以在變量聲明時(shí)進(jìn)行顯式的初始化工作,此時(shí),需要編譯器產(chǎn)生相應(yīng)的賦值代碼并插入到目標(biāo)程序中。在變量聲明后立即進(jìn)行初始化工作是程序員應(yīng)有的良好習(xí)慣之一。有的語(yǔ)言,創(chuàng)建時(shí)自動(dòng)初始化(隱式初始化)。未初始化變量是程序錯(cuò)誤的重要原因之一。返回405.2基本數(shù)據(jù)類(lèi)型整數(shù)浮點(diǎn)實(shí)數(shù)定點(diǎn)實(shí)數(shù)枚舉布爾41數(shù)值數(shù)據(jù)類(lèi)型:整數(shù)規(guī)約:整數(shù)類(lèi)型的對(duì)象除了其類(lèi)型外,通常沒(méi)有其它屬性。該類(lèi)型的整數(shù)值的集合形成了數(shù)學(xué)中研究的無(wú)限整數(shù)集的一個(gè)在有限界內(nèi)的有序子集。最大整數(shù)值有時(shí)被表示為一個(gè)定義的常量,如:PASCAL中的maxint,其實(shí)際值由語(yǔ)言實(shí)現(xiàn)者根據(jù)具體的計(jì)算機(jī)硬件確定。C語(yǔ)言有四種不同的整數(shù)規(guī)約:int、short、long、char。42數(shù)值數(shù)據(jù)類(lèi)型:整數(shù)(操作)整數(shù)數(shù)據(jù)對(duì)象上的操作:算術(shù)操作:二元算術(shù)操作的規(guī)約為:BinOp:integer×integer->integer二元操作包括:+、-、×、/、mod等。一元算術(shù)操作的規(guī)約為:UnaryOp:integer->integer一元操作有:-、+、以及其它,如:絕對(duì)值。43數(shù)值數(shù)據(jù)類(lèi)型:整數(shù)(操作)關(guān)系操作:RelOp:integer×integer->Boolean關(guān)系操作有:大于、小于、相等、不等、等等賦值:assignment:integer×integer->voidassignment:integer×integer->integer位操作:也分二元和一元。如:&、|、<<(移位)等。44數(shù)值數(shù)據(jù)類(lèi)型:整數(shù)(實(shí)現(xiàn))語(yǔ)言定義的整數(shù)數(shù)據(jù)類(lèi)型經(jīng)常使用硬件定義的整數(shù)存儲(chǔ)表示和硬件提供的算術(shù)及關(guān)系操作來(lái)實(shí)現(xiàn)。通常使用一個(gè)完整的字來(lái)存儲(chǔ)一個(gè)整數(shù)。三種可能的整數(shù)存儲(chǔ)表示:需聲明及靜態(tài)類(lèi)型檢查,如C、FORTRAN等語(yǔ)言仍可使用硬件提供的算術(shù)操作省空間,但需附加的操作處理返回45數(shù)值數(shù)據(jù)類(lèi)型:浮點(diǎn)實(shí)數(shù)(規(guī)約)通常規(guī)約為單個(gè)類(lèi)型屬性real或float,形成一個(gè)從硬件確定的最小負(fù)數(shù)到最大數(shù)的有序序列,但其值不是均勻地散布在這個(gè)范圍內(nèi)。此外,有的語(yǔ)言中,浮點(diǎn)數(shù)所需精度,即其所用的十進(jìn)制位數(shù),可由程序員來(lái)確定。實(shí)數(shù)具有和整數(shù)相同的算術(shù)、關(guān)系和賦值操作,但布爾操作有時(shí)會(huì)受限。由于進(jìn)位的關(guān)系,實(shí)數(shù)間的相等是很難達(dá)到的,因此使用實(shí)數(shù)相等為判定條件必須慎重。此外,大多數(shù)語(yǔ)言提供一些固有函數(shù)作為實(shí)數(shù)上的其它操作:Sin:real->realMax:real×real->real46數(shù)值數(shù)據(jù)類(lèi)型:浮點(diǎn)實(shí)數(shù)(實(shí)現(xiàn))浮點(diǎn)實(shí)數(shù)的存儲(chǔ)表示通常基于底層的硬件表示,其中存儲(chǔ)位置被分為尾數(shù)和指數(shù)。在大多數(shù)語(yǔ)言實(shí)現(xiàn),IEEE標(biāo)準(zhǔn)754被用為浮點(diǎn)數(shù)定義的標(biāo)準(zhǔn)。有單精度和雙精度浮點(diǎn)數(shù)之分。二者通常由硬件算術(shù)操作支持其加、減、乘、除,而求冪操作通常由軟件仿真。如果同時(shí)支持單精度和雙精度,則必須給予程序員相應(yīng)的聲明機(jī)制。返回47數(shù)值數(shù)據(jù)類(lèi)型:定點(diǎn)實(shí)數(shù)(規(guī)約)大多數(shù)硬件包含了整數(shù)和浮點(diǎn)數(shù)對(duì)象,然而,有很多應(yīng)用需要特定的有理數(shù),如:表示錢(qián)的元和分的數(shù)據(jù)對(duì)象。這些數(shù)不能寫(xiě)成整數(shù)或浮點(diǎn)數(shù)。因此,需要定點(diǎn)數(shù)。定點(diǎn)數(shù)表示為固定長(zhǎng)度的數(shù)位,在給定位置為小數(shù)點(diǎn)。如,COBOL語(yǔ)言中,有如下聲明:

XPICTURE999V9948數(shù)值數(shù)據(jù)類(lèi)型:定點(diǎn)實(shí)數(shù)(實(shí)現(xiàn))定點(diǎn)實(shí)數(shù)可直接由硬件支持或用軟件仿真。如PL/1中,DECLAREXFIXEDDECIMAL(10,3),

YFIXEDDECIMAL(10,2),

ZFIXEDDECIMAL(10,2);X為帶3個(gè)小數(shù)位的十位十進(jìn)制數(shù),Y和Z有兩個(gè)小數(shù)位。X的比例因子SF為3,Y和Z為2。value(X)=rvalue(X)×10-SF即,X值為103.421,其右值為103421??紤]語(yǔ)句:Z=X+Y實(shí)際加法的代碼為:Z=(X+10×Y)/10考慮X×Y,則:積=rvalue(X)×rvalue(Y)SF=SF(X)+SF(Y),SF為小數(shù)點(diǎn)位置49數(shù)值數(shù)據(jù)類(lèi)型:實(shí)數(shù)的不同表示實(shí)數(shù)1.5的不同表示返回50基本數(shù)據(jù)類(lèi)型:枚舉類(lèi)型我們通常希望一個(gè)變量只在一組符號(hào)值中選一值。如:變量StudentClass只有四種可能值:freshman,sophomore,junior,和senior。當(dāng)然,可以用整數(shù)來(lái)代表這四者,但必須由程序員來(lái)維護(hù)這類(lèi)變量的操作安全性及使用的類(lèi)型正確性。規(guī)約:枚舉是一個(gè)不同值的有序列表,由程序員確定其文字名及它們的順序。如C中:

Emun

StudentClass{Fresh,Soph,Junior,Senior};

Emun

EmploySex{Male,Female};51基本數(shù)據(jù)類(lèi)型:枚舉類(lèi)型(實(shí)現(xiàn))枚舉類(lèi)型的基本操作為關(guān)系操作、賦值,以及后繼和前驅(qū)。實(shí)現(xiàn):枚舉類(lèi)型數(shù)據(jù)對(duì)象的存儲(chǔ)表示是直接的,在枚舉序列中的每個(gè)值在運(yùn)行時(shí)被表示為整數(shù),通常為0、1、2、…之一。有的語(yǔ)言也可由程序員指定值。枚舉類(lèi)型上的操作的實(shí)現(xiàn)也是直接的,直接使用硬件提供的基本操作。返回52基本數(shù)據(jù)類(lèi)型:布爾類(lèi)型大多數(shù)語(yǔ)言提供數(shù)據(jù)類(lèi)型表示true和false,通常稱為布爾或邏輯類(lèi)型。規(guī)約:布爾類(lèi)型的數(shù)據(jù)對(duì)象取二值之一。在某些語(yǔ)言中,可將其考慮為語(yǔ)言定義的枚舉類(lèi)型。

TypeBoolean=(false,true);其順序?yàn)閒alse<true。布爾類(lèi)型對(duì)象上的操作為一般的邏輯操作。53基本數(shù)據(jù)類(lèi)型:布爾類(lèi)型(實(shí)現(xiàn))實(shí)現(xiàn):布爾數(shù)據(jù)對(duì)象的存儲(chǔ)表示是一個(gè)二進(jìn)制位。通常,為了可以直接訪問(wèn),而表示為單個(gè)可編址單元。用一個(gè)特殊位來(lái)表示,0為假,1為真?;蛘?,0為假,其余非零值為真。也有其它數(shù)據(jù)類(lèi)型可用于布爾型的表示,而C中沒(méi)有布爾型。返回545.3復(fù)合數(shù)據(jù)類(lèi)型字符串指針文件55字符串字符串是一個(gè)字符構(gòu)成的序列。幾乎所有的語(yǔ)言均有字符串類(lèi)型。規(guī)約和語(yǔ)法:至少有三種不同的字符串類(lèi)型處理方式:1、固定聲明長(zhǎng)度。在程序中聲明字符串對(duì)象的固定長(zhǎng)度。賦給該對(duì)象的值總是該長(zhǎng)度的字符串。新串值賦給該數(shù)據(jù)對(duì)象將導(dǎo)致長(zhǎng)度調(diào)整:減短或補(bǔ)足。PASCAL和COBOL中常采用此技術(shù)。56字符串2、有界變長(zhǎng)。字符串?dāng)?shù)據(jù)對(duì)象具有固定的最大長(zhǎng)度,但實(shí)際的字符串值長(zhǎng)度可以小于此,甚至是空串。執(zhí)行過(guò)程中,字符串長(zhǎng)度會(huì)發(fā)生變化,但超長(zhǎng)時(shí)需減短。3、無(wú)界長(zhǎng)度。字符串?dāng)?shù)據(jù)對(duì)象可以具有任意長(zhǎng)度,而且長(zhǎng)度可以在執(zhí)行過(guò)程中動(dòng)態(tài)地?zé)o界變化。前兩種方法允許翻譯時(shí)確定每個(gè)字符串?dāng)?shù)據(jù)對(duì)象的存儲(chǔ)分配。第三種方法需要存儲(chǔ)的運(yùn)行時(shí)動(dòng)態(tài)分配。57字符串:操作(1)1、串聯(lián)將兩個(gè)字符串連接在一起以形成一個(gè)長(zhǎng)串。如:“BLOCK”||“HEAD”產(chǎn)生“BLOCKHEAD”。2、串上的關(guān)系操作包括一般的相等、大于、小于等均可用于字符串。由于字符本身是有序的,因此可以擴(kuò)展形成字符串的字典序。3、使用定位下標(biāo)的子串選擇很多語(yǔ)言提供了選擇子串的操作。如:FORTRAN中,NEXT=STR(6:10)將STR中從位置6到10的5個(gè)字符賦給NEXT。如果允許子串選擇出現(xiàn)在賦值的兩邊,則其語(yǔ)義必須仔細(xì)定義。58字符串:操作(2)4、I/O格式程序設(shè)計(jì)語(yǔ)言中提供的某些字符串操作常常是為了幫助輸出數(shù)據(jù)的格式化或?qū)⒏袷交妮斎肓鞣纸绯尚〉臄?shù)據(jù)單元。如:C和FORTRAN中的格式化I/O特性。5、使用模式匹配的子串選擇由于不知道子串在大串中的位置,模式匹配則成為一種重要的方法。如:SNOBOL4就提供了強(qiáng)大的模式匹配操作。59字符串:實(shí)現(xiàn)三種不同的方法使用不同的存儲(chǔ)表示。對(duì)固定長(zhǎng)度的字符串操作可以有硬件支持。其它方式則需要軟件仿真。返回60指針通常,不是引入一系列可變長(zhǎng)的鏈接數(shù)據(jù)對(duì)象類(lèi)型,而是提供設(shè)施來(lái)允許使用指針將數(shù)據(jù)對(duì)象鏈接在一起而形成某種結(jié)構(gòu),這樣需要如下幾個(gè)語(yǔ)言特性:1、基本數(shù)據(jù)類(lèi)型-指針(pointer),也稱引用或訪問(wèn)類(lèi)型。指針對(duì)象包含另一個(gè)數(shù)據(jù)對(duì)象的位置(左值),空指針為nil或null。2、定長(zhǎng)數(shù)據(jù)對(duì)象的創(chuàng)建操作創(chuàng)建操作分配一個(gè)存儲(chǔ)塊,并返回其左值,可用于存放對(duì)象的右值。這種創(chuàng)建操作和聲明創(chuàng)建方式有兩個(gè)差別:a.數(shù)據(jù)對(duì)象不需要名字b.可在程序執(zhí)行中任何位置創(chuàng)建3、取引用操作允許跟隨指針到其指向的對(duì)象。61指針數(shù)據(jù)類(lèi)型:規(guī)約指針數(shù)據(jù)類(lèi)型定義一類(lèi)數(shù)據(jù)對(duì)象,它們的值是其它數(shù)據(jù)對(duì)象的位置。指針類(lèi)型的對(duì)象有兩種處理方式:1、指針只能引用單個(gè)類(lèi)型的數(shù)據(jù)對(duì)象。如C、PASCAL和Ada等語(yǔ)言,需要進(jìn)行指針類(lèi)型聲明和相應(yīng)的靜態(tài)類(lèi)型檢查。2、指針可以引用任意類(lèi)型的數(shù)據(jù)對(duì)象。如:SMALLTALK語(yǔ)言,數(shù)據(jù)對(duì)象本身帶有描述子,需要進(jìn)行動(dòng)態(tài)類(lèi)型檢查。也可以不進(jìn)行類(lèi)型檢查。62指針數(shù)據(jù)類(lèi)型:操作創(chuàng)建操作為一定長(zhǎng)數(shù)據(jù)對(duì)象分配存儲(chǔ)空間,并創(chuàng)建指向該新數(shù)據(jù)對(duì)象的指針,該指針可以存放到指針數(shù)據(jù)對(duì)象中。如:PASCAL和Ada中的new,C中的系統(tǒng)函數(shù)malloc。選擇操作允許跟蹤指針值以達(dá)到指定的數(shù)據(jù)對(duì)象。因?yàn)橹羔樖瞧胀ǖ臄?shù)據(jù)對(duì)象,指針數(shù)據(jù)對(duì)象本身也可以用一般的選擇機(jī)制。如:*用于取指針的右值,并將其變成左值,用左值訪問(wèn)數(shù)據(jù)。63指針數(shù)據(jù)類(lèi)型:實(shí)現(xiàn)指針數(shù)據(jù)對(duì)象被表示為存儲(chǔ)位置(包含另一個(gè)存儲(chǔ)位置的地址,該地址是表示該指針指向的數(shù)據(jù)對(duì)象的存儲(chǔ)塊的基地址)。指針值的兩種存儲(chǔ)表示:1、絕對(duì)地址:指針值可以表示為數(shù)據(jù)對(duì)象所在存儲(chǔ)塊的實(shí)際存儲(chǔ)地址。2、相對(duì)地址:指針值可以表示為從某基地址開(kāi)始的位移量。數(shù)據(jù)對(duì)象是被分配在一個(gè)大的存儲(chǔ)堆中。64指針數(shù)據(jù)類(lèi)型:實(shí)現(xiàn)當(dāng)使用絕對(duì)地址時(shí),由創(chuàng)建操作創(chuàng)建的數(shù)據(jù)對(duì)象可以分配在存儲(chǔ)區(qū)中的任意地方,通常,該分配發(fā)生在一個(gè)存儲(chǔ)堆區(qū)域中。使用絕對(duì)地址的選擇操作將更為高效,因?yàn)橹羔樦堤峁┝酥苯拥脑L問(wèn)。缺點(diǎn)是存儲(chǔ)管理更為困難,因?yàn)閿?shù)據(jù)對(duì)象不能隨意在存儲(chǔ)中移動(dòng),存儲(chǔ)的回收必須逐個(gè)進(jìn)行。使用相對(duì)地址需要一個(gè)存儲(chǔ)塊的初始分配,可以是每種類(lèi)型各有一個(gè)區(qū)域,也可以是所有數(shù)據(jù)對(duì)象共有一個(gè)區(qū)域。每個(gè)區(qū)域管理為一個(gè)堆。缺點(diǎn)是選擇操作需要更大的代價(jià),優(yōu)點(diǎn)是存儲(chǔ)塊可以整體任意移動(dòng),整個(gè)區(qū)域可以處理為一個(gè)數(shù)據(jù)對(duì)象。返回65文件和I/O文件是一種數(shù)據(jù)結(jié)構(gòu),具有兩個(gè)特殊性質(zhì):1、通常表示在外存上,比其它數(shù)據(jù)類(lèi)型也要大得多。2、生命期長(zhǎng),通常會(huì)跨越創(chuàng)建它的程序的生命期而存在。順序文件是最常見(jiàn)的文件類(lèi)型。很多語(yǔ)言也提供直接訪問(wèn)文件和索引順序文件。文件的兩種常見(jiàn)用途:針對(duì)外部操作環(huán)境的數(shù)據(jù)輸入和輸出。作為數(shù)據(jù)的臨時(shí)存儲(chǔ),以解決高速內(nèi)存不足的問(wèn)題。文件的部件稱為記錄。但有別于記錄類(lèi)型。66順序文件順序文件是相同類(lèi)型部件的線性序列,其長(zhǎng)度可變且沒(méi)有固定的最大上界。(當(dāng)然,受外存大小限制)一個(gè)典型的PASCAL聲明:

Master:fileofEmployeeRec;文件部件的類(lèi)型可以是基本類(lèi)型,

溫馨提示

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