




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+應(yīng)用與開發(fā)案例教程(上),第1章 引言,在20世紀(jì)70年代后期,由于應(yīng)用程序的規(guī)模變得越來越大,程序的復(fù)雜性也越來越難以控制。為了滿足管理程序復(fù)雜性的需要,1980年,貝爾實(shí)驗(yàn)室的Bjarne Stroustrup開始對(duì)C進(jìn)行改進(jìn)和擴(kuò)充。最初的成果稱為“帶類的C”,1983年正式取名為C+,在經(jīng)歷了3次修改后,于1994年制定了ANSI C+標(biāo)準(zhǔn)草案。由于C+是建立在C的基礎(chǔ)之上的,所以它包括了C的全部特征、屬性和優(yōu)點(diǎn),同時(shí)它還支持面向?qū)ο蟮木幊獭?C+是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,使用它可以實(shí)現(xiàn)面向?qū)ο蟮某绦蛟O(shè)計(jì)。面向?qū)ο蟮脑O(shè)計(jì)與面向過程的設(shè)計(jì)是有很大區(qū)別的,面向?qū)ο蟮某绦蛟O(shè)計(jì)是在面向過
2、程的程序設(shè)計(jì)的基礎(chǔ)上一個(gè)質(zhì)的飛躍。要學(xué)會(huì)面向?qū)ο蟮某绦蛟O(shè)計(jì),首先要學(xué)會(huì)一種支持面向?qū)ο蟮恼Z言,而C+語言就是其中的一種。目前C+已經(jīng)被應(yīng)用于程序設(shè)計(jì)的眾多應(yīng)用領(lǐng)域中,它尤其適用于中等和大型的程序開發(fā)項(xiàng)目。從開發(fā)時(shí)間、費(fèi)用到形成的軟件,1.1 C+語言概述,1.1 C+語言概述,的可重用性、可擴(kuò)充性、可維護(hù)性和可靠性等方面都顯示出了C+語言的優(yōu)越性。 首次學(xué)習(xí)面向?qū)ο蟮某绦蛟O(shè)計(jì)語言時(shí),總會(huì)碰到一些在傳統(tǒng)的面向過程的程序設(shè)計(jì)語言中從未見到過的概念,如:類、對(duì)象、封裝、繼承、多態(tài)性等,而這些都是面向?qū)ο笳Z言的基本概念。,1.2 面向?qū)ο笳Z言的基本概念,在深入了解和學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)之前,有必要先簡
3、單介紹一下面向?qū)ο蠓椒ㄖ械膸讉€(gè)基本概念。 1.2.1 對(duì)象 在現(xiàn)實(shí)世界中,對(duì)象有兩大類。我們身邊存在的一切有形事物和抽象概念都是對(duì)象。有形事物的例子如一個(gè)學(xué)生、一輛汽車、一本書、一個(gè)工廠、一個(gè)書店、一棵樹等;抽象概念的例子如學(xué)校校規(guī)、企業(yè)規(guī)章等。我們身邊發(fā)生的一切事件都是對(duì)象,例如一場(chǎng)乒乓球比賽、一次寒流侵襲、一次到商場(chǎng)的購物過程、一次到銀行的提款過程等。不同的對(duì)象具有各自不同的特征和功能。例如,工廠具有工廠的特征和功能、書店具有書店的特征和功能、購物過程具有購物過程的特征和功能、提款過程具有提款過程的特征和功能等。 由此可見,現(xiàn)實(shí)世界中的對(duì)象具有如下特征: 有一個(gè)名字用來唯一標(biāo)識(shí)該對(duì)象;,1
4、.2.1 對(duì)象,有一組狀態(tài)用來描述其特征; 有一組操作用來實(shí)現(xiàn)其功能。 例如,有一個(gè)學(xué)生對(duì)象,姓名叫李四,性別男,專業(yè)為計(jì)算機(jī),學(xué)歷為碩士,可從事計(jì)算機(jī)軟件開發(fā)和計(jì)算機(jī)硬件開發(fā)的工作。在這里,李四是這個(gè)對(duì)象的名字;男性,計(jì)算機(jī)專業(yè)和碩士學(xué)歷是這個(gè)學(xué)生的特征;能從事計(jì)算機(jī)軟件開發(fā)和計(jì)算機(jī)硬件開發(fā)是這個(gè)學(xué)生具有的能力(功能)。,1.2.2 類,類是面向?qū)ο蠓椒ㄖ械牧硪粋€(gè)重要的概念。在現(xiàn)實(shí)世界中,類這個(gè)術(shù)語是對(duì)一組相似對(duì)象的抽象描述。例如,作為學(xué)生對(duì)象,有張三、李四、王五等,每個(gè)對(duì)象有不同的性別,專業(yè)和學(xué)歷特征,有從事不同行業(yè)的能力。而學(xué)生類則是對(duì)學(xué)生這類對(duì)象所應(yīng)具有的共同特征和能力(功能)集合的抽
5、象描述;教師這類對(duì)象應(yīng)具有性別,專業(yè)和學(xué)歷特征,應(yīng)有從事某種行業(yè)的能力。 在面向?qū)ο蠓椒ㄖ?,類是?duì)具有相同屬性和相同服務(wù)的一組相似對(duì)象的抽象,或者說,類所包含的屬性和服務(wù)描述了一組對(duì)象的共有屬性和服務(wù)。即類是建立某個(gè)具體對(duì)象時(shí)使用的模型或模板。 在面向?qū)ο蠓椒ㄖ?,程序設(shè)計(jì)的主體是類。類是相同屬性和服務(wù)的封裝體,因此類具有模塊性;類是對(duì)具有相同屬性和服務(wù)的一個(gè)或多個(gè)對(duì)象的抽象描述,因此類具有抽象性;子類,1.2.2 類,可以在繼承父類所有屬性和服務(wù)的基礎(chǔ)上,再增加自己特有的屬性和服務(wù),因此類具有繼承性。類的這種模塊性和抽象性,使面向?qū)ο蠓椒ㄔO(shè)計(jì)的模塊較傳統(tǒng)方法設(shè)計(jì)的模塊具有更好的可重用性;類的這
6、種繼承性使面向?qū)ο蠓椒ㄔO(shè)計(jì)的軟件系統(tǒng)的可維護(hù)性和系統(tǒng)升級(jí)能力得到大大的提高。,1.2.3 封裝,類是對(duì)具有相同特征的客觀對(duì)象的抽象描述,它將抽象出來的數(shù)據(jù)和操作行為封裝在類中。在類中將一部分行為作為對(duì)外部的接口,將數(shù)據(jù)和其他行為進(jìn)行有效的隱藏。用戶只需根據(jù)對(duì)象提供的外部接口訪問對(duì)象,這就可以達(dá)到對(duì)數(shù)據(jù)訪問權(quán)限的合理控制。 封裝具有以下幾個(gè)特性: (1)一個(gè)清楚的邊界,所有對(duì)象的內(nèi)部變化范圍限制在這個(gè)邊界內(nèi); (2)一個(gè)接口,用來描述對(duì)象本身和其他對(duì)象之間的相互作用; (3)受保護(hù)的內(nèi)部實(shí)現(xiàn),它給出了由軟件對(duì)象提供的功能細(xì)節(jié),在外部不能訪問這些細(xì)節(jié)。,1.2.4 繼承,繼承是面向?qū)ο蠓椒ㄖ兄匾?/p>
7、概念之一。在面向?qū)ο蠓椒ㄖ?,若一個(gè)類描述的是一組對(duì)象的共性信息,另一個(gè)類描述的是一組對(duì)象的特性信息,則可以把前一個(gè)類定義為父類,后一個(gè)類定義為子類。父類通常也稱作基類,子類通常也稱作派生類。繼承是指子類自動(dòng)繼承父類中定義的屬性和服務(wù)。 面向?qū)ο蠓椒ㄖ械念惖睦^承性,完全和現(xiàn)實(shí)世界中人們描述事物的方法相同。例如,在現(xiàn)實(shí)世界中,我們要描述貓、狗、豬、馬、羊,由于貓、狗、豬、馬、羊都屬于哺乳類動(dòng)物,所以我們可以先定義哺乳類動(dòng)物。我們把哺乳類動(dòng)物所共有的特征和習(xí)性定義在哺乳類動(dòng)物中,然后再分別定義貓、狗、豬、馬、羊類動(dòng)物各自特有的特征和習(xí)性。由一般到特殊的分類方法是人們總結(jié)出的高效率地分類認(rèn)識(shí)世界的方法
8、。 一個(gè)系統(tǒng)中所有類按繼承關(guān)系構(gòu)成的結(jié)構(gòu)圖稱作該系統(tǒng)的類層次或類結(jié)構(gòu)。類層次是一個(gè)樹狀結(jié)構(gòu)。從類層次可知,除,1.2.4 繼承,一個(gè)類層次最根部的類外,所有類的上層可以有父類,下層可以有子類。類層次最根部的類只有子類。 在一個(gè)面向?qū)ο笙到y(tǒng)中,當(dāng)類層次中的所有類只允許有一個(gè)父類時(shí),這樣的類繼承稱作單重繼承;當(dāng)類層次中的所有類允許有一個(gè)以上的父類時(shí),這樣的類繼承稱為多重繼承。 類的繼承具有傳遞性,即如果類C是類B的子類,類B是類A的子類,則類C不僅繼承類B的所有屬性和服務(wù),還繼承類A的所有屬性和服務(wù)。因此,一個(gè)類實(shí)際上繼承了它所在類層次以上層的全部父類的屬性和服務(wù)。這樣,屬于該類的對(duì)象也就不僅具有
9、自己的屬性和服務(wù),還具有該類的所有父類的屬性和服務(wù)。 子類會(huì)繼承基類中的全部屬性,但子類對(duì)基類中服務(wù)的繼承方式可分為三種類型: 完全繼承,即子類全部繼承基類中的所有服務(wù);,1.2.4 繼承,修改繼承,即子類對(duì)基類中的一些服務(wù)在繼承的基礎(chǔ)上做一些補(bǔ)充或修改。修改繼承實(shí)現(xiàn)的具體方法是在子類中重新設(shè)計(jì)基類中的這些服務(wù),重新設(shè)計(jì)的服務(wù)將首先執(zhí)行原先基類中的服務(wù),然后執(zhí)行補(bǔ)充或修改的服務(wù); 覆蓋繼承,即在子類中重新設(shè)計(jì)基類中的這些服務(wù),從而用新的服務(wù)覆蓋了舊的服務(wù)。覆蓋繼承實(shí)現(xiàn)的具體方法是在子類中重新設(shè)計(jì)基類中的這些服務(wù),重新設(shè)計(jì)的服務(wù)執(zhí)行作為新的內(nèi)容的代碼。由于系統(tǒng)對(duì)對(duì)象中服務(wù)的查找次序是沿類層次的當(dāng)
10、前類逐層向上查找的,所以當(dāng)該對(duì)象在當(dāng)前層查找到了所要的服務(wù)(此時(shí)為新服務(wù))后,就不再向上層查找以前定義的服務(wù)(此時(shí)為舊服務(wù))了,從而實(shí)現(xiàn)了覆蓋繼承。 利用繼承,特別是修改繼承和覆蓋繼承,使得大型軟件的功能修改和功能擴(kuò)充較傳統(tǒng)的方法容易了許多。當(dāng)要對(duì)系統(tǒng)的一些原有功能進(jìn)行補(bǔ)充和修改時(shí),可以重新設(shè)計(jì)原先類的一,1.2.4 繼承,個(gè)子類,利用修改繼承方法重新設(shè)計(jì)子類中要補(bǔ)充和修改的服務(wù);當(dāng)要廢棄系統(tǒng)的一些原有功能,重新設(shè)計(jì)完全不同的新的功能時(shí),可以重新設(shè)計(jì)原先類的一個(gè)子類,利用覆蓋繼承方法重新設(shè)計(jì)子類中要更改的服務(wù);當(dāng)要對(duì)系統(tǒng)添加一些新的功能時(shí),可以重新設(shè)計(jì)原先類的一子類,并新設(shè)計(jì)一個(gè)新的服務(wù)來實(shí)現(xiàn)
11、所要添加的新的功能。 對(duì)象的繼承性是面向?qū)ο蠓椒ǖ年P(guān)鍵技術(shù)。這是因?yàn)閷?duì)象的繼承性所構(gòu)成的對(duì)象的層次關(guān)系和人類認(rèn)識(shí)客觀世界的過程和方法吻合。從而使得人們能夠用和認(rèn)識(shí)客觀世界一致的方法來設(shè)計(jì)軟件。,1.2.5 多態(tài)性,面向?qū)ο蠓椒ǖ牧硗庖粋€(gè)基本概念是多態(tài)性。所謂多態(tài),是指一個(gè)名字有多種語義;或一個(gè)相同界面有多種實(shí)現(xiàn)。 下面我們來考察多態(tài)性問題的一個(gè)類比問題。當(dāng)一汽車司機(jī)為避免撞車時(shí)剎車,他關(guān)心的是快速剎車(效果),而不是關(guān)心剎車是鼓式剎車還是盤式剎車(實(shí)現(xiàn)方法的細(xì)節(jié))。這里,剎車的使用與剎車的結(jié)果是分離的概念,可能有多種結(jié)構(gòu)的剎車,它們的使用方法是相同的。相同的使用方法(相同界面)對(duì)應(yīng)于不同種類的
12、剎車結(jié)構(gòu)(多種實(shí)現(xiàn)),這反映了多態(tài)性的思想。 與此類似,用戶在使用函數(shù)編程時(shí),他關(guān)心的是該函數(shù)的功能及其使用界面,并不需要了解該函數(shù)的使用界面與函數(shù)的哪一種實(shí)現(xiàn)方法相匹配。也就是說,在設(shè)計(jì)這一級(jí)上,軟件人員只關(guān)心“施加在對(duì)象上的動(dòng)作是什么”,而不必關(guān)心,1.2.5 多態(tài)性,“如何實(shí)現(xiàn)這個(gè)動(dòng)作”以及“實(shí)現(xiàn)這個(gè)動(dòng)作有多少種方法”的細(xì)節(jié)。在面向?qū)ο笳Z言中,重載(或稱為超載)表達(dá)了最簡單的多態(tài)性。比較容易理解的是函數(shù)的重載。例如: void f(int,char,char); void f(int,char); void f(int,int); void f(char,char); 這幾個(gè)函數(shù)都具有相
13、同的函數(shù)名f,但其參數(shù)不同,它們的函數(shù)體也可以完全不同,編譯能根據(jù)其函數(shù)的不同而自動(dòng)選擇相應(yīng)的函數(shù)體進(jìn)行匹配。因此,一個(gè)函數(shù)名代表了多種函數(shù)的實(shí)現(xiàn)(函數(shù)體)。 對(duì)于函數(shù)重載,若函數(shù)調(diào)用(界面)與哪一個(gè)函數(shù)體(函數(shù)實(shí)現(xiàn))相匹配是在編譯時(shí)確定的,稱為早期匹配;若函數(shù)調(diào)用與哪一個(gè)函數(shù)體的匹配是在運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行的,稱之為晚期,1.2.5 多態(tài)性,匹配。 C+中的虛函數(shù)提供了晚期匹配帶來的良好特征。函數(shù)重載強(qiáng)調(diào)的是函數(shù)名相同,函數(shù)參數(shù)和函數(shù)體不相同(編譯器能根據(jù)參數(shù)的差別進(jìn)行識(shí)別和匹配)。虛函數(shù)則強(qiáng)調(diào)單界面多實(shí)現(xiàn)版本的方法,亦即函數(shù)名,返回類型,函數(shù)參數(shù)的類型、順序、個(gè)數(shù)完全相同,但函數(shù)體可以完全不同,
14、這在編譯階段是無法識(shí)別的,只能由系統(tǒng)在運(yùn)行時(shí)動(dòng)態(tài)地尋找所需的函數(shù)體進(jìn)行匹配。 在C+中,通過繼承關(guān)系,基類及其派生類之間構(gòu)成一個(gè)樹形結(jié)構(gòu)(多重繼承為圖結(jié)構(gòu)),樹中的每個(gè)類(基類或派生類)都可以說明一個(gè)具有虛特性的函數(shù),稱為虛函數(shù)。那么在這個(gè)類極其派生類中都可以定義這個(gè)虛函數(shù)的不同實(shí)現(xiàn),但要求這些不同實(shí)現(xiàn)必須遵守相同的函數(shù)界面,否則虛特性丟失。使用時(shí),系統(tǒng)能在運(yùn)行時(shí)刻動(dòng)態(tài)地尋找所需的實(shí)現(xiàn)版本。具體,1.2.5 多態(tài)性,細(xì)節(jié)請(qǐng)參見第章。,1.3 面向?qū)ο蟮乃季S與方法,1.3.1 面向?qū)ο笫且环N認(rèn)知方法學(xué) 從人們對(duì)事物的認(rèn)識(shí)過程來看,主要有以下兩種方法: 從一般到特殊的演繹方法。以學(xué)校為例,最初人們
15、看到的是“學(xué)?!边@樣一個(gè)詞。在對(duì)其進(jìn)行分類的過程中可以不斷理解這一詞的含義:進(jìn)一步分類知道學(xué)校有大學(xué)、中學(xué)和小學(xué)之分;再進(jìn)一步又知道大學(xué)分綜合性大學(xué)、理、工、農(nóng)、醫(yī)、文科大學(xué)等;每一科分為不同專業(yè);專業(yè)分為不同方向在分類達(dá)到一定程度后,用面向?qū)ο蟮姆椒?,?duì)已經(jīng)分好的各類對(duì)象進(jìn)行狀態(tài)描述和功能定義,可以明確這一類對(duì)象所能完成的工作。最后一步就是怎樣讓這一類對(duì)象運(yùn)轉(zhuǎn)起來,也就是使各類對(duì)象建立聯(lián)系。對(duì)于學(xué)校這一系統(tǒng),就是建立各教學(xué)保障單位和各教學(xué)單位的聯(lián)系,教師和學(xué)生的聯(lián)系,從而使整個(gè)教學(xué)系統(tǒng)正常運(yùn)轉(zhuǎn)起來。,1.3.1 面向?qū)ο笫且环N認(rèn)知方法學(xué),從特殊到一般的歸納方法。今天看到一條黃狗,它是一個(gè)對(duì)象
16、,明天又看到一條黑狗,它也是一個(gè)對(duì)象,這兩個(gè)對(duì)象除了顏色不一樣外,其他有關(guān)狗的特征完全一樣。這樣,便可以構(gòu)造一個(gè)類:“狗”,其中描述了狗的所有共同特征,比如:會(huì)叫、具有犬齒、嗅覺靈敏、具有顏色、忠誠等。而黃狗和黑狗都是這個(gè)“狗”類的實(shí)例。因此,面向?qū)ο蠛苓m合這種認(rèn)知方式的組合。 面向?qū)ο筇峁┝藦囊话愕教厥獾难堇[手段(如繼承等),又提供了從特殊到一般的歸納形式(如類等),從而說明它是一種很好的認(rèn)知方法。這種分類、歸納的方法在面向?qū)ο笤O(shè)計(jì)中是很重要的。,1.3.2 面向?qū)ο蠓椒ㄅc結(jié)構(gòu)化程序設(shè)計(jì)方法,結(jié)構(gòu)化程序設(shè)計(jì)強(qiáng)調(diào)了功能抽象和模塊性,它將解決問題的過程看作是一個(gè)處理過程。面向?qū)ο蟪绦蛟O(shè)計(jì)則綜合了
17、功能抽象和數(shù)據(jù)抽象,它將解決問題的過程看作是一個(gè)分類演繹的過程。下面對(duì)這兩種方法進(jìn)行簡單的比較: 模塊與對(duì)象 結(jié)構(gòu)化程序設(shè)計(jì)中,模塊是對(duì)功能的抽象,每個(gè)模塊都是一個(gè)處理單位,它有輸入和輸出。而對(duì)象是包括數(shù)據(jù)和操作的整體,是將數(shù)據(jù)和功能的抽象和統(tǒng)一??梢哉f,對(duì)象包含了模塊。 過程調(diào)用與消息傳遞 在結(jié)構(gòu)化程序設(shè)計(jì)中,過程為一獨(dú)立實(shí)體,顯示地被它的使用者所見,而且,對(duì)于相同的輸入?yún)?shù),每一次過程調(diào)用,其輸出結(jié)果是相同的。,1.3.2 面向?qū)ο蠓椒ㄅc結(jié)構(gòu)化程序設(shè)計(jì)方法,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,方法(或操作)是隸屬于對(duì)象的,它不是獨(dú)立存在的實(shí)體,而是對(duì)象的功能體現(xiàn)。從對(duì)象實(shí)現(xiàn)機(jī)制看,對(duì)象是一臺(tái)自動(dòng)機(jī),其
18、中封裝的數(shù)據(jù)表示了對(duì)象的狀態(tài),該狀態(tài)只能由對(duì)象的操作改變它。每當(dāng)需要改變狀態(tài)的時(shí)候,只能由其他對(duì)象向該對(duì)象發(fā)送消息(在C+中,借助于成員函數(shù)調(diào)用來實(shí)現(xiàn)消息發(fā)送)。對(duì)象響應(yīng)消息后,按照消息模式找出匹配的方法,并執(zhí)行該方法(C+語言是執(zhí)行函數(shù)調(diào)用)。應(yīng)該注意,發(fā)送消息和過程調(diào)用是不同的,發(fā)送消息只是觸發(fā)自動(dòng)機(jī),同樣的輸入?yún)?shù),可能因自動(dòng)機(jī)狀態(tài)不同,其輸出結(jié)果也不同。因此,同一消息的多次發(fā)送可能產(chǎn)生不同的結(jié)果。 類型與類 類型與類都是對(duì)數(shù)據(jù)和操作的抽象,即定義了一組具有共同特征的數(shù)據(jù)和可操縱這些數(shù)據(jù)的一組操作,但類所定義,1.3.2 面向?qū)ο蠓椒ㄅc結(jié)構(gòu)化程序設(shè)計(jì)方法,的數(shù)據(jù)集(包括數(shù)據(jù)和操作)比常規(guī)
19、語言的類型定義的數(shù)據(jù)集要復(fù)雜得多。 模塊的可重用性 結(jié)構(gòu)化程序設(shè)計(jì)方法的核心是逐步細(xì)化。這種自頂向下的方法是通過不斷在程序的控制結(jié)構(gòu)中增加細(xì)節(jié)來開發(fā)程序。它生產(chǎn)的模塊往往為了滿足特定需要??芍赜眯暂^差。 面向?qū)ο蟪绦蛟O(shè)計(jì)以數(shù)據(jù)結(jié)構(gòu)為中心開發(fā)模塊,同時(shí)一體化地考慮操作的功能,抓住了程序設(shè)計(jì)中最不易變的部分?jǐn)?shù)據(jù),因此對(duì)象具有良好的可重用性。,第2章 C+編程基礎(chǔ),在這一章,我們將介紹C+編程的一些基礎(chǔ)知識(shí)。如C+中的常量與變量,基本數(shù)據(jù)類型,復(fù)合數(shù)據(jù)類型,指針,運(yùn)算符,基本的輸入和輸出,基本的程序控制語句等等。要學(xué)好C+,就必須要掌握這些基礎(chǔ)知識(shí)。學(xué)完本章以后,相信能為讀者奠定良好的C+編程基礎(chǔ)。
20、,2.1 概述,2.2 常量與變量,2.2.1 標(biāo)識(shí)符 標(biāo)識(shí)符是對(duì)變量、函數(shù)標(biāo)號(hào)和其它各種用戶定義對(duì)象的命名。標(biāo)識(shí)符的長度可以是一個(gè)或多個(gè)字符。標(biāo)識(shí)符必須以字母或下劃線開頭,隨后的字符必須是字母、數(shù)字或下劃線。下面是一些正確或錯(cuò)誤標(biāo)識(shí)符命名的實(shí)例。 正確形式 錯(cuò)誤形式 count 2 count test23 hi! there high_balance highbalance C+語言中的字母是要區(qū)分大小寫的。因此,count、 Count、 COUNT是三個(gè)不同的標(biāo)識(shí)符。標(biāo)識(shí)符不能和C+語言的關(guān)鍵字相同,也不能和用戶已編制的函數(shù)或C+語言庫函數(shù)同名。,2.2 常量與變量,2.2.2 常量
21、常量是不接受程序修改的固定值,常量可為任意數(shù)據(jù)類型,如下例所示: char d、n、5 int 221、1 、210 、-234 long int 3500、-344 short int 10、-12、930 unsigned int 1000、87、4000 float 1234.23、46.34e-3 double 12.23、23133、-0.986234 還有另一種預(yù)定義數(shù)據(jù)類型的常量,這就是串。串常量括在雙撇號(hào)之間。如This is a test。請(qǐng)注意,不要把字符和串相混淆。單個(gè)字符常量是由單撇號(hào)括起來的,如 a 。,2.2 常量與變量,2.2.3 變量 其值可以改變的量稱為變量。
22、一個(gè)變量有一個(gè)名字(標(biāo)識(shí)符),在內(nèi)存中占據(jù)一定的存儲(chǔ)單元。在該存儲(chǔ)單元中存放變量的值。所有的C+變量必須在使用之前定義。定義變量的一般形式是:type variable_list; 這里的type必須是有效的C+數(shù)據(jù)類型,variable_list(變量表)可以由一個(gè)或多個(gè)由逗號(hào)分隔的標(biāo)識(shí)符名構(gòu)成。下面給出一些定義變量的范例: int i, j, l; short int n; unsigned int x; double balance, profit,money;,2.3 基本數(shù)據(jù)類型,2.3.1 整型數(shù)據(jù) 1.整型常量 它是由十進(jìn)制、八進(jìn)制、十六進(jìn)制數(shù)字表示的整數(shù)值。 十進(jìn)制常數(shù)的形式是
23、: digits 這里digits可以是從0到9的一個(gè)或多個(gè)十進(jìn)制數(shù)位,第一位不能是0。 八進(jìn)制常數(shù)的形式是: 0digits 在此,digits可以是一個(gè)或多個(gè)八進(jìn)制數(shù)( 07之間),起始0是必須的引導(dǎo)符。 十六進(jìn)制常數(shù)的形式是: 0 xhdigits 0Xhdigits,2.3 基本數(shù)據(jù)類型,2. 整型變量 前面已提到, C+規(guī)定在程序中所有用到的變量都必須在程序中指定其類型。 如下列程序: main() int a,b,c,d; /*指定a , b , c , d 為整型變量*/ unsigned u; /*指定u為無符號(hào)整型變量*/ a=1; b=-21; u=11; c=a+u; d
24、=b+u; printf(a+u=%d, b+u=%dn,c,d); 程序的輸出結(jié)果為: a+u=12, b+u=1 0 可以看到不同類型的整型數(shù)據(jù)可以進(jìn)行算術(shù)運(yùn)算。在本例中是int型數(shù)據(jù)與unsingned int型數(shù)據(jù)進(jìn)行相加減運(yùn)算。,2.3 基本數(shù)據(jù)類型,2.3.2 實(shí)型數(shù)據(jù) 1.實(shí)型常量 實(shí)型常量又稱浮點(diǎn)常量,是一個(gè)十進(jìn)制表示的符號(hào)實(shí)數(shù)。符號(hào)實(shí)數(shù)的值包括整數(shù)部分、 尾數(shù)部分和指數(shù)部分。實(shí)型常量的形式如下: digits .digits E|e+|-digits 在此digits是一位或多位十進(jìn)制數(shù)字(從09)。E(也可用e)是指數(shù)符號(hào)。小數(shù)點(diǎn)之前是整數(shù)部分,小數(shù)點(diǎn)之后是尾數(shù)部分,它們是
25、可省略的。,2.3 基本數(shù)據(jù)類型,2.實(shí)型變量 實(shí)型變量分為單精度(float型)和雙精度(double型)。對(duì)每一個(gè)實(shí)型變量都應(yīng)在使用前加以聲明。如: float x,y; / *指定x , y為單精度實(shí)數(shù)* / double z; / *指定z為雙精度實(shí)數(shù)* / 在一般系統(tǒng)中,一個(gè)float型數(shù)據(jù)在內(nèi)存中占4個(gè)字節(jié)(32位)。一個(gè)double型數(shù)據(jù)占8個(gè)字節(jié)(64位)。單精度實(shí)數(shù)提供7位有效數(shù)字,雙精度提供1 5 1 6位有效數(shù)字,數(shù)值的范圍隨機(jī)器系統(tǒng)而異。值得注意的是,實(shí)型常量是double型,當(dāng)把一個(gè)實(shí)型常量賦給一個(gè)float型變量時(shí),系統(tǒng)會(huì)截取相應(yīng)的有效位數(shù)。例如: float a;
26、 a = 111111.111 ;由于float型變量只能接收7位有效數(shù)字,因此最后兩位小數(shù)不起作用。如果將a改為double型,則能全部接收上述9位數(shù)字并存儲(chǔ)在變量a中。,2.3 基本數(shù)據(jù)類型,2.3.3 字符型數(shù)據(jù) 1.字符常量 字符常量是指用一對(duì)單引號(hào)括起來的一個(gè)字符。如 c,9,!。字符常量中的單引號(hào)只起定界作用并不表示字符本身。單引號(hào)中的字符不能是單引號(hào)()和反斜杠(),它們是特有的表示法。這將在轉(zhuǎn)義字符中介紹。字符是按其所對(duì)應(yīng)的ASCII碼值來存儲(chǔ)的,一個(gè)字符占一個(gè)字節(jié)。例如: 字符ASCII碼值(十進(jìn)制) ! 33 0 48 1 49 9 57 A 65 B 66 a 97 b
27、98,2.3 基本數(shù)據(jù)類型,2.字符串常量 字符串常量是指用一對(duì)雙引號(hào)括起來的一串字符。雙引號(hào)只起定界作用,雙引號(hào)括起的 字符串中不能是雙引號(hào)()和反斜杠(),它們特有的表示法在轉(zhuǎn)義字符中介紹。例如: China,Cprogram, YES 它表示c1和c2為字符變量,各放一個(gè)字符。因此可以用下面語句對(duì)c1、c2賦值: c1 = a; c2 = b;,2.4 復(fù)合數(shù)據(jù)類型,2.4.1 數(shù)組 1.概述 在程序設(shè)計(jì)中,把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個(gè)數(shù)組可以分解為多個(gè)數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類
28、型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。本節(jié)將主要介紹數(shù)值數(shù)組和字符數(shù)組。,2.4 復(fù)合數(shù)據(jù)類型,2. 一維數(shù)組的定義和引用 一維數(shù)組的定義方式: 在程序設(shè)計(jì)中,使用數(shù)組必須先進(jìn)行定義。 一維數(shù)組的定義方式為: 類型說明符 數(shù)組名 常量表達(dá)式; 其中: 類型說明符是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。 數(shù)組名是用戶定義的數(shù)組標(biāo)識(shí)符。 方括號(hào)中的常量表達(dá)式表示數(shù)據(jù)元素的個(gè)數(shù),也稱為數(shù)組的長度。 例如: int a10; 說明整型數(shù)組a,有10個(gè)元素。 float b10,c20; 說明實(shí)型數(shù)組b,有10個(gè)元素,實(shí)型數(shù)組c,有20個(gè)元素。 char
29、 ch20; 說明字符數(shù)組ch,有20個(gè)元素。,2.4 復(fù)合數(shù)據(jù)類型,對(duì)于數(shù)組類型說明應(yīng)注意以下幾點(diǎn): 數(shù)組的類型實(shí)際上是指數(shù)組元素的取值類型。對(duì)于同一個(gè)數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。 數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識(shí)符的書寫規(guī)定。 數(shù)組名不能與其它變量名相同。 方括號(hào)中常量表達(dá)式表示數(shù)組元素的個(gè)數(shù),如a5表示數(shù)組a有 5個(gè)元素。但是其下標(biāo)從0開始計(jì)算的。因此5個(gè)元素分別為a0,a1,a2,a3,a4。 不能在方括號(hào)中用變量來表示元素的個(gè)數(shù),但是可以是符號(hào)常數(shù)或常量表達(dá)式。 允許在同一個(gè)類型說明中,說明多個(gè)數(shù)組和多個(gè)變量。,2.4 復(fù)合數(shù)據(jù)類型,例如: int a,b,c,d,k110,k2
30、20; 一維數(shù)組元素的引用: 數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量, 其標(biāo)識(shí)方法為數(shù)組名后跟一個(gè)下標(biāo)。下標(biāo)表示了元素在數(shù)組中的順序號(hào)。 數(shù)組元素的一般形式為: 數(shù)組名下標(biāo) 其中下標(biāo)只能為整型常量或整型表達(dá)式。如為小數(shù)時(shí),編譯器將自動(dòng)取整。 例如: a5 ai+j ai+ 都是合法的數(shù)組元素。 數(shù)組元素通常也稱為下標(biāo)變量。必須先定義數(shù)組,才能使用下標(biāo)變量。只能逐個(gè)地使用下標(biāo)變量,而不能一次引用整個(gè)數(shù)組。 例如,輸出有10個(gè)元素的數(shù)組必須使用循環(huán)語句逐個(gè)輸出各下標(biāo)變量: for(i=0; i10; i+) printf(%d,ai); 而不能用一個(gè)語句輸出整個(gè)數(shù)組。 下面的寫法是錯(cuò)誤
31、的: printf(%d,a);,2.4 復(fù)合數(shù)據(jù)類型,3. 一維數(shù)組的初始化 給數(shù)組賦值的方法除了用賦值語句對(duì)數(shù)組元素逐個(gè)賦值外, 還可采用初始化賦值和動(dòng)態(tài)賦值的方法。 數(shù)組初始化賦值是指在數(shù)組定義時(shí)給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的。這樣將減少運(yùn)行時(shí)間,提高效率。 初始化賦值的一般形式為: 類型說明符 數(shù)組名常量表達(dá)式=值,值值; 其中在 中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號(hào)間隔。 例如: int a10= 0,1,2,3,4,5,6,7,8,9 ; 相當(dāng)于a0=0;a1=1.a9=9; 對(duì)數(shù)組的初始化賦值還有以下幾點(diǎn)規(guī)定: 可以只給部分元素賦初值。 當(dāng) 中值的個(gè)數(shù)少
32、于元素個(gè)數(shù)時(shí),只給前面部分元素賦值。,2.4 復(fù)合數(shù)據(jù)類型,例如: int a10=0,1,2,3,4; 表示只給a0a45個(gè)元素賦值,而后5個(gè)元素自動(dòng)賦0值。 只能給元素逐個(gè)賦值,不能給數(shù)組整體賦值。 例如給十個(gè)元素全部賦1值,只能寫為: int a10=1,1,1,1,1,1,1,1,1,1; 而不能寫為: int a10=1; 如給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個(gè)數(shù)。 例如: int a5=1,2,3,4,5; 可寫為: int a=1,2,3,4,5;,2.4 復(fù)合數(shù)據(jù)類型,4.二維數(shù)組的定義和引用 二維數(shù)組的定義: 前面介紹的數(shù)組只有一個(gè)下標(biāo),稱為一維數(shù)組,其數(shù)組
33、元素也稱為單下標(biāo)變量。在實(shí)際問題中有很多量是二維的或多維的,我們可以在程序設(shè)計(jì)時(shí)構(gòu)造多維數(shù)組。多維數(shù)組元素有多個(gè)下標(biāo),以標(biāo)識(shí)它在數(shù)組中的位置,所以也稱為多下標(biāo)變量。本小節(jié)只介紹二維數(shù)組,多維數(shù)組可由二維數(shù)組類推而得到。 二維數(shù)組定義的一般形式是: 類型說明符 數(shù)組名常量表達(dá)式1常量表達(dá)式2 其中常量表達(dá)式1 表示第一維下標(biāo)的長度,常量表達(dá)式2 表示第二維下標(biāo)的長度。,2.4 復(fù)合數(shù)據(jù)類型,例如: int a34; 說明了一個(gè)三行四列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有34個(gè),即: a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22
34、,a23 二維數(shù)組在概念上是二維的,即是說其下標(biāo)在兩個(gè)方向上變化,下標(biāo)變量在數(shù)組中的位置也處于一個(gè)平面之中,而不是象一維數(shù)組只是一個(gè)向量。但是,實(shí)際的硬件存儲(chǔ)器卻是連續(xù)編址的,也就是說存儲(chǔ)器單元是按一維線性排列的。如何在一維存儲(chǔ)器中存放二維數(shù)組,可有兩種方式:一種是按行排列, 即放完一行之后順次放入第二行。另一種是按列排列, 即放完一列之后再順次放入第二列。在+語言中,二維數(shù)組是按行排列的。,2.4 復(fù)合數(shù)據(jù)類型,例如: a34 表示a數(shù)組三行四列的元素。 下標(biāo)變量和數(shù)組說明在形式中有些相似,但這兩者具有完全不同的含義。數(shù)組說明的方括號(hào)中給出的是某一維的長度,即可取下標(biāo)的最大值;而數(shù)組元素中的
35、下標(biāo)是該元素在數(shù)組中的位置標(biāo)識(shí)。前者只能是常量,后者可以是常量,變量或表達(dá)式。 二維數(shù)組的初始化: 二維數(shù)組初始化也是在類型說明時(shí)給各下標(biāo)變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。 例如對(duì)數(shù)組a53: 按行分段賦值可寫為: int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85 ; 按行連續(xù)賦值可寫為: int a53= 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85; 這兩種賦初值的結(jié)果是完全相同的。,2.4 復(fù)合數(shù)據(jù)類型,5. 字符數(shù)組 字符數(shù)組的定義: 用來存放字符量的數(shù)組稱為字符
36、數(shù)組。形式與前面介紹的數(shù)值數(shù)組相同。 例如: char c10; 由于字符型和整型通用,也可以定義為int c10但這時(shí)每個(gè)數(shù)組元素占2個(gè)字節(jié)的內(nèi)存單元。 字符數(shù)組也可以是二維或多維數(shù)組。 例如: char c510; 即為二維字符數(shù)組。 字符數(shù)組的初始化: 字符數(shù)組也允許在定義時(shí)作初始化賦值。其方法和數(shù)值數(shù)組類似。,2.4 復(fù)合數(shù)據(jù)類型,例如: char c10=c, , p, r, o, g, r, a,m; 賦值后各元素的值為: c0的值為c,c1的值為 ,c2的值為p,c3的值為r ,c4的值為0 ,c5的值為g ,c6的值為r ,c7的值為a ,c8的值為m,其中c9未賦值,系統(tǒng)自動(dòng)
37、賦予0值。 當(dāng)對(duì)全體元素賦初值時(shí)也可以省去長度說明。 例如: char c=c, ,p,r,o,g,r,a,m; 這時(shí)C數(shù)組的長度自動(dòng)定為9。,2.4 復(fù)合數(shù)據(jù)類型,字符數(shù)組的引用: 可見下面的例子: main() int i,j; char a5=B,A,S,I,C,d,B,A,S,E; for(i=0;i=1;i+) for(j=0;j=4;j+) printf(%c,aij); printf(n); 本例的二維字符數(shù)組由于在初始化時(shí)全部元素都賦以初值,因此一維下標(biāo)的長度可以不加以說明。,2.4 復(fù)合數(shù)據(jù)類型,2.4.2 結(jié)構(gòu) 結(jié)構(gòu)的定義:由基本數(shù)據(jù)類型構(gòu)成的、并用一個(gè)標(biāo)識(shí)符來命名的各種變
38、量的組合。 在結(jié)構(gòu)中可以使用不同的數(shù)據(jù)類型。 1結(jié)構(gòu)說明和結(jié)構(gòu)變量定義 在C或C+中, 結(jié)構(gòu)也是一種數(shù)據(jù)類型, 可以使用結(jié)構(gòu)變量, 因此, 象其它 類型的變量一樣, 在使用結(jié)構(gòu)變量時(shí)要先對(duì)其定義。 定義結(jié)構(gòu)變量的一般格式為: struct 結(jié)構(gòu)名 類型 變量名; 類型 變量名; . 結(jié)構(gòu)變量; 結(jié)構(gòu)名是結(jié)構(gòu)的標(biāo)識(shí)符不是變量名。 類型可以為整型、浮點(diǎn)型、字符型、指針型等。 構(gòu)成結(jié)構(gòu)的每一個(gè)類型變量稱為結(jié)構(gòu)成員, 它象數(shù)組的元素一樣, 但數(shù)組中元素是以下標(biāo)來訪問的, 而結(jié)構(gòu)是按變量名字來訪問成員的。,2.4 復(fù)合數(shù)據(jù)類型,下面舉一個(gè)例子來說明怎樣定義結(jié)構(gòu)變量。 struct string char
39、 name10; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; person; 這個(gè)例子定義了一個(gè)結(jié)構(gòu)名為string的結(jié)構(gòu)變量person, 如果省略變量名 person, 則變成對(duì)結(jié)構(gòu)的說明。用已說明的結(jié)構(gòu)名也可定義結(jié)構(gòu)變量。例如可以這樣定義: struct string char name8; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; ; struct string pers
40、on;,2.4 復(fù)合數(shù)據(jù)類型,結(jié)構(gòu)變量的使用 結(jié)構(gòu)是一個(gè)新的數(shù)據(jù)類型, 因此結(jié)構(gòu)變量也可以象其它類型的變量一樣賦值、 運(yùn)算, 不同的是結(jié)構(gòu)變量以成員作為基本變量。 結(jié)構(gòu)成員的表示方式為: 結(jié)構(gòu)變量.成員名 如果將結(jié)構(gòu)變量.成員名看成一個(gè)整體, 則這個(gè)整體的數(shù)據(jù)類型與結(jié)構(gòu)中 該成員的數(shù)據(jù)類型相同, 這樣就可象前面所講的變量那樣使用。,2.4 復(fù)合數(shù)據(jù)類型,3. 結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針 結(jié)構(gòu)是一種新的數(shù)據(jù)類型, 同樣可以有結(jié)構(gòu)數(shù)組和結(jié)構(gòu)指針。 (1) 結(jié)構(gòu)數(shù)組 結(jié)構(gòu)數(shù)組就是具有相同結(jié)構(gòu)類型的變量集合。假如要定義一個(gè)班級(jí)40個(gè)同學(xué) 的姓名、性別、年齡和住址, 可以定義成一個(gè)結(jié)構(gòu)數(shù)組。如下所示: stru
41、ct string char name8; char sex2; int age; char addr40; ; struct string student40; 需要指出的是結(jié)構(gòu)數(shù)組成員的訪問是以數(shù)組元素為結(jié)構(gòu)變量的, 其形式為: 結(jié)構(gòu)數(shù)組元素.成員名,2.4 復(fù)合數(shù)據(jù)類型,(2)結(jié)構(gòu)指針 結(jié)構(gòu)指針是指向結(jié)構(gòu)的指針(指針將在后面的章節(jié)中講到)。它由一個(gè)加在結(jié)構(gòu)變量名前的* 操作符來定 義, 例如用前面已說明的結(jié)構(gòu)定義一個(gè)結(jié)構(gòu)指針如下: struct string char name8; char sex2; int age; char addr40; *student; 也可省略結(jié)構(gòu)指針名只
42、作結(jié)構(gòu)說明, 然后再用下面的語句定義結(jié)構(gòu)指針。 struct string *student; 使用結(jié)構(gòu)指針對(duì)結(jié)構(gòu)成員的訪問, 與結(jié)構(gòu)變量對(duì)結(jié)構(gòu)成員的訪問在表達(dá)方式 上有所不同。結(jié)構(gòu)指針對(duì)結(jié)構(gòu)成員的訪問表示為: 結(jié)構(gòu)指針名-結(jié)構(gòu)成員 其中-是兩個(gè)符號(hào)-和的組合, 好象一個(gè)箭頭指向結(jié)構(gòu)成員。,2.4 復(fù)合數(shù)據(jù)類型,例如要 給上面定義的結(jié)構(gòu)中name和age賦值, 可以用下面語句: strcpy(student-name, Lu G.C); student-age=18; 實(shí)際上, student-name就是(*student).name的縮寫形式。 注意: 1) 結(jié)構(gòu)作為一種數(shù)據(jù)類型, 因此定
43、義的結(jié)構(gòu)變量或結(jié)構(gòu)指針變量同樣有局部變量和全程變量, 視定義的位置而定。 2) 結(jié)構(gòu)變量名不是指向該結(jié)構(gòu)的地址, 這與數(shù)組名的含義不同, 因此若需要求結(jié)構(gòu)中第一個(gè)成員的首地址應(yīng)該是 數(shù)據(jù)類型 成員名; . 聯(lián)合變量名; 聯(lián)合表示幾個(gè)變量公用一個(gè)內(nèi)存位置, 在不同的時(shí)間保存不同的數(shù)據(jù)類型和不同長度的變量。 下例表示說明一個(gè)聯(lián)合a_bc: union a_bc int i; char mm; ;,2.4 復(fù)合數(shù)據(jù)類型,聯(lián)合訪問其成員的方法與結(jié)構(gòu)相同。同樣聯(lián)合變量也可以定義成數(shù)組或指針, 但定義為指針時(shí), 也要用-符號(hào), 此時(shí)聯(lián)合訪問成員可表示成: 聯(lián)合名-成員名 另外, 聯(lián)合既可以出現(xiàn)在結(jié)構(gòu)內(nèi),
44、它的成員也可以是結(jié)構(gòu)。 例如: struct int age; char *addr; union int i; char *ch; x; y10; 若要訪問結(jié)構(gòu)變量y1中聯(lián)合x的成員i, 可以寫成: y1.x.i; 若要訪問結(jié)構(gòu)變量y2中聯(lián)合x的字符串指針ch的第一個(gè)字符可寫成: *y2.x.ch; 若寫成y2.x.*ch;是錯(cuò)誤的。 結(jié)構(gòu)和聯(lián)合是由區(qū)別的,區(qū)別如下: (1). 結(jié)構(gòu)和聯(lián)合都是由多個(gè)不同的數(shù)據(jù)類型成員組成, 但在任何同一時(shí)刻, 聯(lián)合中只存放了一個(gè)被選中的成員, 而結(jié)構(gòu)的所有成員都存在。 (2). 對(duì)于聯(lián)合的不同成員賦值, 將會(huì)對(duì)其它成員重寫, 原來成員的值就不存 在了, 而對(duì)
45、于結(jié)構(gòu)的不同成員賦值是互不影響的。,2.4 復(fù)合數(shù)據(jù)類型,2.4.4枚舉 枚舉是一個(gè)被命名的整型常數(shù)的集合, 枚舉在日常生活中很常見。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 就是一個(gè)枚舉。 枚舉的說明與結(jié)構(gòu)和聯(lián)合相似, 其形式為: enum 枚舉名 標(biāo)識(shí)符=整型常數(shù), 標(biāo)識(shí)符=整型常數(shù), . 標(biāo)識(shí)符=整型常數(shù), 枚舉變量;,2.4 復(fù)合數(shù)據(jù)類型,如果枚舉沒有初始化, 即省掉=整型常數(shù)時(shí), 則從第一個(gè)標(biāo)識(shí)符開始, 順次賦給標(biāo)識(shí)符0, 1, 2, .。但當(dāng)枚舉中的某個(gè)成員賦值后, 其后的成員按依
46、次加1的規(guī)則確定其值。 例如下列枚舉說明后, x1, x2, x3, x4的值分別為0, 1, 2, 3。 enum stringx1, x2, x3, x4x; 當(dāng)定義改變成: enum string x1, x2=0, x3=50, x4, x; 則x1=0, x2=0, x3=50, x4=51,2.4 復(fù)合數(shù)據(jù)類型,注意: 1. 枚舉中每個(gè)成員(標(biāo)識(shí)符)結(jié)束符是, 不是;, 最后一個(gè)成員可省略 ,。 2. 初始化時(shí)可以賦負(fù)數(shù), 以后的標(biāo)識(shí)符仍依次加1。 3. 枚舉變量只能取枚舉說明結(jié)構(gòu)中的某個(gè)標(biāo)識(shí)符常量。,2.5 指針基礎(chǔ),2.5.1 指針的基本概念和定義 我們知道變量在計(jì)算機(jī)內(nèi)是占有
47、一塊存貯區(qū)域的, 變量的值就存放在這塊區(qū) 域之中, 在計(jì)算機(jī)內(nèi)部, 通過訪問或修改這塊區(qū)域的內(nèi)容來訪問或修改相應(yīng)的變 量。C+語言中, 對(duì)于變量的訪問形式之一, 就是先求出變量的地址, 然后 再通過地址對(duì)它進(jìn)行訪問, 這就是這里所要論述的指針及其指針變量。,2.5 指針基礎(chǔ),所謂變量的指針, 實(shí)際上指變量的地址。變量的地址雖然在形式上好象類似 于整數(shù), 但在概念上不同于以前介紹過的整數(shù), 它屬于一種新的數(shù)據(jù)類型, 即指 針類型。C+中, 一般用指針來指明這樣一個(gè)表達(dá)式 則 首先說明了它是一指針類型的變量, 注意在定義中不要漏寫符號(hào)*, 否則它為 一般的整型變量了。另外, 在定義中的int 表示
48、該指針變量為指向整型數(shù)的指針 類型的變量, 有時(shí)也可稱ip為指向整數(shù)的指針。ip是一個(gè)變量, 它專門存放整型 變量的地址。 指針變量的一般定義為: 類型標(biāo)識(shí)符 *標(biāo)識(shí)符;,2.5 指針基礎(chǔ),其中標(biāo)識(shí)符是指針變量的名字, 標(biāo)識(shí)符前加了*號(hào), 表示該變量是指針變 量, 而最前面的類型標(biāo)識(shí)符表示該指針變量所指向的變量的類型。一個(gè)指針變 量只能指向同一種類型的變量, 也就是講, 我們不能定義一個(gè)指針變量, 既能指 向一整型變量又能指向雙精度變量。 指針變量在定義中允許帶初始化項(xiàng)。如: int i, *ip=,2.5 指針基礎(chǔ),2.5.2 指針變量的引用 既然在指針變量中只能存放地址, 因此, 在使用中
49、不要將一個(gè)整數(shù)賦給一指 針變量。下面的賦值是不合法的: int *ip; ip=100; 假設(shè) int i=200, x; int *ip; 我們定義了兩個(gè)整型變量i, x, 還定義了一個(gè)指向整型數(shù)的指針變量ip。i, x中 可存放整數(shù), 而ip中只能存放整型變量的地址。我們可以把i的地址賦給ip: ip= 此時(shí)指針變量ip指向整型變量i, 假設(shè)變量i的地址為1800, 這個(gè)賦值可形象理解,2.5 指針基礎(chǔ),通過指針訪問它所指向的一個(gè)變量是以間接訪問的形式進(jìn)行的, 所以比直接訪問一個(gè)變量要費(fèi)時(shí)間, 而且不直觀, 因?yàn)橥ㄟ^指針要訪問哪一個(gè)變量, 取決于指針的值(即指向), 例如*p2=*p1;實(shí)
50、際上就是j=i;, 前者不僅速度慢而且目的不明。但由于指針是變量, 我們可以通過改變它們的指向, 以間接訪問不同的變量, 這給程序員帶來靈活性, 也使程序代碼編寫得更為簡潔和有效。 指針變量可出現(xiàn)在表達(dá)式中, 設(shè) int x, y *px= px+*/,2.6 運(yùn)算符及其使用,2.6.1 賦值運(yùn)算符 簡單賦值運(yùn)算符和表達(dá)式: 簡單賦值運(yùn)算符記為“=”。由“= ”連接的式子稱為賦值表達(dá)式。其一般形式為: 變量=表達(dá)式 例如: x=a+b w=sin(a)+sin(b) y=i+-j,2.6 運(yùn)算符及其使用,2.6.2 數(shù)學(xué)運(yùn)算符,在C+語言中,運(yùn)算符“ +”、“”、“*”和“ /”的用法與大多數(shù)
51、計(jì)算機(jī)語言的相同,幾乎可用于所有C+語言內(nèi)定義的數(shù)據(jù)類型。當(dāng)“ /”被用于整數(shù)或字符時(shí),結(jié)果取整。例如,在整數(shù)除法中,10/3=3。 一元減法的實(shí)際效果等于用- 1乘單個(gè)操作數(shù),即任何數(shù)值前放置減號(hào)將改變其符號(hào)。模 運(yùn)算符“%”在C+語言中也同它在其它語言中的用法相同。切記,模運(yùn)算取整數(shù)除法的余數(shù),所以“%”不能用于float和double類型。,2.6 運(yùn)算符及其使用,2.6.3 關(guān)系運(yùn)算符和邏輯運(yùn)算符 關(guān)系運(yùn)算符中的“關(guān)系”二字指的是一個(gè)值與另一個(gè)值之間的關(guān)系,邏輯運(yùn)算符中的 “邏輯”二字指的是連接關(guān)系的方式。因?yàn)殛P(guān)系和邏輯運(yùn)算符常在一起使用,所以將它們放在一起討論。 關(guān)系和邏輯運(yùn)算符概念
52、中的關(guān)鍵是True(真)和Flase(假)。C+語言中,非0為True,0為Flase。使用關(guān)系或邏輯運(yùn)算符的表達(dá)式對(duì)Flase和Ture分別返回值0或1 。,2.6 運(yùn)算符及其使用,2.6.4 ?運(yùn)算符 C+語言提供了一個(gè)可以代替某些i f - t h e n - e l s e語句的簡便易用的操作符?。該操作符是三元的,其一般形式為: EXP1 ? EXE2 : EXP3 EXP1,EXP2和EXP3是表達(dá)式,注意冒號(hào)的用法和位置。 操作符“ ? ”作用是這樣的,在計(jì)算EXP1之后,如果數(shù)值為True,則計(jì)算EXP2,并將結(jié)果作為整個(gè)表達(dá)式的數(shù)值;如果EXP1的值為Flase,則計(jì)算EXP
53、3,并以它的結(jié)果作為整個(gè)表達(dá)式的值,2.6 運(yùn)算符及其使用,請(qǐng)看下例: x = 10 ; y = x 9 ? 100 : 200 ; 例中,賦給y的數(shù)值是100,如果x被賦給比9小的值,y的值將為200,若用i f - e l s e語句改寫,有 下面的等價(jià)程序: x = 1 0 ; if(x9) y=100; else y=200;,2.6 運(yùn)算符及其使用,2.6.5 自增和自減運(yùn)算符 C+語言中有兩個(gè)很有用的運(yùn)算符,通常在其它計(jì)算機(jī)語言中是找不到它們的自增和自減運(yùn)算符, + +和- -。運(yùn)算符“ + +”是操作數(shù)加1,而“- -”是操作數(shù)減1,換句話說: x = x +1 ; 同+x ;
54、x = x-1 ; 同- - x ;自增和自減運(yùn)算符可用在操作數(shù)之前,也可放在其后,例如: x = x+1;可寫成+x;或x+;但在表達(dá)式中這兩種用法是有區(qū)別的。,2.6 運(yùn)算符及其使用,自增或自減運(yùn)算符在操作數(shù)之前, C+語言在引用操作數(shù)之前就先執(zhí)行加1或減1操作;運(yùn)算符在操作數(shù)之后,C+語言就先引用操作數(shù)的值,而后再進(jìn)行加1或減1操作。請(qǐng)看下例:x=10 ; y =+x ; 此時(shí),y = 11。如果程序改為:x=10 ; y = x+ ;則y=10。在這兩種情況下, x都被置為11,但區(qū)別在于設(shè)置的時(shí)刻,這種對(duì)自增和自減發(fā)生時(shí)刻的控制是非常有用的。在大多數(shù)C+編譯程序中,為自增和自減操作生
55、成的程序代碼比等價(jià)的賦值語句生成的代碼要快得多,所以盡可能采用加1或減1運(yùn)算符是一種好的選擇。,2.6 運(yùn)算符及其使用,2.6.6位運(yùn)算符 C+語言支持全部的位操作符(Bitwise Operators)。它具有支持匯編語言所具有的運(yùn)算能力。位操作是對(duì)字節(jié)或字中的位(bit)進(jìn)行測(cè)試、置位或移位處理,這里字節(jié)或字是針對(duì)C+標(biāo)準(zhǔn)中的c h a r和i n t數(shù)據(jù)類型而言的。位操作不能用于float、double、long double、void或其它復(fù)雜類型。圖2-9給出了位操作的操作符。位操作中的AND、OR和NOT(1的補(bǔ)碼)的真值表與邏輯運(yùn)算等價(jià),唯一不同的是位操作是逐位進(jìn)行運(yùn)算的。,2.
56、6 運(yùn)算符及其使用,2.6.7 逗號(hào)操作符 作為一個(gè)操作符,逗號(hào)把幾個(gè)表達(dá)式串在一起。逗號(hào)操作符的左側(cè)總是作為v o i d (無值),這意味著其右邊表達(dá)式的值變?yōu)橐远禾?hào)分開的整個(gè)表達(dá)式的值。例如: x = (y=3, y+1) ; 這行將3賦給y,然后將4賦給x,因?yàn)槎禾?hào)操作符的優(yōu)先級(jí)比賦值操作符優(yōu)先級(jí)低,所以 必須使用括號(hào)。實(shí)際上,逗號(hào)表示操作順序。當(dāng)它在賦值語句右邊使用時(shí),所賦的值是逗號(hào)分隔開的表中最后那個(gè)表達(dá)式的值。例如: y = 1 0 ; x = ( y = y - 5 , 2 5 / y ) ; 執(zhí)行后,x的值是5,因?yàn)閥的起始值10,減去5之后結(jié)果再除以25,得到最終結(jié)果。 在
57、某種意義上可以認(rèn)為,逗號(hào)操作符和標(biāo)準(zhǔn)英語的and是同義詞。,2.6 運(yùn)算符及其使用,2.6.8 sizeof運(yùn)算符 sizeof運(yùn)算符用于計(jì)算變量在內(nèi)存中的字節(jié)數(shù),結(jié)果是 unsigned 類型,sizeof 是一元運(yùn)算符,它的優(yōu)先級(jí)最高。下面程序說明sizeof運(yùn)算符使用:,2.6 運(yùn)算符及其使用,【例2-1】 #include void main() char a; int i; long l; double d; cout size of cahr : sizeof(a) endl; cout size of int : sizeof(i) endl; cout size of long
58、 : sizeof(l) endl; cout size of double: sizeof(d) endl; 程序的輸出結(jié)果為: size of cahr :1 size of int : 4 size of long : 4 size of double: 8,2.7 C+中的基本輸入和輸出,在講輸入輸出之前,我們先來看一段程序: 【例2-2】 現(xiàn)在我們要讓用戶輸入三個(gè)數(shù) a、b、c,由程序來計(jì)算 a*(b+c).程序的輸出結(jié)果是由用戶的輸入決定的: #include void main() int a,b,c,r; cout a; cin b; cin c; r=a*(b+c); cout a*(b+c)= r endl; ,2.7 C+中的基本輸入和輸出,分析這個(gè)程序,第一行中的include是C編譯器的一個(gè)編譯指令,iostream.h 是C+系統(tǒng)的一個(gè)系統(tǒng)文件,經(jīng)常稱其為頭文件。這行的作用是指示C十十編譯器,將文件iostream.h的內(nèi)容代替代程序中include指令所在的這一行,這使得程序可以使用在文件iostream.h中定義的標(biāo)準(zhǔn)輸入和輸出操作。,2.7 C+中的基本輸入和輸出,c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 成長記錄袋小學(xué)生課件
- 2025年環(huán)保廁所項(xiàng)目合作計(jì)劃書
- 2025年重鉻酸鈉項(xiàng)目建議書
- 加強(qiáng)網(wǎng)絡(luò)信息安全保障條例
- 公司股份制實(shí)施方案
- 金融投資顧問投資風(fēng)險(xiǎn)提示書
- 小王子電影故事解讀
- StA-IFN-1-生命科學(xué)試劑-MCE
- 石油庫區(qū)員工年終總結(jié)
- 2025年太陽能熱發(fā)電系統(tǒng)項(xiàng)目合作計(jì)劃書
- TPU材料項(xiàng)目可行性研究報(bào)告寫作參考范文
- 試用期考核合格證明表
- 常見八種疾病
- 膠粘劑基礎(chǔ)知識(shí)及產(chǎn)品詳解(課堂PPT)
- 鍋爐補(bǔ)給水陰陽混床操作步序表
- 2005年第4季度北京住房租賃指導(dǎo)價(jià)格
- 醫(yī)療器械GMP計(jì)算機(jī)軟件確認(rèn)控制程序
- 蘇教版最新五年級(jí)數(shù)學(xué)上冊(cè)應(yīng)用題與解決問題專項(xiàng)
- 髖關(guān)節(jié)置換術(shù)男性患者留置尿管最佳時(shí)機(jī)探析和對(duì)策
- [爆笑小品校園劇本7人]爆笑小品校園劇本
- 岸邊集裝箱起重機(jī)CMS系統(tǒng)
評(píng)論
0/150
提交評(píng)論