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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、應用軟件都是用C語言編寫的. 但是隨著軟件規模的增大,用C語言編寫程序漸漸顯得有些吃力了. C+是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事于20世紀80年代初在C語言的基礎上開發成功的.C+保留了C語言原有的所有優點,增加了面向對象的機制. C+是由C發展而來的,與C兼容.用C語言寫的程序基本上可以不加修改地用于C+.從C+的名字可以看出它是C的超集.C+既可用于面向過程的結構化程序設計,又可用于面向對象的程序設計,是一種功能強大的混合型的程序設計語言. C+對C的增強,表現在兩個方面: (1) 在原來面向過程的機制基礎上,對C語言的功能做了不

4、少擴充. (2) 增加了面向對象的機制. 面向對象程序設計,是針對開發較大規模的程序而提出來的,目的是提高軟件開發的效率. 不要把面向對象和面向過程對立起來,面向對象和面向過程不是矛盾的,而是各有用途.互為補充的. 學習C+,既要會利用C+進行面向過程的結構化程序設計,也要會利用C+進行面向對象的程序設計.本書既介紹C+在面向過程程序設計中的應用,也介紹C+在面向對象程序設計中的應用. *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代表主函數的名字.每一個C+程序都必須有一個 main 函數.main前面的int的作用是聲明函數的類型為整型.程序第6行的作用是向操作系統返回一個零值.如果程序不能正常執行,則會自動向操作系統返回一個非零值,一般為-1. 函數體是由大括號 括起來的.本例中主函數內只有一個以cout開頭的語句.注意C+所有語句最后都應當有一個分號. 再看程序的第

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

37、字符本身放到內存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中.如果字符變量c1的值為a,c2的值為b,則在變量中存放的是a的ASCII碼97,b 的ASCII碼98,如圖2.4(a)所示,實際上在內存中是以二進制形式存放的,如圖2.4(b)所示. 圖2.4 既然字符數據是以ASCII碼存儲的,它的存儲形式就與整數的存儲形式類似.這樣,在C+中字符型數據和整型數據之間就可以通用.一個字符數據可以賦給一個整型變量,反之,一個整型數據也可以賦給一個字符變量.也可以對字符數據進行算術運算,此時相當于對它們的ASCII碼進行算術運算. 例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; 執行時輸出 65 66 i和j被指定為整型變量.但在第5和第6行中,將字符A和B分別賦給i和j,它的作用相當于以下兩個賦值語句: i=65;j=66; 因為A和B的ASCII碼為65和66.在程序的第5和第6行是把65和66直接存放到i和j

39、的內存單元中.因此輸出65和66. 可以看到:在一定條件下,字符型數據和整型數據是可以通用的.但是應注意字符數據只占一個字節,它只能存放0255范圍內的整數. 例2.2 字符數據與整數進行算術運算.下面程序的作用是將小寫字母轉換為大寫字母. #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; 運行結果為 A B a的ASCII碼為

40、97,而A的ASCII碼為65,b為98,B為66.從ASCII代碼表中可以看到每一個小寫字母比它相應的大寫字母的ASCII代碼大32.C+符數據與數值直接進行算術運算,a-32得到整數65,b-32得到整數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在內存中占4個字節(而不是3個字節),見圖2.5. 圖2.5 編譯系統會在字符串最后自動加一個0作

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

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

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

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

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

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

47、. C+沒有規定標識符的長度(字符個數),但各個具體的C編譯系統都有自己的規定.有的系統取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、要求變量的定義應該放在所有的執行語句之前,而C+則放松了限制,只要求在第一次使用該變量之前進行定義即可.也就是說,它可以出現在語句的中間,如 int a;/定義變量a(在使用a之前定義) a=3; /執行語句,對a賦值 float b; /定義變量b(在使用b之前定義) b=4.67; /執行語句,對b賦值 char c; /定義變量c(在使用c之前定義) c=A; /執行語句 ,對c賦值 C+要求對變量作強制定義的目的是: (1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確.例如,如果在聲明部分寫了 int student; 而在執行語句中錯寫成statent.如 st

49、atent=30; 在編譯時檢查出statent未經定義,作為錯誤處理.輸出“變量statent未經聲明”的信息,便于用戶發現錯誤,避免變量名使用時出錯. (2) 每一個變量被指定為一確定類型,在編譯時就能為其分配相應的存儲單元.如指定a和b為int型,一般的編譯系統對其各分配4個字節,并按整數方式存儲數據. (3) 指定每一變量屬于一個特定的類型,這就便于在編譯時,據此檢查該變量所進行的運算是否合法.例如,整型變量a和b,可以進行求余運算: a%b %是“求余”(見2.4 節),得到a/b的余數.如果將a和b指定為實型變量,則不允許進行“求余”運算,在編譯時會給出有關的出錯信息. 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),在編譯連接后,從標準函數庫得到正弦函數sin(2.0)的值,因此變量c有確定的初值.變量a未初始化. 如果對變量未賦初值,則該變量的初值是一個不可預測的值,即該存儲單元中當時的內容是不知道的.例如,若未對a和b賦值,執行輸出語句 cout<<a<< <<b<< &l

51、t;<c<<endl; 輸出結果可能為 1.48544e-38 15 1.81858(各次運行情況可能不同) 初始化不是在編譯階段完成的(只有在第4章中介紹的靜態存儲變量和外部變量的初始化是在編譯階段完成的),而是在程序運行時執行本函數時賦予初值的,相當于執行一個賦值語句.例如, int a=3; 相當于以下兩個語句 : int a; / 指定a為整型變量 a=3;/ 賦值語句,將3賦給a 對多個變量賦予同一初值,必須分別指定,不能寫成 float a=b=c=4.5; 而應寫成 float a=4.5,b=4.5,c=4.5; 或 float a,b,c=4.5; a=b=c; 2.3.5 常變量 在定義變量時,如果加上關鍵字const,則變量的值在程序運行期間不能改變,這種變量稱為常變量(constant variable).例如, const int a=3; /用const來聲明這種變量的值不能改變,指定其值始終為3 在定義常變量時必須同時對它初始化(即指定其值),此后它的值不能再改變.常變量不能出現在賦值號的左邊.例如上面一行不能寫成 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論