C程序設(shè)計譚浩強_第1頁
C程序設(shè)計譚浩強_第2頁
C程序設(shè)計譚浩強_第3頁
C程序設(shè)計譚浩強_第4頁
C程序設(shè)計譚浩強_第5頁
已閱讀5頁,還剩793頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C+程序設(shè)計 中國高等院校計算機基礎(chǔ)教育課程體系規(guī)劃教材 譚浩強 編著 總 目 錄 第1篇 基 本 知 識 第1章 C+的初步知識 第2章 數(shù)據(jù)類型與表達式 第2篇 面向過程的程序設(shè)計 第3章 程序設(shè)計初步 第4章 函數(shù)與預(yù)處理 第5章 數(shù)組 第6章 指針 第7章 自定義數(shù)據(jù)類型 第3篇 基于對象的程序設(shè)計 第8章 類和對象 第9章 關(guān)于類和對象的進一步討論 第10章 運算符重載 第4篇 面向?qū)ο蟮某绦蛟O(shè)計 第11章 繼承與派生 第12章 多態(tài)性與虛函數(shù) 第13章 輸入輸出流 第14章 C+工具 第1章 C+的初步知識 第2章 數(shù)據(jù)類型與表達式 第1篇 基 本 知 識 第1章 C+的初步知識

2、*1.1 從C到C+ *1.2 最簡單的C+程序 1.3 C+程序的構(gòu)成和書寫形式 1.4 C+程序的編寫和實現(xiàn) 1.5 關(guān)于C+上機實踐 *1.1 從C到C+ 計算機誕生初期,人們要使用計算機必須用機器語言或匯編語言編寫程序.世界上第一種計算機高級語言誕生于1954年,它是FORTRAN語言.先后出現(xiàn)了多種計算機高級語言.其中使用最廣泛.影響最大的當(dāng)推BASIC語言和C語言. BASIC語言是1964年在FORTRAN語言的基礎(chǔ)上簡化而成的,它是為初學(xué)者設(shè)計的小型高級語言. C語言是1972年由美國貝爾實驗室的研制成功的.它不是為初學(xué)者設(shè)計的,而是為計算機專業(yè)人員設(shè)計的.大多數(shù)系統(tǒng)軟件和許多

3、應(yīng)用軟件都是用C語言編寫的. 但是隨著軟件規(guī)模的增大,用C語言編寫程序漸漸顯得有些吃力了. C+是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事于20世紀(jì)80年代初在C語言的基礎(chǔ)上開發(fā)成功的.C+保留了C語言原有的所有優(yōu)點,增加了面向?qū)ο蟮臋C制. C+是由C發(fā)展而來的,與C兼容.用C語言寫的程序基本上可以不加修改地用于C+.從C+的名字可以看出它是C的超集.C+既可用于面向過程的結(jié)構(gòu)化程序設(shè)計,又可用于面向?qū)ο蟮某绦蛟O(shè)計,是一種功能強大的混合型的程序設(shè)計語言. C+對C的增強,表現(xiàn)在兩個方面: (1) 在原來面向過程的機制基礎(chǔ)上,對C語言的功能做了不

4、少擴充. (2) 增加了面向?qū)ο蟮臋C制. 面向?qū)ο蟪绦蛟O(shè)計,是針對開發(fā)較大規(guī)模的程序而提出來的,目的是提高軟件開發(fā)的效率. 不要把面向?qū)ο蠛兔嫦蜻^程對立起來,面向?qū)ο蠛兔嫦蜻^程不是矛盾的,而是各有用途.互為補充的. 學(xué)習(xí)C+,既要會利用C+進行面向過程的結(jié)構(gòu)化程序設(shè)計,也要會利用C+進行面向?qū)ο蟮某绦蛟O(shè)計.本書既介紹C+在面向過程程序設(shè)計中的應(yīng)用,也介紹C+在面向?qū)ο蟪绦蛟O(shè)計中的應(yīng)用. *1.2 最簡單的C+程序 例1.1 輸出一行字符: This is a C+ program. 程序如下: #include <iostream> /包含頭文件iostream using nam

5、espace std; /使用命名空間std int main( ) cout<<This is a C+ program.; return 0; 在運行時會在屏幕上輸出以下一行信息: This is a C+ program. 用main代表主函數(shù)的名字.每一個C+程序都必須有一個 main 函數(shù).main前面的int的作用是聲明函數(shù)的類型為整型.程序第6行的作用是向操作系統(tǒng)返回一個零值.如果程序不能正常執(zhí)行,則會自動向操作系統(tǒng)返回一個非零值,一般為-1. 函數(shù)體是由大括號 括起來的.本例中主函數(shù)內(nèi)只有一個以cout開頭的語句.注意C+所有語句最后都應(yīng)當(dāng)有一個分號. 再看程序的第

6、1行#include <iostream>,這不是C+的語句,而是C+的一個預(yù)處理命令,它以#開頭以與C+語句相區(qū)別,行的末尾沒有分號.#include <iostream>是一個包含命令,它的作用是將文件iostream的內(nèi)容包含到該命令所在的程序文件中,代替該命令行.文件iostream的作用是向程序提供輸入或輸出時所需要的一些信息.iostream是i-o-stream 3個詞的組合,從它的形式就可以知道它代表輸入輸出流的意思,由于這類文件都放在程序單元的開頭,所以稱為頭文件(head file).在程序進行編譯時,先對所有的預(yù)處理命令進行處理,將頭文件的具體內(nèi)容

