版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C+應(yīng)用與開發(fā)案例教程(上),第1章 引言,在20世紀(jì)70年代后期,由于應(yīng)用程序的規(guī)模變得越來越大,程序的復(fù)雜性也越來越難以控制。為了滿足管理程序復(fù)雜性的需要,1980年,貝爾實(shí)驗(yàn)室的Bjarne Stroustrup開始對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),同時它還支持面向?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ǔ)上一個質(zhì)的飛躍。要學(xué)會面向?qū)ο蟮某绦蛟O(shè)計(jì),首先要學(xué)會一種支持面向?qū)ο蟮恼Z言,而C+語言就是其中的一種。目前C+已經(jīng)被應(yīng)用于程序設(shè)計(jì)的眾多應(yīng)用領(lǐng)域中,它尤其適用于中等和大型的程序開發(fā)項(xiàng)目。從開發(fā)時間、費(fèi)用到形成的軟件,1.1 C+語言概述,1.1 C+語言概述,的可重用性、可擴(kuò)充性、可維護(hù)性和可靠性等方面都顯示出了C+語言的優(yōu)越性。 首次學(xué)習(xí)面向?qū)ο蟮某绦蛟O(shè)計(jì)語言時,總會碰到一些在傳統(tǒng)的面向過程的程序設(shè)計(jì)語言中從未見到過的概念,如:類、對象、封裝、繼承、多態(tài)性等,而這些都是面向?qū)ο笳Z言的基本概念。,1.2 面向?qū)ο笳Z言的基本概念,在深入了解和學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)之前,有必要先簡
3、單介紹一下面向?qū)ο蠓椒ㄖ械膸讉€基本概念。 1.2.1 對象 在現(xiàn)實(shí)世界中,對象有兩大類。我們身邊存在的一切有形事物和抽象概念都是對象。有形事物的例子如一個學(xué)生、一輛汽車、一本書、一個工廠、一個書店、一棵樹等;抽象概念的例子如學(xué)校校規(guī)、企業(yè)規(guī)章等。我們身邊發(fā)生的一切事件都是對象,例如一場乒乓球比賽、一次寒流侵襲、一次到商場的購物過程、一次到銀行的提款過程等。不同的對象具有各自不同的特征和功能。例如,工廠具有工廠的特征和功能、書店具有書店的特征和功能、購物過程具有購物過程的特征和功能、提款過程具有提款過程的特征和功能等。 由此可見,現(xiàn)實(shí)世界中的對象具有如下特征: 有一個名字用來唯一標(biāo)識該對象;,1
4、.2.1 對象,有一組狀態(tài)用來描述其特征; 有一組操作用來實(shí)現(xiàn)其功能。 例如,有一個學(xué)生對象,姓名叫李四,性別男,專業(yè)為計(jì)算機(jī),學(xué)歷為碩士,可從事計(jì)算機(jī)軟件開發(fā)和計(jì)算機(jī)硬件開發(fā)的工作。在這里,李四是這個對象的名字;男性,計(jì)算機(jī)專業(yè)和碩士學(xué)歷是這個學(xué)生的特征;能從事計(jì)算機(jī)軟件開發(fā)和計(jì)算機(jī)硬件開發(fā)是這個學(xué)生具有的能力(功能)。,1.2.2 類,類是面向?qū)ο蠓椒ㄖ械牧硪粋€重要的概念。在現(xiàn)實(shí)世界中,類這個術(shù)語是對一組相似對象的抽象描述。例如,作為學(xué)生對象,有張三、李四、王五等,每個對象有不同的性別,專業(yè)和學(xué)歷特征,有從事不同行業(yè)的能力。而學(xué)生類則是對學(xué)生這類對象所應(yīng)具有的共同特征和能力(功能)集合的抽
5、象描述;教師這類對象應(yīng)具有性別,專業(yè)和學(xué)歷特征,應(yīng)有從事某種行業(yè)的能力。 在面向?qū)ο蠓椒ㄖ?,類是對具有相同屬性和相同服?wù)的一組相似對象的抽象,或者說,類所包含的屬性和服務(wù)描述了一組對象的共有屬性和服務(wù)。即類是建立某個具體對象時使用的模型或模板。 在面向?qū)ο蠓椒ㄖ?,程序設(shè)計(jì)的主體是類。類是相同屬性和服務(wù)的封裝體,因此類具有模塊性;類是對具有相同屬性和服務(wù)的一個或多個對象的抽象描述,因此類具有抽象性;子類,1.2.2 類,可以在繼承父類所有屬性和服務(wù)的基礎(chǔ)上,再增加自己特有的屬性和服務(wù),因此類具有繼承性。類的這種模塊性和抽象性,使面向?qū)ο蠓椒ㄔO(shè)計(jì)的模塊較傳統(tǒng)方法設(shè)計(jì)的模塊具有更好的可重用性;類的這
6、種繼承性使面向?qū)ο蠓椒ㄔO(shè)計(jì)的軟件系統(tǒng)的可維護(hù)性和系統(tǒng)升級能力得到大大的提高。,1.2.3 封裝,類是對具有相同特征的客觀對象的抽象描述,它將抽象出來的數(shù)據(jù)和操作行為封裝在類中。在類中將一部分行為作為對外部的接口,將數(shù)據(jù)和其他行為進(jìn)行有效的隱藏。用戶只需根據(jù)對象提供的外部接口訪問對象,這就可以達(dá)到對數(shù)據(jù)訪問權(quán)限的合理控制。 封裝具有以下幾個特性: (1)一個清楚的邊界,所有對象的內(nèi)部變化范圍限制在這個邊界內(nèi); (2)一個接口,用來描述對象本身和其他對象之間的相互作用; (3)受保護(hù)的內(nèi)部實(shí)現(xiàn),它給出了由軟件對象提供的功能細(xì)節(jié),在外部不能訪問這些細(xì)節(jié)。,1.2.4 繼承,繼承是面向?qū)ο蠓椒ㄖ兄匾?/p>
7、概念之一。在面向?qū)ο蠓椒ㄖ?,若一個類描述的是一組對象的共性信息,另一個類描述的是一組對象的特性信息,則可以把前一個類定義為父類,后一個類定義為子類。父類通常也稱作基類,子類通常也稱作派生類。繼承是指子類自動繼承父類中定義的屬性和服務(wù)。 面向?qū)ο蠓椒ㄖ械念惖睦^承性,完全和現(xiàn)實(shí)世界中人們描述事物的方法相同。例如,在現(xiàn)實(shí)世界中,我們要描述貓、狗、豬、馬、羊,由于貓、狗、豬、馬、羊都屬于哺乳類動物,所以我們可以先定義哺乳類動物。我們把哺乳類動物所共有的特征和習(xí)性定義在哺乳類動物中,然后再分別定義貓、狗、豬、馬、羊類動物各自特有的特征和習(xí)性。由一般到特殊的分類方法是人們總結(jié)出的高效率地分類認(rèn)識世界的方法
8、。 一個系統(tǒng)中所有類按繼承關(guān)系構(gòu)成的結(jié)構(gòu)圖稱作該系統(tǒng)的類層次或類結(jié)構(gòu)。類層次是一個樹狀結(jié)構(gòu)。從類層次可知,除,1.2.4 繼承,一個類層次最根部的類外,所有類的上層可以有父類,下層可以有子類。類層次最根部的類只有子類。 在一個面向?qū)ο笙到y(tǒng)中,當(dāng)類層次中的所有類只允許有一個父類時,這樣的類繼承稱作單重繼承;當(dāng)類層次中的所有類允許有一個以上的父類時,這樣的類繼承稱為多重繼承。 類的繼承具有傳遞性,即如果類C是類B的子類,類B是類A的子類,則類C不僅繼承類B的所有屬性和服務(wù),還繼承類A的所有屬性和服務(wù)。因此,一個類實(shí)際上繼承了它所在類層次以上層的全部父類的屬性和服務(wù)。這樣,屬于該類的對象也就不僅具有
9、自己的屬性和服務(wù),還具有該類的所有父類的屬性和服務(wù)。 子類會繼承基類中的全部屬性,但子類對基類中服務(wù)的繼承方式可分為三種類型: 完全繼承,即子類全部繼承基類中的所有服務(wù);,1.2.4 繼承,修改繼承,即子類對基類中的一些服務(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)對對象中服務(wù)的查找次序是沿類層次的當(dāng)
10、前類逐層向上查找的,所以當(dāng)該對象在當(dāng)前層查找到了所要的服務(wù)(此時為新服務(wù))后,就不再向上層查找以前定義的服務(wù)(此時為舊服務(wù))了,從而實(shí)現(xiàn)了覆蓋繼承。 利用繼承,特別是修改繼承和覆蓋繼承,使得大型軟件的功能修改和功能擴(kuò)充較傳統(tǒng)的方法容易了許多。當(dāng)要對系統(tǒng)的一些原有功能進(jìn)行補(bǔ)充和修改時,可以重新設(shè)計(jì)原先類的一,1.2.4 繼承,個子類,利用修改繼承方法重新設(shè)計(jì)子類中要補(bǔ)充和修改的服務(wù);當(dāng)要廢棄系統(tǒng)的一些原有功能,重新設(shè)計(jì)完全不同的新的功能時,可以重新設(shè)計(jì)原先類的一個子類,利用覆蓋繼承方法重新設(shè)計(jì)子類中要更改的服務(wù);當(dāng)要對系統(tǒng)添加一些新的功能時,可以重新設(shè)計(jì)原先類的一子類,并新設(shè)計(jì)一個新的服務(wù)來實(shí)現(xiàn)
11、所要添加的新的功能。 對象的繼承性是面向?qū)ο蠓椒ǖ年P(guān)鍵技術(shù)。這是因?yàn)閷ο蟮睦^承性所構(gòu)成的對象的層次關(guān)系和人類認(rèn)識客觀世界的過程和方法吻合。從而使得人們能夠用和認(rèn)識客觀世界一致的方法來設(shè)計(jì)軟件。,1.2.5 多態(tài)性,面向?qū)ο蠓椒ǖ牧硗庖粋€基本概念是多態(tài)性。所謂多態(tài),是指一個名字有多種語義;或一個相同界面有多種實(shí)現(xiàn)。 下面我們來考察多態(tài)性問題的一個類比問題。當(dāng)一汽車司機(jī)為避免撞車時剎車,他關(guān)心的是快速剎車(效果),而不是關(guān)心剎車是鼓式剎車還是盤式剎車(實(shí)現(xiàn)方法的細(xì)節(jié))。這里,剎車的使用與剎車的結(jié)果是分離的概念,可能有多種結(jié)構(gòu)的剎車,它們的使用方法是相同的。相同的使用方法(相同界面)對應(yīng)于不同種類的
12、剎車結(jié)構(gòu)(多種實(shí)現(xiàn)),這反映了多態(tài)性的思想。 與此類似,用戶在使用函數(shù)編程時,他關(guān)心的是該函數(shù)的功能及其使用界面,并不需要了解該函數(shù)的使用界面與函數(shù)的哪一種實(shí)現(xiàn)方法相匹配。也就是說,在設(shè)計(jì)這一級上,軟件人員只關(guān)心“施加在對象上的動作是什么”,而不必關(guān)心,1.2.5 多態(tài)性,“如何實(shí)現(xiàn)這個動作”以及“實(shí)現(xiàn)這個動作有多少種方法”的細(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); 這幾個函數(shù)都具有相
13、同的函數(shù)名f,但其參數(shù)不同,它們的函數(shù)體也可以完全不同,編譯能根據(jù)其函數(shù)的不同而自動選擇相應(yīng)的函數(shù)體進(jìn)行匹配。因此,一個函數(shù)名代表了多種函數(shù)的實(shí)現(xiàn)(函數(shù)體)。 對于函數(shù)重載,若函數(shù)調(diào)用(界面)與哪一個函數(shù)體(函數(shù)實(shí)現(xiàn))相匹配是在編譯時確定的,稱為早期匹配;若函數(shù)調(diào)用與哪一個函數(shù)體的匹配是在運(yùn)行時動態(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ù)則強(qiáng)調(diào)單界面多實(shí)現(xiàn)版本的方法,亦即函數(shù)名,返回類型,函數(shù)參數(shù)的類型、順序、個數(shù)完全相同,但函數(shù)體可以完全不同,
14、這在編譯階段是無法識別的,只能由系統(tǒng)在運(yùn)行時動態(tài)地尋找所需的函數(shù)體進(jìn)行匹配。 在C+中,通過繼承關(guān)系,基類及其派生類之間構(gòu)成一個樹形結(jié)構(gòu)(多重繼承為圖結(jié)構(gòu)),樹中的每個類(基類或派生類)都可以說明一個具有虛特性的函數(shù),稱為虛函數(shù)。那么在這個類極其派生類中都可以定義這個虛函數(shù)的不同實(shí)現(xiàn),但要求這些不同實(shí)現(xiàn)必須遵守相同的函數(shù)界面,否則虛特性丟失。使用時,系統(tǒng)能在運(yùn)行時刻動態(tài)地尋找所需的實(shí)現(xiàn)版本。具體,1.2.5 多態(tài)性,細(xì)節(jié)請參見第章。,1.3 面向?qū)ο蟮乃季S與方法,1.3.1 面向?qū)ο笫且环N認(rèn)知方法學(xué) 從人們對事物的認(rèn)識過程來看,主要有以下兩種方法: 從一般到特殊的演繹方法。以學(xué)校為例,最初人們
15、看到的是“學(xué)?!边@樣一個詞。在對其進(jìn)行分類的過程中可以不斷理解這一詞的含義:進(jìn)一步分類知道學(xué)校有大學(xué)、中學(xué)和小學(xué)之分;再進(jìn)一步又知道大學(xué)分綜合性大學(xué)、理、工、農(nóng)、醫(yī)、文科大學(xué)等;每一科分為不同專業(yè);專業(yè)分為不同方向在分類達(dá)到一定程度后,用面向?qū)ο蟮姆椒?,對已?jīng)分好的各類對象進(jìn)行狀態(tài)描述和功能定義,可以明確這一類對象所能完成的工作。最后一步就是怎樣讓這一類對象運(yùn)轉(zhuǎn)起來,也就是使各類對象建立聯(lián)系。對于學(xué)校這一系統(tǒng),就是建立各教學(xué)保障單位和各教學(xué)單位的聯(lián)系,教師和學(xué)生的聯(lián)系,從而使整個教學(xué)系統(tǒng)正常運(yùn)轉(zhuǎn)起來。,1.3.1 面向?qū)ο笫且环N認(rèn)知方法學(xué),從特殊到一般的歸納方法。今天看到一條黃狗,它是一個對象
16、,明天又看到一條黑狗,它也是一個對象,這兩個對象除了顏色不一樣外,其他有關(guān)狗的特征完全一樣。這樣,便可以構(gòu)造一個類:“狗”,其中描述了狗的所有共同特征,比如:會叫、具有犬齒、嗅覺靈敏、具有顏色、忠誠等。而黃狗和黑狗都是這個“狗”類的實(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)了功能抽象和模塊性,它將解決問題的過程看作是一個處理過程。面向?qū)ο蟪绦蛟O(shè)計(jì)則綜合了
17、功能抽象和數(shù)據(jù)抽象,它將解決問題的過程看作是一個分類演繹的過程。下面對這兩種方法進(jìn)行簡單的比較: 模塊與對象 結(jié)構(gòu)化程序設(shè)計(jì)中,模塊是對功能的抽象,每個模塊都是一個處理單位,它有輸入和輸出。而對象是包括數(shù)據(jù)和操作的整體,是將數(shù)據(jù)和功能的抽象和統(tǒng)一??梢哉f,對象包含了模塊。 過程調(diào)用與消息傳遞 在結(jié)構(gòu)化程序設(shè)計(jì)中,過程為一獨(dú)立實(shí)體,顯示地被它的使用者所見,而且,對于相同的輸入?yún)?shù),每一次過程調(diào)用,其輸出結(jié)果是相同的。,1.3.2 面向?qū)ο蠓椒ㄅc結(jié)構(gòu)化程序設(shè)計(jì)方法,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,方法(或操作)是隸屬于對象的,它不是獨(dú)立存在的實(shí)體,而是對象的功能體現(xiàn)。從對象實(shí)現(xiàn)機(jī)制看,對象是一臺自動機(jī),其
18、中封裝的數(shù)據(jù)表示了對象的狀態(tài),該狀態(tài)只能由對象的操作改變它。每當(dāng)需要改變狀態(tài)的時候,只能由其他對象向該對象發(fā)送消息(在C+中,借助于成員函數(shù)調(diào)用來實(shí)現(xiàn)消息發(fā)送)。對象響應(yīng)消息后,按照消息模式找出匹配的方法,并執(zhí)行該方法(C+語言是執(zhí)行函數(shù)調(diào)用)。應(yīng)該注意,發(fā)送消息和過程調(diào)用是不同的,發(fā)送消息只是觸發(fā)自動機(jī),同樣的輸入?yún)?shù),可能因自動機(jī)狀態(tài)不同,其輸出結(jié)果也不同。因此,同一消息的多次發(fā)送可能產(chǎn)生不同的結(jié)果。 類型與類 類型與類都是對數(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è)計(jì)中最不易變的部分?jǐn)?shù)據(jù),因此對象具有良好的可重用性。,第2章 C+編程基礎(chǔ),在這一章,我們將介紹C+編程的一些基礎(chǔ)知識。如C+中的常量與變量,基本數(shù)據(jù)類型,復(fù)合數(shù)據(jù)類型,指針,運(yùn)算符,基本的輸入和輸出,基本的程序控制語句等等。要學(xué)好C+,就必須要掌握這些基礎(chǔ)知識。學(xué)完本章以后,相信能為讀者奠定良好的C+編程基礎(chǔ)。
20、,2.1 概述,2.2 常量與變量,2.2.1 標(biāo)識符 標(biāo)識符是對變量、函數(shù)標(biāo)號和其它各種用戶定義對象的命名。標(biāo)識符的長度可以是一個或多個字符。標(biāo)識符必須以字母或下劃線開頭,隨后的字符必須是字母、數(shù)字或下劃線。下面是一些正確或錯誤標(biāo)識符命名的實(shí)例。 正確形式 錯誤形式 count 2 count test23 hi! there high_balance highbalance C+語言中的字母是要區(qū)分大小寫的。因此,count、 Count、 COUNT是三個不同的標(biāo)識符。標(biāo)識符不能和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ù)類型的常量,這就是串。串常量括在雙撇號之間。如This is a test。請注意,不要把字符和串相混淆。單個字符常量是由單撇號括起來的,如 a 。,2.2 常量與變量,2.2.3 變量 其值可以改變的量稱為變量。
22、一個變量有一個名字(標(biāo)識符),在內(nèi)存中占據(jù)一定的存儲單元。在該存儲單元中存放變量的值。所有的C+變量必須在使用之前定義。定義變量的一般形式是:type variable_list; 這里的type必須是有效的C+數(shù)據(jù)類型,variable_list(變量表)可以由一個或多個由逗號分隔的標(biāo)識符名構(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的一個或多個十進(jìn)制數(shù)位,第一位不能是0。 八進(jìn)制常數(shù)的形式是: 0digits 在此,digits可以是一個或多個八進(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為無符號整型變量*/ 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)常量,是一個十進(jìn)制表示的符號實(shí)數(shù)。符號實(shí)數(shù)的值包括整數(shù)部分、 尾數(shù)部分和指數(shù)部分。實(shí)型常量的形式如下: digits .digits E|e+|-digits 在此digits是一位或多位十進(jìn)制數(shù)字(從09)。E(也可用e)是指數(shù)符號。小數(shù)點(diǎn)之前是整數(shù)部分,小數(shù)點(diǎn)之后是尾數(shù)部分,它們是
25、可省略的。,2.3 基本數(shù)據(jù)類型,2.實(shí)型變量 實(shí)型變量分為單精度(float型)和雙精度(double型)。對每一個實(shí)型變量都應(yīng)在使用前加以聲明。如: float x,y; / *指定x , y為單精度實(shí)數(shù)* / double z; / *指定z為雙精度實(shí)數(shù)* / 在一般系統(tǒng)中,一個float型數(shù)據(jù)在內(nèi)存中占4個字節(jié)(32位)。一個double型數(shù)據(jù)占8個字節(jié)(64位)。單精度實(shí)數(shù)提供7位有效數(shù)字,雙精度提供1 5 1 6位有效數(shù)字,數(shù)值的范圍隨機(jī)器系統(tǒng)而異。值得注意的是,實(shí)型常量是double型,當(dāng)把一個實(shí)型常量賦給一個float型變量時,系統(tǒng)會截取相應(yīng)的有效位數(shù)。例如: float a;
26、 a = 111111.111 ;由于float型變量只能接收7位有效數(shù)字,因此最后兩位小數(shù)不起作用。如果將a改為double型,則能全部接收上述9位數(shù)字并存儲在變量a中。,2.3 基本數(shù)據(jù)類型,2.3.3 字符型數(shù)據(jù) 1.字符常量 字符常量是指用一對單引號括起來的一個字符。如 c,9,!。字符常量中的單引號只起定界作用并不表示字符本身。單引號中的字符不能是單引號()和反斜杠(),它們是特有的表示法。這將在轉(zhuǎn)義字符中介紹。字符是按其所對應(yīng)的ASCII碼值來存儲的,一個字符占一個字節(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.字符串常量 字符串常量是指用一對雙引號括起來的一串字符。雙引號只起定界作用,雙引號括起的 字符串中不能是雙引號()和反斜杠(),它們特有的表示法在轉(zhuǎn)義字符中介紹。例如: China,Cprogram, YES 它表示c1和c2為字符變量,各放一個字符。因此可以用下面語句對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ù)類型。一個數(shù)組可以分解為多個數(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)識符。 方括號中的常量表達(dá)式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。 例如: int a10; 說明整型數(shù)組a,有10個元素。 float b10,c20; 說明實(shí)型數(shù)組b,有10個元素,實(shí)型數(shù)組c,有20個元素。 char
29、 ch20; 說明字符數(shù)組ch,有20個元素。,2.4 復(fù)合數(shù)據(jù)類型,對于數(shù)組類型說明應(yīng)注意以下幾點(diǎn): 數(shù)組的類型實(shí)際上是指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。 數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識符的書寫規(guī)定。 數(shù)組名不能與其它變量名相同。 方括號中常量表達(dá)式表示數(shù)組元素的個數(shù),如a5表示數(shù)組a有 5個元素。但是其下標(biāo)從0開始計(jì)算的。因此5個元素分別為a0,a1,a2,a3,a4。 不能在方括號中用變量來表示元素的個數(shù),但是可以是符號常數(shù)或常量表達(dá)式。 允許在同一個類型說明中,說明多個數(shù)組和多個變量。,2.4 復(fù)合數(shù)據(jù)類型,例如: int a,b,c,d,k110,k2
30、20; 一維數(shù)組元素的引用: 數(shù)組元素是組成數(shù)組的基本單元。數(shù)組元素也是一種變量, 其標(biāo)識方法為數(shù)組名后跟一個下標(biāo)。下標(biāo)表示了元素在數(shù)組中的順序號。 數(shù)組元素的一般形式為: 數(shù)組名下標(biāo) 其中下標(biāo)只能為整型常量或整型表達(dá)式。如為小數(shù)時,編譯器將自動取整。 例如: a5 ai+j ai+ 都是合法的數(shù)組元素。 數(shù)組元素通常也稱為下標(biāo)變量。必須先定義數(shù)組,才能使用下標(biāo)變量。只能逐個地使用下標(biāo)變量,而不能一次引用整個數(shù)組。 例如,輸出有10個元素的數(shù)組必須使用循環(huán)語句逐個輸出各下標(biāo)變量: for(i=0; i10; i+) printf(%d,ai); 而不能用一個語句輸出整個數(shù)組。 下面的寫法是錯誤
31、的: printf(%d,a);,2.4 復(fù)合數(shù)據(jù)類型,3. 一維數(shù)組的初始化 給數(shù)組賦值的方法除了用賦值語句對數(shù)組元素逐個賦值外, 還可采用初始化賦值和動態(tài)賦值的方法。 數(shù)組初始化賦值是指在數(shù)組定義時給數(shù)組元素賦予初值。數(shù)組初始化是在編譯階段進(jìn)行的。這樣將減少運(yùn)行時間,提高效率。 初始化賦值的一般形式為: 類型說明符 數(shù)組名常量表達(dá)式=值,值值; 其中在 中的各數(shù)據(jù)值即為各元素的初值,各值之間用逗號間隔。 例如: int a10= 0,1,2,3,4,5,6,7,8,9 ; 相當(dāng)于a0=0;a1=1.a9=9; 對數(shù)組的初始化賦值還有以下幾點(diǎn)規(guī)定: 可以只給部分元素賦初值。 當(dāng) 中值的個數(shù)少
32、于元素個數(shù)時,只給前面部分元素賦值。,2.4 復(fù)合數(shù)據(jù)類型,例如: int a10=0,1,2,3,4; 表示只給a0a45個元素賦值,而后5個元素自動賦0值。 只能給元素逐個賦值,不能給數(shù)組整體賦值。 例如給十個元素全部賦1值,只能寫為: int a10=1,1,1,1,1,1,1,1,1,1; 而不能寫為: int a10=1; 如給全部元素賦值,則在數(shù)組說明中,可以不給出數(shù)組元素的個數(shù)。 例如: int a5=1,2,3,4,5; 可寫為: int a=1,2,3,4,5;,2.4 復(fù)合數(shù)據(jù)類型,4.二維數(shù)組的定義和引用 二維數(shù)組的定義: 前面介紹的數(shù)組只有一個下標(biāo),稱為一維數(shù)組,其數(shù)組
33、元素也稱為單下標(biāo)變量。在實(shí)際問題中有很多量是二維的或多維的,我們可以在程序設(shè)計(jì)時構(gòu)造多維數(shù)組。多維數(shù)組元素有多個下標(biāo),以標(biāo)識它在數(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; 說明了一個三行四列的數(shù)組,數(shù)組名為a,其下標(biāo)變量的類型為整型。該數(shù)組的下標(biāo)變量共有34個,即: a00,a01,a02,a03 a10,a11,a12,a13 a20,a21,a22
34、,a23 二維數(shù)組在概念上是二維的,即是說其下標(biāo)在兩個方向上變化,下標(biāo)變量在數(shù)組中的位置也處于一個平面之中,而不是象一維數(shù)組只是一個向量。但是,實(shí)際的硬件存儲器卻是連續(xù)編址的,也就是說存儲器單元是按一維線性排列的。如何在一維存儲器中存放二維數(shù)組,可有兩種方式:一種是按行排列, 即放完一行之后順次放入第二行。另一種是按列排列, 即放完一列之后再順次放入第二列。在+語言中,二維數(shù)組是按行排列的。,2.4 復(fù)合數(shù)據(jù)類型,例如: a34 表示a數(shù)組三行四列的元素。 下標(biāo)變量和數(shù)組說明在形式中有些相似,但這兩者具有完全不同的含義。數(shù)組說明的方括號中給出的是某一維的長度,即可取下標(biāo)的最大值;而數(shù)組元素中的
35、下標(biāo)是該元素在數(shù)組中的位置標(biāo)識。前者只能是常量,后者可以是常量,變量或表達(dá)式。 二維數(shù)組的初始化: 二維數(shù)組初始化也是在類型說明時給各下標(biāo)變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。 例如對數(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ù)組元素占2個字節(jié)的內(nèi)存單元。 字符數(shù)組也可以是二維或多維數(shù)組。 例如: char c510; 即為二維字符數(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)自動
37、賦予0值。 當(dāng)對全體元素賦初值時也可以省去長度說明。 例如: char c=c, ,p,r,o,g,r,a,m; 這時C數(shù)組的長度自動定為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ù)組由于在初始化時全部元素都賦以初值,因此一維下標(biāo)的長度可以不加以說明。,2.4 復(fù)合數(shù)據(jù)類型,2.4.2 結(jié)構(gòu) 結(jié)構(gòu)的定義:由基本數(shù)據(jù)類型構(gòu)成的、并用一個標(biāo)識符來命名的各種變
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)變量時要先對其定義。 定義結(jié)構(gòu)變量的一般格式為: struct 結(jié)構(gòu)名 類型 變量名; 類型 變量名; . 結(jié)構(gòu)變量; 結(jié)構(gòu)名是結(jié)構(gòu)的標(biāo)識符不是變量名。 類型可以為整型、浮點(diǎn)型、字符型、指針型等。 構(gòu)成結(jié)構(gòu)的每一個類型變量稱為結(jié)構(gòu)成員, 它象數(shù)組的元素一樣, 但數(shù)組中元素是以下標(biāo)來訪問的, 而結(jié)構(gòu)是按變量名字來訪問成員的。,2.4 復(fù)合數(shù)據(jù)類型,下面舉一個例子來說明怎樣定義結(jié)構(gòu)變量。 struct string char
39、 name10; int age; char sex2; char depart20; float wage1, wage2, wage3, wage4, wage5; person; 這個例子定義了一個結(jié)構(gòu)名為string的結(jié)構(gòu)變量person, 如果省略變量名 person, 則變成對結(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)是一個新的數(shù)據(jù)類型, 因此結(jié)構(gòu)變量也可以象其它類型的變量一樣賦值、 運(yùn)算, 不同的是結(jié)構(gòu)變量以成員作為基本變量。 結(jié)構(gòu)成員的表示方式為: 結(jié)構(gòu)變量.成員名 如果將結(jié)構(gòu)變量.成員名看成一個整體, 則這個整體的數(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)類型的變量集合。假如要定義一個班級40個同學(xué) 的姓名、性別、年齡和住址, 可以定義成一個結(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é)中講到)。它由一個加在結(jié)構(gòu)變量名前的* 操作符來定 義, 例如用前面已說明的結(jié)構(gòu)定義一個結(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)指針對結(jié)構(gòu)成員的訪問, 與結(jié)構(gòu)變量對結(jié)構(gòu)成員的訪問在表達(dá)方式 上有所不同。結(jié)構(gòu)指針對結(jié)構(gòu)成員的訪問表示為: 結(jié)構(gòu)指針名-結(jié)構(gòu)成員 其中-是兩個符號-和的組合, 好象一個箭頭指向結(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)中第一個成員的首地址應(yīng)該是 數(shù)據(jù)類型 成員名; . 聯(lián)合變量名; 聯(lián)合表示幾個變量公用一個內(nèi)存位置, 在不同的時間保存不同的數(shù)據(jù)類型和不同長度的變量。 下例表示說明一個聯(lián)合a_bc: union a_bc int i; char mm; ;,2.4 復(fù)合數(shù)據(jù)類型,聯(lián)合訪問其成員的方法與結(jié)構(gòu)相同。同樣聯(lián)合變量也可以定義成數(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的第一個字符可寫成: *y2.x.ch; 若寫成y2.x.*ch;是錯誤的。 結(jié)構(gòu)和聯(lián)合是由區(qū)別的,區(qū)別如下: (1). 結(jié)構(gòu)和聯(lián)合都是由多個不同的數(shù)據(jù)類型成員組成, 但在任何同一時刻, 聯(lián)合中只存放了一個被選中的成員, 而結(jié)構(gòu)的所有成員都存在。 (2). 對于聯(lián)合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存 在了, 而對
45、于結(jié)構(gòu)的不同成員賦值是互不影響的。,2.4 復(fù)合數(shù)據(jù)類型,2.4.4枚舉 枚舉是一個被命名的整型常數(shù)的集合, 枚舉在日常生活中很常見。 例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 就是一個枚舉。 枚舉的說明與結(jié)構(gòu)和聯(lián)合相似, 其形式為: enum 枚舉名 標(biāo)識符=整型常數(shù), 標(biāo)識符=整型常數(shù), . 標(biāo)識符=整型常數(shù), 枚舉變量;,2.4 復(fù)合數(shù)據(jù)類型,如果枚舉沒有初始化, 即省掉=整型常數(shù)時, 則從第一個標(biāo)識符開始, 順次賦給標(biāo)識符0, 1, 2, .。但當(dāng)枚舉中的某個成員賦值后, 其后的成員按依
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. 枚舉中每個成員(標(biāo)識符)結(jié)束符是, 不是;, 最后一個成員可省略 ,。 2. 初始化時可以賦負(fù)數(shù), 以后的標(biāo)識符仍依次加1。 3. 枚舉變量只能取枚舉說明結(jié)構(gòu)中的某個標(biāo)識符常量。,2.5 指針基礎(chǔ),2.5.1 指針的基本概念和定義 我們知道變量在計(jì)算機(jī)內(nèi)是占有
47、一塊存貯區(qū)域的, 變量的值就存放在這塊區(qū) 域之中, 在計(jì)算機(jī)內(nèi)部, 通過訪問或修改這塊區(qū)域的內(nèi)容來訪問或修改相應(yīng)的變 量。C+語言中, 對于變量的訪問形式之一, 就是先求出變量的地址, 然后 再通過地址對它進(jìn)行訪問, 這就是這里所要論述的指針及其指針變量。,2.5 指針基礎(chǔ),所謂變量的指針, 實(shí)際上指變量的地址。變量的地址雖然在形式上好象類似 于整數(shù), 但在概念上不同于以前介紹過的整數(shù), 它屬于一種新的數(shù)據(jù)類型, 即指 針類型。C+中, 一般用指針來指明這樣一個表達(dá)式 則 首先說明了它是一指針類型的變量, 注意在定義中不要漏寫符號*, 否則它為 一般的整型變量了。另外, 在定義中的int 表示
48、該指針變量為指向整型數(shù)的指針 類型的變量, 有時也可稱ip為指向整數(shù)的指針。ip是一個變量, 它專門存放整型 變量的地址。 指針變量的一般定義為: 類型標(biāo)識符 *標(biāo)識符;,2.5 指針基礎(chǔ),其中標(biāo)識符是指針變量的名字, 標(biāo)識符前加了*號, 表示該變量是指針變 量, 而最前面的類型標(biāo)識符表示該指針變量所指向的變量的類型。一個指針變 量只能指向同一種類型的變量, 也就是講, 我們不能定義一個指針變量, 既能指 向一整型變量又能指向雙精度變量。 指針變量在定義中允許帶初始化項(xiàng)。如: int i, *ip=,2.5 指針基礎(chǔ),2.5.2 指針變量的引用 既然在指針變量中只能存放地址, 因此, 在使用中
49、不要將一個整數(shù)賦給一指 針變量。下面的賦值是不合法的: int *ip; ip=100; 假設(shè) int i=200, x; int *ip; 我們定義了兩個整型變量i, x, 還定義了一個指向整型數(shù)的指針變量ip。i, x中 可存放整數(shù), 而ip中只能存放整型變量的地址。我們可以把i的地址賦給ip: ip= 此時指針變量ip指向整型變量i, 假設(shè)變量i的地址為1800, 這個賦值可形象理解,2.5 指針基礎(chǔ),通過指針訪問它所指向的一個變量是以間接訪問的形式進(jìn)行的, 所以比直接訪問一個變量要費(fèi)時間, 而且不直觀, 因?yàn)橥ㄟ^指針要訪問哪一個變量, 取決于指針的值(即指向), 例如*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ù)或字符時,結(jié)果取整。例如,在整數(shù)除法中,10/3=3。 一元減法的實(shí)際效果等于用- 1乘單個操作數(shù),即任何數(shù)值前放置減號將改變其符號。模 運(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)系”二字指的是一個值與另一個值之間的關(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á)式對Flase和Ture分別返回值0或1 。,2.6 運(yùn)算符及其使用,2.6.4 ?運(yùn)算符 C+語言提供了一個可以代替某些i f - t h e n - e l s e語句的簡便易用的操作符?。該操作符是三元的,其一般形式為: EXP1 ? EXE2 : EXP3 EXP1,EXP2和EXP3是表達(dá)式,注意冒號的用法和位置。 操作符“ ? ”作用是這樣的,在計(jì)算EXP1之后,如果數(shù)值為True,則計(jì)算EXP2,并將結(jié)果作為整個表達(dá)式的數(shù)值;如果EXP1的值為Flase,則計(jì)算EXP
53、3,并以它的結(jié)果作為整個表達(dá)式的值,2.6 運(yùn)算符及其使用,請看下例: x = 10 ; y = x 9 ? 100 : 200 ; 例中,賦給y的數(shù)值是100,如果x被賦給比9小的值,y的值將為200,若用i f - e l s e語句改寫,有 下面的等價程序: x = 1 0 ; if(x9) y=100; else y=200;,2.6 運(yùn)算符及其使用,2.6.5 自增和自減運(yùn)算符 C+語言中有兩個很有用的運(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操作。請看下例:x=10 ; y =+x ; 此時,y = 11。如果程序改為:x=10 ; y = x+ ;則y=10。在這兩種情況下, x都被置為11,但區(qū)別在于設(shè)置的時刻,這種對自增和自減發(fā)生時刻的控制是非常有用的。在大多數(shù)C+編譯程序中,為自增和自減操作生
55、成的程序代碼比等價的賦值語句生成的代碼要快得多,所以盡可能采用加1或減1運(yùn)算符是一種好的選擇。,2.6 運(yùn)算符及其使用,2.6.6位運(yùn)算符 C+語言支持全部的位操作符(Bitwise Operators)。它具有支持匯編語言所具有的運(yùn)算能力。位操作是對字節(jié)或字中的位(bit)進(jìn)行測試、置位或移位處理,這里字節(jié)或字是針對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)算等價,唯一不同的是位操作是逐位進(jìn)行運(yùn)算的。,2.
56、6 運(yùn)算符及其使用,2.6.7 逗號操作符 作為一個操作符,逗號把幾個表達(dá)式串在一起。逗號操作符的左側(cè)總是作為v o i d (無值),這意味著其右邊表達(dá)式的值變?yōu)橐远禾柗珠_的整個表達(dá)式的值。例如: x = (y=3, y+1) ; 這行將3賦給y,然后將4賦給x,因?yàn)槎禾柌僮鞣膬?yōu)先級比賦值操作符優(yōu)先級低,所以 必須使用括號。實(shí)際上,逗號表示操作順序。當(dāng)它在賦值語句右邊使用時,所賦的值是逗號分隔開的表中最后那個表達(dá)式的值。例如: y = 1 0 ; x = ( y = y - 5 , 2 5 / y ) ; 執(zhí)行后,x的值是5,因?yàn)閥的起始值10,減去5之后結(jié)果再除以25,得到最終結(jié)果。 在
57、某種意義上可以認(rèn)為,逗號操作符和標(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)先級最高。下面程序說明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)在我們要讓用戶輸入三個數(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+中的基本輸入和輸出,分析這個程序,第一行中的include是C編譯器的一個編譯指令,iostream.h 是C+系統(tǒng)的一個系統(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等.壓縮文件請下載最新的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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防設(shè)施電伴熱施工合同
- 建筑拆除施工總價承包合同
- 互聯(lián)網(wǎng)公司CTO招聘合同樣本
- 物流運(yùn)輸木門更換工程合同
- 汽車維修項(xiàng)目審計(jì)要點(diǎn)
- 建筑隔震工程倒板施工協(xié)議
- 媒體行業(yè)薪酬分配改革管理辦法
- 網(wǎng)絡(luò)文學(xué)改編劇招聘合同
- 咨詢公司公關(guān)部聘用合同
- 建筑檢測探傷施工合同
- 簫笛自己做——簫笛制作原理、印度班蘇里和尼泊爾笛簡易制作Word版
- 案例分折----奇瑞信息化
- 九陽真經(jīng)原文
- 企業(yè)有價證券管理制度
- 機(jī)關(guān)工作人員考勤表Excel模板
- 日照市重點(diǎn)支柱產(chǎn)業(yè)情況
- 兒童過敏性休克ppt課件
- 安全生產(chǎn)文明施工措施費(fèi)用明細(xì)報表范文
- 七年級生物上冊(濟(jì)南版)知識點(diǎn)歸納
- 腹腔鏡設(shè)備的使用和保養(yǎng)PPT課件
- D600變頻器說明書
評論
0/150
提交評論