7、代替 #include命令行,然后再對該程序單元進行整體編譯. 程序的第2行using namespace std; 的意思是使用命名空間std.C+標(biāo)準(zhǔn)庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到C+標(biāo)準(zhǔn)庫(此時就需要用#include命令行),就需要用using namespace std; 作聲明,表示要用到命名空間std中的內(nèi)容. 在初學(xué)C+時,對本程序中的第1,2行可以不必深究,只需知道: 如果程序有輸入或輸出時,必須使用#include <iostream>命令以提供必要的信息,同時要用using namespace std; ,使程序能夠使用這些信

8、息,否則程序編譯時將出錯. 例1.2 求a和b兩個數(shù)之和. 可以寫出以下程序: / 求兩數(shù)之和 (本行是注釋行) #include <iostream> /預(yù)處理命令 using namespace std; /使用命名空間std int main( ) /主函數(shù)首部 /函數(shù)體開始 int a,b,sum; /定義變量 cin>>a>>b; /輸入語句 sum=a+b;/賦值語句 cout<<a+b=<<sum<<endl; /輸出語句 return 0; /如程序正常結(jié)束,向操作系統(tǒng)返回一個零值 /函數(shù)結(jié)束 本程序的作用

9、是求兩個整數(shù)a和b之和sum.第1行/求兩數(shù)之和是一個注釋行,C+規(guī)定在一行中如果出現(xiàn)/,則從它開始到本行末尾之間的全部內(nèi)容都作為注釋. 如果在運行時從鍵盤輸入 123 456 則輸出為 a+b=579 例1.3 給兩個數(shù)x和y,求兩數(shù)中的大者. 在本例中包含兩個函數(shù). #include <iostream> /預(yù)處理命令 using namespace std; int max(int x,int y)/定義max函數(shù),函數(shù)值為整型,形式參數(shù)x,y為整型 /max函數(shù)體開始 int z;/變量聲明,定義本函數(shù)中用到的變量z為整型 if(x>y) z=x;/if語句,如果x&

10、gt;y,則將x的值賦給z else z=y; /否則,將y的值賦給z return(z);/將z的值返回,通過max帶回調(diào)用處 /max函數(shù)結(jié)束 int main( ) /主函數(shù) /主函數(shù)體開始 int a,b,m;/變量聲明 cin>>a>>b;/輸入變量a和b的值 m=max(a,b); /調(diào)用max函數(shù),將得到的值賦給m cout<<max=<<m<<n;/輸出大數(shù)m的值 return 0; /如程序正常結(jié)束,向操作系統(tǒng)返回一個零值 /主函數(shù)結(jié)束 本程序包括兩個函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max. 程序運行情況如下: 1

11、8 25 (輸入18和25給a和b) max=25 (輸出m的值) 注意輸入的兩個數(shù)據(jù)間用一個或多個空格間隔,不能以逗號或其他符號間隔. 在上面的程序中,max函數(shù)出現(xiàn)在main函數(shù)之前,因此在main函數(shù)中調(diào)用max函數(shù)時,編譯系統(tǒng)能識別max是已定義的函數(shù)名.如果把兩個函數(shù)的位臵對換一下,即先寫main函數(shù),后寫max函數(shù),這時在編譯main函數(shù)遇到max時,編譯系統(tǒng)無法知道m(xù)ax代表什么含義,因而無法編譯,按出錯處理. 為了解決這個問題,在主函數(shù)中需要對被調(diào)用函數(shù)作聲明.上面的程序可以改寫如下: #include <iostream> using namespace std;

12、 int main( ) int max(int x,int y);/對max函數(shù)作聲明 int a,b,c; cin>>a>>b; c=max(a,b); /調(diào)用max函數(shù) cout<<max=<<c<<endl; return 0; int max(int x,int y)/定義max函數(shù) int z; if(x>y) z=x; else z=y; return(z); 只要在被調(diào)用函數(shù)的首部的末尾加一個分號,就成為對該函數(shù)的函數(shù)聲明.函數(shù)聲明的位臵應(yīng)當(dāng)在函數(shù)調(diào)用之前. 下面舉一個包含類(class)和對象(object)的

13、C+程序,目的是使讀者初步了解C+是怎樣體現(xiàn)面向?qū)ο蟪绦蛟O(shè)計方法的. 例1.4 包含類的C+程序. #include <iostream>/ 預(yù)處理命令 using namespace std; class Student/ 聲明一個類,類名為Student private: / 以下為類中的私有部分 int num; / 私有變量num int score; / 私有變量score public: / 以下為類中的公用部分 void setdata( ) / 定義公用函數(shù)setdata cin>>num; / 輸入num的值 cin>>score; / 輸

14、入score的值 void display( ) / 定義公用函數(shù)display cout<<num=<<num<<endl; / 輸出num的值 cout<<score=<<score<<endl;/輸出score的值 ; ; / 類的聲明結(jié)束 Student stud1,stud2; /定義stud1和stud2為Student類的變量,稱為對象 int main( )/ 主函數(shù)首部 stud1.setdata( ); / 調(diào)用對象stud1的setdata函數(shù) stud2.setdata( ); / 調(diào)用對象stud

15、2的setdata函數(shù) stud1.display( ); / 調(diào)用對象stud1的display函數(shù) stud2.display( ); / 調(diào)用對象stud2的display函數(shù) return 0; 在一個類中包含兩種成員: 數(shù)據(jù)和函數(shù),分別稱為數(shù)據(jù)成員和成員函數(shù).在C+中把一組數(shù)據(jù)和有權(quán)調(diào)用這些數(shù)據(jù)的函數(shù)封裝在一起,組成一種稱為類(class)的數(shù)據(jù)結(jié)構(gòu).在上面的程序中,數(shù)據(jù)成員num,score和成員函數(shù)setdata,display組成了一個名為Student的類類型.成員函數(shù)是用來對數(shù)據(jù)成員進行操作的.也就是說,一個類是由一批數(shù)據(jù)以及對其操作的函數(shù)組成的. 類可以體現(xiàn)數(shù)據(jù)的封裝性和

16、信息隱蔽.在上面的程序中,在聲明Student類時,把類中的數(shù)據(jù)和函數(shù)分為兩大類: private(私有的)和public(公用的).把全部數(shù)據(jù)(num,score)指定為私有的,把全部函數(shù)(setdata,display)指定為公用的.在大多數(shù)情況下,會把所有數(shù)據(jù)指定為私有,以實現(xiàn)信息隱蔽. 具有類類型特征的變量稱為對象(object). 程序中第1824行是主函數(shù). 程序運行情況如下: 1001 98.5 (輸入學(xué)生1的學(xué)號和成績) 1002 76.5 (輸入學(xué)生2的學(xué)號和成績) num=1001 (輸出學(xué)生1的學(xué)號) score=98.5 (輸出學(xué)生1的成績) num=1002 (輸出學(xué)

17、生2的學(xué)號) score=76.5 (輸出學(xué)生2的成績) 1.3 C+程序的構(gòu)成和書寫形式 C+程序的結(jié)構(gòu)和書寫格式歸納如下: (1) 一個C+程序可以由一個程序單位或多個程序單位構(gòu)成.每一個程序單位作為一個文件.在程序編譯時,編譯系統(tǒng)分別對各個文件進行編譯,因此,一個文件是一個編譯單元. (2) 在一個程序單位中,可以包括以下幾個部分: 預(yù)處理命令.上節(jié)4個程序中都包括#include命令. 全局聲明部分(在函數(shù)外的聲明部分).在這部分中包括對用戶自己定義的數(shù)據(jù)類型的聲明和程序中所用到的變量的定義. 函數(shù).函數(shù)是實現(xiàn)操作的部分,因此函數(shù)是程序中必須有的和最基本的組成部分.每一個程序必須包括一

18、個或多個函數(shù),其中必須有一個(而且只能有一個)主函數(shù)(main函數(shù)). 但是并不要求每一個程序文件都必須具有以上3個部分,可以缺少某些部分(包括函數(shù)). (3) 一個函數(shù)由兩部分組成: 函數(shù)首部,即函數(shù)的第一行.包括函數(shù)名.函數(shù)類型.函數(shù)屬性.函數(shù)參數(shù)(形參)名.參數(shù)類型. 一個函數(shù)名后面必須跟一對圓括號, 函數(shù)參數(shù)可以缺省,如int main( ). 函數(shù)體,即函數(shù)首部下面的大括號內(nèi)的部分.如果在一個函數(shù)中有多個大括號,則最外層的一對 為函數(shù)體的范圍. 函數(shù)體一般包括: . 局部聲明部分 (在函數(shù)內(nèi)的聲明部分).包括對本函數(shù)中所用到的類型.函數(shù)的聲明和變量的定義. 對數(shù)據(jù)的聲明既可以放在函數(shù)

19、之外(其作用范圍是全局的),也可以放在函數(shù)內(nèi)(其作用范圍是局部的,只在本函數(shù)內(nèi)有效). . 執(zhí)行部分.由若干個執(zhí)行語句組成,用來進行有關(guān)的操作,以實現(xiàn)函數(shù)的功能. (4) 語句包括兩類.一類是聲明語句,另一類是執(zhí)行語句. C+對每一種語句賦予一種特定的功能.語句是實現(xiàn)操作的基本成分,顯然,沒有語句的函數(shù)是沒有意義的.C+語句必須以分號結(jié)束. (5) 一個C+程序總是從main函數(shù)開始執(zhí)行的,而不論main函數(shù)在整個程序中的位臵如何. (6) 類(class)是C+新增加的重要的數(shù)據(jù)類型,是C+對C的最重要的發(fā)展.有了類,就可以實現(xiàn)面向?qū)ο蟪绦蛟O(shè)計方法中的封裝.信息隱蔽.繼承.派生.多態(tài)等功能.

20、在一個類中可以包括數(shù)據(jù)成員和成員函數(shù),他們可以被指定為私有的(private)和公用的(public)屬性.私有的數(shù)據(jù)成員和成員函數(shù)只能被本類的成員函數(shù)所調(diào)用. (7)C+程序書寫格式自由,一行內(nèi)可以寫幾個語句, 一個語句可以分寫在多行上.C+程序沒有行號,也不像FORTRAN或COBOL那樣嚴(yán)格規(guī)定書寫格式(語句必須從某一列開始書寫). (8) 一個好的.有使用價值的源程序都應(yīng)當(dāng)加上必要的注釋,以增加程序的可讀性.C+還保留了C語言的注釋形式,可以用/*/對C+程序中的任何部分作注釋.在/*和*/之間的全部內(nèi)容作為注釋. 用/作注釋時,有效范圍只有一行,即本行有效,不能跨行.而用/*/作注釋

21、時有效范圍為多行.只要在開始處有一個/*,在最后一行結(jié)束處有一個*/即可.因此,一般習(xí)慣是: 內(nèi)容較少的簡單注釋常用/,內(nèi)容較長的常用/*/ . 1.4 C+程序的編寫和實現(xiàn) 一個程序從編寫到最后得到運行結(jié)果要經(jīng)歷以下一些步驟. 1. 用C+語言編寫程序 用高級語言編寫的程序稱為源程序(source program).C+的源程序是以.cpp作為后綴的(cpp是c plus plus 的縮寫). 2. 對源程序進行編譯 為了使計算機能執(zhí)行高級語言源程序,必須先用一種稱為編譯器(complier)的軟件(也稱編譯程序或編譯系統(tǒng)),把源程序翻譯成二進制形式的目標(biāo)程序(object program)

22、. 編譯是以源程序文件為單位分別編譯的.目標(biāo)程序一般以.obj或.o作為后綴(object 的縮寫).編譯的作用是對源程序進行詞法檢查和語法檢查.編譯時對文件中的全部內(nèi)容進行檢查,編譯結(jié)束后會顯示出所有的編譯出錯信息.一般編譯系統(tǒng)給出的出錯信息分為兩種,一種是錯誤(error);一種是警告(warning) . 3. 將目標(biāo)文件連接 在改正所有的錯誤并全部通過編譯后,得到一個或多個目標(biāo)文件.此時要用系統(tǒng)提供的連接程序(linker)將一個程序的所有目標(biāo)程序和系統(tǒng)的庫文件以及系統(tǒng)提供的其他信息連接起來,最終形成一個可執(zhí)行的二進制文件,它的后綴是.exe,是可以直接執(zhí)行的. 4. 運行程序 運行最

23、終形成的可執(zhí)行的二進制文件(.exe文件),得到運行結(jié)果. 5. 分析運行結(jié)果 如果運行結(jié)果不正確,應(yīng)檢查程序或算法是否有問題. 圖1.1 1.5 關(guān)于C+上機實踐 在了解了C+語言的初步知識后,讀者最好盡快在計算機上編譯和運行C+程序,以加深對C+程序的認識,并初步掌握C+的上機操作. 讀者可以使用不同的C+編譯系統(tǒng),在不同的環(huán)境下編譯和運行一個C+程序.但是需要強調(diào)的是,我們學(xué)習(xí)的是C+程序設(shè)計,應(yīng)當(dāng)掌握的是標(biāo)準(zhǔn)C+,而不應(yīng)該只了解某一種方言化的C+.不應(yīng)當(dāng)只會使用一種C+編譯系統(tǒng),只能在一種環(huán)境下工作,而應(yīng)當(dāng)能在不同的C+環(huán)境下運行自己的程序,并且了解不同的C+編譯系統(tǒng)的特點和使用方法,

24、在需要時能將自己的程序方便地移植到不同的平臺上. 在本書的參考書C+程序設(shè)計題解與上機指導(dǎo)一書中簡單介紹了在Visual C+ 6.0和GCC兩種典型的環(huán)境下運行C+程序的方法. 請讀者選擇一種(如能做到兩種更好) C+編譯系統(tǒng),在該環(huán)境下輸入和運行習(xí)題中的程序,掌握上機的方法和步驟. 第2章 數(shù)據(jù)類型與表達式 2.1 C+的數(shù)據(jù)類型 2.2 常量 2.3 變量 2.4 C+的運算符 2.5 算術(shù)運算符與算術(shù)表達式 2.6 賦值運算符與賦值表達式 2.7 逗號運算符與逗號表達式 2.1 C+的數(shù)據(jù)類型 計算機處理的對象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的(例如整數(shù).浮點數(shù).字符等形式).不同

25、的數(shù)據(jù)之間往往還存在某些聯(lián)系(例如由若干個整數(shù)組成一個整數(shù)數(shù)組).數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式.例如,數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu).不同的計算機語言所允許使用的數(shù)據(jù)結(jié)構(gòu)是不同的.處理同一類問題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會不同.例如,對10個整數(shù)排序和對包含10個元素的整型數(shù)組排序的算法是不同的. C+可以使用的數(shù)據(jù)類型如下: C+的數(shù)據(jù)包括常量與變量,常量與變量都具有類型.由以上這些數(shù)據(jù)類型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu).例如利用指針和結(jié)構(gòu)體類型可以構(gòu)成表.樹.棧等復(fù)雜的數(shù)據(jù)結(jié)構(gòu). C+并沒有統(tǒng)一規(guī)定各類數(shù)據(jù)的精度.數(shù)值范圍和在內(nèi)存中所占的字節(jié)數(shù),各C+編譯系統(tǒng)根據(jù)自己的情況作出安排.書中表2.1列出了V

26、isual C+數(shù)值型和字符型數(shù)據(jù)的情況. 說明: (1) 整型數(shù)據(jù)分為長整型(long int).一般整型(int)和短整型(short int).在int前面加long和short分別表示長整型和短整型. (2) 整型數(shù)據(jù)的存儲方式為按二進制數(shù)形式存儲,例如十進制整數(shù)85的二進制形式為1010101,則在內(nèi)存中的存儲形式如圖2.1所示. 圖2.1 (3) 在整型符號int和字符型符號char的前面,可以加修飾符signed(表示“有符號”)或unsigned(表示“無符號”).如果指定為signed,則數(shù)值以補碼形式存放,存儲單元中的最高位(bit)用來表示數(shù)值的符號.如果指定為unsig

27、ned,則數(shù)值沒有符號,全部二進制位都用來表示數(shù)值本身.例如短整型數(shù)據(jù)占兩個字節(jié) ,見圖2.2. 圖2.2 有符號時,能存儲的最大值為215-1,即32767,最小值為-32768.無符號時,能存儲的最大值為216-1,即65535,最小值為0.有些數(shù)據(jù)是沒有負值的,可以使用unsigned,它存儲正數(shù)的范圍比用signed時要大一倍. (4) 浮點型(又稱實型)數(shù)據(jù)分為單精度(float).雙精度(double)和長雙精度(long double)3種,在Visual C+ 6.0中,對float提供6位有效數(shù)字,對double提供15位有效數(shù)字,并且float和double的數(shù)值范圍不同.

28、對float分配4個字節(jié),對double和long double分配8個字節(jié). (5) 表中類型標(biāo)識符一欄中,方括號 包含的部分可以省寫,如short和short int等效,unsigned int和unsigned等效. 常量的值是不能改變的,一般從其字面形式即可判別是否為常量.常量包括兩大類,即數(shù)值型常量(即常數(shù))和字符型常量.如12,0,-3為整型常量,4.6,-1.23為實型常量,包含在兩個單撇號之間的字符為字符常量,如a,x.這種從字面形式即可識別的常量稱為“字面常量”或“直接常量”. 2.2 常量 2.2.1 什么是常量 2.2.2 數(shù)值常量 數(shù)值常量就是通常所說的常數(shù).在C+中

29、,數(shù)值常量是區(qū)分類型的,從字面形式即可識別其類型. 1. 整型常量(整數(shù))的類型 在上一節(jié)中已知道: 整型數(shù)據(jù)可分為int,short int,long int以及unsigned int,unsigned short,unsigned long等類別.整型常量也分為以上類別.為什么將數(shù)值常量區(qū)分為不同的類別呢?因為在進行賦值或函數(shù)的參數(shù)虛實結(jié)合時要求數(shù)據(jù)類型匹配. 那么,一個整型常量怎樣從字面上區(qū)分為以上的類別呢? (1) 一個整數(shù),如果其值在-32768+32767范圍內(nèi),認為它是short int型,它可以賦值給short int型.int型和long int型變量. (2) 一個整數(shù),

30、如果其值超過了上述范圍,而在-2147483648+2147483647范圍內(nèi),則認為它是long int型,可以將它賦值給一個int或long int型變量. (3) 如果某一計算機系統(tǒng)的C+版本(例如Visual C+)確定int與long int型數(shù)據(jù)在內(nèi)存中占據(jù)的長度相同,則它們能夠表示的數(shù)值的范圍相同.因此,一個int型的常量也同時是一個long int型常量,可以賦給int型或long int型變量. (4) 常量無unsigned型.但一個非負值的整數(shù)可以賦值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可. 一個整型常量可以用3種不同的方式表示: (1) 十進制

31、整數(shù).如1357,-432,0等.在一個整型常量后面加一個字母l或L,則認為是long int型常量.例如123L,421L,0L等,這往往用于函數(shù)調(diào)用中.如果函數(shù)的形參為long int,則要求實參也為long int型,此時用123作實參不行,而要用123L作實參. (2) 八進制整數(shù).在常數(shù)的開頭加一個數(shù)字0,就表示這是以八進制數(shù)形式表示的常數(shù).如020表示這是八進制數(shù)20,即(20)8,它相當(dāng)于十進制數(shù)16. (3) 十六進制整數(shù).在常數(shù)的開頭加一個數(shù)字0和一個英文字母X(或x),就表示這是以十六進制數(shù)形式表示的常數(shù).如0X20表示這是十六進制數(shù)20,即(20)16,它相當(dāng)于十進制數(shù)3

32、2. 2. 浮點數(shù)的表示方法 一個浮點數(shù)可以用兩種不同的方式表示: (1) 十進制小數(shù)形式.如21.456,-7.98等.它一般由整數(shù)部分和小數(shù)部分組成,可以省略其中之一(如78.或.06,.0),但不能二者皆省略.C+編譯系統(tǒng)把用這種形式表示的浮點數(shù)一律按雙精度常量處理,在內(nèi)存中占8個字節(jié).如果在實數(shù)的數(shù)字之后加字母F或f,表示此數(shù)為單精度浮點數(shù),如1234F,-43f,占4個字節(jié).如果加字母L或l,表示此數(shù)為長雙精度數(shù)(long double),在GCC中占12個字節(jié),在Visual C+ 6.0中占8個字節(jié). (2) 指數(shù)形式(即浮點形式) 一個浮點數(shù)可以寫成指數(shù)形式,如3.14159可

33、以表示為0.314159×101,3.14159×100,31.4159×10-1, 314.159×10-2等形式.在程序中應(yīng)表示為: 0.314159e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的數(shù)是以10為底的冪,如e12表示1012. 其一般形式為 數(shù)符 數(shù)字部分 指數(shù)部分 上面各數(shù)據(jù)中的0.314159,3.14159, 31.4159, 314.159 等就是其中的數(shù)字部分.可以看到: 由于指數(shù)部分的存在,使得同一個浮點數(shù)可以用不同的指數(shù)形式來表示,數(shù)字部分中小數(shù)點的位臵是浮動的.例如: a=0.3

34、14159e1; a=3.14159e0; a=31.4159e-1; a=314.159e-2; 以上4個賦值語句中,用了不同形式的浮點數(shù),但其作用是相同的. 在程序中不論把浮點數(shù)寫成小數(shù)形式還是指數(shù)形式,在內(nèi)存中都是以指數(shù)形式(即浮點形式)存儲的.例如不論在程序中寫成314.159或314.159e0,31.4159e1,3.14159e2, 0.314159e3等形式,在內(nèi)存中都是以規(guī)范化的指數(shù)形式存放,如圖2.3所示. 圖2.3 數(shù)字部分必須小于1,同時,小數(shù)點后面第一個數(shù)字必須是一個非0數(shù)字,例如不能是0.0314159.因此314.159和314.159e0,31.4159e1,3

35、.14159e2, 0.314159e3在內(nèi)存中表示成0.314159×103.存儲單元分為兩部分,一部分用來存放數(shù)字部分,一部分用來存放指數(shù)部分.為便于理解,在圖2.3中是用十進制表示的,實際上在存儲單元中是用二進制數(shù)來表示小數(shù)部分,用2的冪次來表示指數(shù)部分的. 對于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理. 2.2.3 字符常量 1. 普通的字符常量 用單撇號括起來的一個字符就是字符型常量.如a,#,%,D都是合法的字符常量,在內(nèi)存中占一個字節(jié). 注意: 字符常量只能包括一個字符,如AB 是不合法的. 字符常量區(qū)分大小寫字母,如A和a是兩個不同的字符常量. 撇號()是定界

36、符,而不屬于字符常量的一部分.如cout<<a;輸出的是一個字母“a”,而不是3個字符“a ”. 2. 轉(zhuǎn)義字符常量 除了以上形式的字符常量外,C+還允許用一種特殊形式的字符常量,就是以 “”開頭的字符序列.例如,n代表一個“換行”符.“cout<<n; ” 將輸出一個換行,其作用與“cout<<endl; ” 相同.這種“控制字符”,在屏幕上是不能顯示的.在程序中也無法用一個一般形式的字符表示,只能采用特殊形式來表示. 常用的以“”開頭的特殊字符見書中表2.2. 3. 字符數(shù)據(jù)在內(nèi)存中的存儲形式及其使用方法 將一個字符常量存放到內(nèi)存單元時,實際上并不是把該

37、字符本身放到內(nèi)存單元中去,而是將該字符相應(yīng)的ASCII代碼放到存儲單元中.如果字符變量c1的值為a,c2的值為b,則在變量中存放的是a的ASCII碼97,b 的ASCII碼98,如圖2.4(a)所示,實際上在內(nèi)存中是以二進制形式存放的,如圖2.4(b)所示. 圖2.4 既然字符數(shù)據(jù)是以ASCII碼存儲的,它的存儲形式就與整數(shù)的存儲形式類似.這樣,在C+中字符型數(shù)據(jù)和整型數(shù)據(jù)之間就可以通用.一個字符數(shù)據(jù)可以賦給一個整型變量,反之,一個整型數(shù)據(jù)也可以賦給一個字符變量.也可以對字符數(shù)據(jù)進行算術(shù)運算,此時相當(dāng)于對它們的ASCII碼進行算術(shù)運算. 例2.1 將字符賦給整型變量. #include <

38、;iostream> using namespace std; int main( ) int i,j; /i和j是整型變量 i=A; /將一個字符常量賦給整型變量i j=B; /將一個字符常量賦給整型變量j cout<<i<< <<j<<n; /輸出整型變量i和j的值,n 是換行符 return 0; 執(zhí)行時輸出 65 66 i和j被指定為整型變量.但在第5和第6行中,將字符A和B分別賦給i和j,它的作用相當(dāng)于以下兩個賦值語句: i=65;j=66; 因為A和B的ASCII碼為65和66.在程序的第5和第6行是把65和66直接存放到i和j

39、的內(nèi)存單元中.因此輸出65和66. 可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的.但是應(yīng)注意字符數(shù)據(jù)只占一個字節(jié),它只能存放0255范圍內(nèi)的整數(shù). 例2.2 字符數(shù)據(jù)與整數(shù)進行算術(shù)運算.下面程序的作用是將小寫字母轉(zhuǎn)換為大寫字母. #include <iostream> using namespace std; int main( ) char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; cout<<c1<< <<c2<<endl; return 0; 運行結(jié)果為 A B a的ASCII碼為

40、97,而A的ASCII碼為65,b為98,B為66.從ASCII代碼表中可以看到每一個小寫字母比它相應(yīng)的大寫字母的ASCII代碼大32.C+符數(shù)據(jù)與數(shù)值直接進行算術(shù)運算,a-32得到整數(shù)65,b-32得到整數(shù)66.將65和66存放在c1,c2中,由于c1,c2是字符變量,因此用cout輸出c1,c2時,得到字符A和B(A的ASCII碼為65,B的ASCII碼為66). 4. 字符串常量 用雙撇號括起來的部分就是字符串常量,如abc,Hello!,a+b,Liping都是字符串常量.字符串常量abc在內(nèi)存中占4個字節(jié)(而不是3個字節(jié)),見圖2.5. 圖2.5 編譯系統(tǒng)會在字符串最后自動加一個0作

41、為字符串結(jié)束標(biāo)志.但0并不是字符串的一部分,它只作為字符串的結(jié)束標(biāo)志.如 cout<<abc<<endl; 輸出3個字符abc,而不包括0. 注意: a和a代表不同的含義,a是字符串常量,a 是字符常量.前者占兩個字節(jié),后者占1個字節(jié).請分析下面的程序片段: char c;/定義一個字符變量 c=a;/正確 c=a; /錯誤,c只能容納一個字符 字符串常量要用字符數(shù)組來存放,見第5章. 請思考: 字符串常量abcn包含幾個字符?不是5個而是4個字符,其中“n”是一個轉(zhuǎn)義字符.但它在內(nèi)存中占5個字節(jié)(包括一個“0”字符) .編譯系統(tǒng)遇到“”時就會把它認作轉(zhuǎn)義字符的標(biāo)志,把

42、它和其后的字符一起作為一個轉(zhuǎn)義字符. 如果“”后面的字符不能與“”組成一個合法的轉(zhuǎn)義字符(如c),則在編譯時顯示出錯信息.如果希望將“”字符也作為字符串中的一個字符,則應(yīng)寫為abcn,此時字符包括5個字符,即a,b,c,n.如果有以下輸出語句: cout<<abcn<<endl; 則會輸出: abc,然后換行.同理執(zhí)行 cout<<I say Thank you!n; 的輸出是: I say Thank you! 如果在一個字符串中最后一個字符為“”,則表示它是續(xù)行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格.如 cout<<We

43、must study C/本行最后的“”后面的空格和換行均不起作用 + hard!;/本行的字符緊連在上一行最后的“”前面字符之后 則輸出: We must study C+ hard! 2.2.4 符號常量 為了編程和閱讀的方便,在C+程序設(shè)計中,常用一個符號名代表一個常量,稱為符號常量,即以標(biāo)識符形式出現(xiàn)的常量. 例2.3 符號常量的使用. #define PRICE 30 /注意這不是語句,末尾不要加分號 int main ( ) int num,total; num=10; total=num * PRICE; cout<<total=<<total<&l

44、t;endl; return 0; 程序中用預(yù)處理命令#define指定PRICE在本程序單位中代表常量30,此后凡在本程序單位中出現(xiàn)的PRICE都代表30,可以和常量一樣進行運算,程序運行結(jié)果為 total=300 請注意符號常量雖然有名字,但它不是變量.它的值在其作用域(在本例中為主函數(shù))內(nèi)是不能改變的,也不能被賦值.如用賦值語句“PRICE=40;”給PRICE賦值是錯誤的. 使用符號常量的好處是: (1) 含義清楚. (2) 在需要改變一個常量時能做到“一改全改”. 如 #define PRICE 35 2.3 變量 2.3.1 什么是變量 其實在前面的例子中已經(jīng)多次用到了變量.在程序

45、運行期間其值可以改變的量稱為變量.一個變量應(yīng)該有一個名字,并在內(nèi)存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值.請注意區(qū)分變量名和變量值這兩個不同的概念,見圖2.6. 圖2.6 2.3.2 變量名規(guī)則 先介紹標(biāo)識符的概念.和其他高級語言一樣,用來標(biāo)識變量.符號常量.函數(shù).數(shù)組.類型等實體名字的有效字符序列稱為標(biāo)識符(identifier).簡單地說,標(biāo)識符就是一個名字.變量名是標(biāo)識符的一種,變量的名字必須遵循標(biāo)識符的命名規(guī)則. C+規(guī)定標(biāo)識符只能由字母.數(shù)字和下劃線3種字符組成,且第一個字符必須為字母或下劃線.下面列出的是合法的標(biāo)識符,也是合法的變量名: sum, average, tot

46、al, day, month, Student_name, tan, BASIC, li_ling 下面是不合法的標(biāo)識符和變量名: M.D.John, $123, #33, 3G64, Ling li, C+, Zhang-ling, U.S.A. 注意,在C+中,大寫字母和小寫字母被認為是兩個不同的字符.因此,sum和SUM是兩個不同的變量名.一般地,變量名用小寫字母表示,與人們?nèi)粘A?xí)慣一致,以增加可讀性.應(yīng)注意變量名不能與C+的關(guān)鍵字.系統(tǒng)函數(shù)名和類名相同.在國外軟件開發(fā)工作中,常習(xí)慣在變量前面加一個字母以表示該變量的類型,如iCount表示這是一個整型變量,cSex表示這是一個字符型變量

47、. C+沒有規(guī)定標(biāo)識符的長度(字符個數(shù)),但各個具體的C編譯系統(tǒng)都有自己的規(guī)定.有的系統(tǒng)取32個字符,超過的字符不被識別. 2.3.3 定義變量 在C+語言中,要求對所有用到的變量作強制定義,也就是必須“先定義,后使用”,如例2.2和例2.3那樣.定義變量的一般形式是 變量類型 變量名表列; 變量名表列指的是一個或多個變量名的序列.如 float a,b,c,d,e; 定義a,b,c,d,e為單精度型變量,注意各變量間以逗號分隔,最后是分號. 可以在定義變量時指定它的初值.如 float a=83.5,b,c=64.5,d=81.2,e; /對變量a,c,d指定了初值,b和d未指定初值 C語言

48、要求變量的定義應(yīng)該放在所有的執(zhí)行語句之前,而C+則放松了限制,只要求在第一次使用該變量之前進行定義即可.也就是說,它可以出現(xiàn)在語句的中間,如 int a;/定義變量a(在使用a之前定義) a=3; /執(zhí)行語句,對a賦值 float b; /定義變量b(在使用b之前定義) b=4.67; /執(zhí)行語句,對b賦值 char c; /定義變量c(在使用c之前定義) c=A; /執(zhí)行語句 ,對c賦值 C+要求對變量作強制定義的目的是: (1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確.例如,如果在聲明部分寫了 int student; 而在執(zhí)行語句中錯寫成statent.如 st

49、atent=30; 在編譯時檢查出statent未經(jīng)定義,作為錯誤處理.輸出“變量statent未經(jīng)聲明”的信息,便于用戶發(fā)現(xiàn)錯誤,避免變量名使用時出錯. (2) 每一個變量被指定為一確定類型,在編譯時就能為其分配相應(yīng)的存儲單元.如指定a和b為int型,一般的編譯系統(tǒng)對其各分配4個字節(jié),并按整數(shù)方式存儲數(shù)據(jù). (3) 指定每一變量屬于一個特定的類型,這就便于在編譯時,據(jù)此檢查該變量所進行的運算是否合法.例如,整型變量a和b,可以進行求余運算: a%b %是“求余”(見2.4 節(jié)),得到a/b的余數(shù).如果將a和b指定為實型變量,則不允許進行“求余”運算,在編譯時會給出有關(guān)的出錯信息. 2.3.4

50、 為變量賦初值 允許在定義變量時對它賦予一個初值,這稱為變量初始化.初值可以是常量,也可以是一個有確定值的表達式.如 float a,b=5.78*3.5,c=2*sin(2.0); 表示定義了a,b,c為單精度浮點型變量,對b初始化為5.78*3, 對c初始化為2*sin(2.0),在編譯連接后,從標(biāo)準(zhǔn)函數(shù)庫得到正弦函數(shù)sin(2.0)的值,因此變量c有確定的初值.變量a未初始化. 如果對變量未賦初值,則該變量的初值是一個不可預(yù)測的值,即該存儲單元中當(dāng)時的內(nèi)容是不知道的.例如,若未對a和b賦值,執(zhí)行輸出語句 cout<<a<< <<b<< &l

51、t;<c<<endl; 輸出結(jié)果可能為 1.48544e-38 15 1.81858(各次運行情況可能不同) 初始化不是在編譯階段完成的(只有在第4章中介紹的靜態(tài)存儲變量和外部變量的初始化是在編譯階段完成的),而是在程序運行時執(zhí)行本函數(shù)時賦予初值的,相當(dāng)于執(zhí)行一個賦值語句.例如, int a=3; 相當(dāng)于以下兩個語句 : int a; / 指定a為整型變量 a=3;/ 賦值語句,將3賦給a 對多個變量賦予同一初值,必須分別指定,不能寫成 float a=b=c=4.5; 而應(yīng)寫成 float a=4.5,b=4.5,c=4.5; 或 float a,b,c=4.5; a=b=c; 2.3.5 常變量 在定義變量時,如果加上關(guān)鍵字const,則變量的值在程序運行期間不能改變,這種變量稱為常變量(constant variable).例如, const int a=3; /用const來聲明這種變量的值不能改變,指定其值始終為3 在定義常變量時必須同時對它初始化(即指定其值),此后它的值不能再改變.常變量不能出現(xiàn)在賦值號的左邊.例如上面一行不能寫成 const int a; a=3; /常變量不能被賦值 可以用表達式對常變量初始化,如 const int b=3+6,c=3*cos(1.5);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論