




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上C+面向?qū)ο蟪绦蛟O計 譚浩強 編著目錄第1篇 基 本 知 識第1章 C+的初步知識*1.1 從C到C+*1.2 最簡單的C+程序 1.3 C+程序的構(gòu)成和書寫形式 1.4 C+程序的編寫和實現(xiàn) 1.5 關于C+上機實踐*1.1 從C到C+計算機誕生初期,人們要使用計算機必須用機器語言或匯編語言編寫程序世界上第一種計算機高級語言誕生于1954年,它是FORTRAN語言先后出現(xiàn)了多種計算機高級語言其中使用最廣泛影響最大的當推BASIC語言和C語言BASIC語言是1964年在FORTRAN語言的基礎上簡化而成的,它是為初學者設計的小型高級語言C語言是1972年由美國貝爾實驗
2、室的D.M.Ritchie研制成功的它不是為初學者設計的,而是為計算機專業(yè)人員設計的大多數(shù)系統(tǒng)軟件和許多應用軟件都是用C語言編寫的但是隨著軟件規(guī)模的增大,用C語言編寫程序漸漸顯得有些吃力了C+是由AT&T Bell(貝爾)實驗室的Bjarne Stroustrup博士及其同事于20世紀80年代初在C語言的基礎上開發(fā)成功的C+保留了C語言原有的所有優(yōu)點,增加了面向?qū)ο蟮臋C制C+是由C發(fā)展而來的,與C兼容用C語言寫的程序基本上可以不加修改地用于C+從C+的名字可以看出它是C的超集C+既可用于面向過程的結(jié)構(gòu)化程序設計,又可用于面向?qū)ο蟮某绦蛟O計,是一種功能強大的混合型的程序設計語言C+對C的
3、“增強”,表現(xiàn)在兩個方面: (1) 在原來面向過程的機制基礎上,對C語言的功能做了不少擴充(2) 增加了面向?qū)ο蟮臋C制面向?qū)ο蟪绦蛟O計,是針對開發(fā)較大規(guī)模的程序而提出來的,目的是提高軟件開發(fā)的效率不要把面向?qū)ο蠛兔嫦蜻^程對立起來,面向?qū)ο蠛兔嫦蜻^程不是矛盾的,而是各有用途互為補充的學習C+,既要會利用C+進行面向過程的結(jié)構(gòu)化程序設計,也要會利用C+進行面向?qū)ο蟮某绦蛟O計本書既介紹C+在面向過程程序設計中的應用,也介紹C+在面向?qū)ο蟪绦蛟O計中的應用*1.2 最簡單的C+程序例1.1 輸出一行字符: “This is a C+ program.”程序如下: #include <iostrea
4、m> /包含頭文件iostreamusing namespace std; /使用命名空間stdint 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+所有語句
5、最后都應當有一個分號再看程序的第1行“#include <iostream>”,這不是C+的語句,而是C+的一個預處理命令,它以“#”開頭以與C+語句相區(qū)別,行的末尾沒有分號#include <iostream>是一個“包含命令”,它的作用是將文件iostream的內(nèi)容包含到該命令所在的程序文件中,代替該命令行文件iostream的作用是向程序提供輸入或輸出時所需要的一些信息iostream是i-o-stream 3個詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類文件都放在程序單元的開頭,所以稱為“頭文件”(head file)在程序進行編譯時,先對
6、所有的預處理命令進行處理,將頭文件的具體內(nèi)容代替 #include命令行,然后再對該程序單元進行整體編譯程序的第2行“using namespace std; ” 的意思是“使用命名空間std”C+標準庫中的類和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到C+標準庫(此時就需要用#include命令行),就需要用“using namespace std; ”作聲明,表示要用到命名空間std中的內(nèi)容在初學C+時,對本程序中的第1,2行可以不必深究,只需知道: 如果程序有輸入或輸出時,必須使用“#include <iostream>”命令以提供必要的信息,同時要用“using
7、 namespace std;” ,使程序能夠使用這些信息,否則程序編譯時將出錯例1.2 求a和b兩個數(shù)之和可以寫出以下程序: / 求兩數(shù)之和 (本行是注釋行)#include <iostream> /預處理命令using namespace std; /使用命名空間stdint main( ) /主函數(shù)首部 /函數(shù)體開始 int a,b,sum; /定義變量 cin>>a>>b; /輸入語句 sum=a+b;/賦值語句cout<<a+b=<<sum<<endl; /輸出語句return 0; /如程序正常結(jié)束,向操作系統(tǒng)
8、返回一個零值 /函數(shù)結(jié)束本程序的作用是求兩個整數(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> /預處理命令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;/i
9、f語句,如果x>y,則將x的值賦給zelse 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ù),將得到的值賦給mcout<<max=<<m<<n;/輸出大數(shù)m的值return 0; /如程序正常結(jié)束,向操作系統(tǒng)返回一個零值 /主函數(shù)結(jié)束本程序包括兩個函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max程序運行情況如下: 18
10、 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;int main(
11、) 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ù)聲明的位置應當在函數(shù)調(diào)用之前下面舉一個包含類(class)和對象(object)的C+程序,目的是使讀者初步了解C
12、+是怎樣體現(xiàn)面向?qū)ο蟪绦蛟O計方法的例1.4 包含類的C+程序#include <iostream>/ 預處理命令using namespace std;class Student/ 聲明一個類,類名為Studentprivate: / 以下為類中的私有部分int num; / 私有變量numint score; / 私有變量scorepublic: / 以下為類中的公用部分void setdata( ) / 定義公用函數(shù)setdatacin>>num; / 輸入num的值cin>>score; / 輸入score的值 void display( ) / 定義
13、公用函數(shù)displaycout<<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)用對象stud2的setdata函數(shù) stud1.display( ); / 調(diào)用對
14、象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ù)的封裝性和信息隱蔽在上面的程序中,在聲明Student類時,把類中的數(shù)據(jù)和函數(shù)分為兩大類:
15、 private(私有的)和public(公用的)把全部數(shù)據(jù)(num,score)指定為私有的,把全部函數(shù)(setdata,display)指定為公用的在大多數(shù)情況下,會把所有數(shù)據(jù)指定為私有,以實現(xiàn)信息隱蔽具有“類”類型特征的變量稱為“對象”(object)程序中第1824行是主函數(shù)程序運行情況如下: 1001 98.5 (輸入學生1的學號和成績)1002 76.5 (輸入學生2的學號和成績)num=1001 (輸出學生1的學號)score=98.5 (輸出學生1的成績)num=1002 (輸出學生2的學號)score=76.5 (輸出學生2的成績)1.3 C+程序的構(gòu)成和書寫形式C+程序的結(jié)
16、構(gòu)和書寫格式歸納如下: (1) 一個C+程序可以由一個程序單位或多個程序單位構(gòu)成每一個程序單位作為一個文件在程序編譯時,編譯系統(tǒng)分別對各個文件進行編譯,因此,一個文件是一個編譯單元(2) 在一個程序單位中,可以包括以下幾個部分: 預處理命令上節(jié)4個程序中都包括#include命令 全局聲明部分(在函數(shù)外的聲明部分)在這部分中包括對用戶自己定義的數(shù)據(jù)類型的聲明和程序中所用到的變量的定義 函數(shù)函數(shù)是實現(xiàn)操作的部分,因此函數(shù)是程序中必須有的和最基本的組成部分每一個程序必須包括一個或多個函數(shù),其中必須有一個(而且只能有一個)主函數(shù)(main函數(shù))但是并不要求每一個程序文件都必須具有以上3個部分,可以缺
17、少某些部分(包括函數(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ù)之外(其作用范圍是全局的),也可以放在函數(shù)內(nèi)(其作用范圍是局部的,只在本函數(shù)內(nèi)有效)執(zhí)行部分由若干個執(zhí)行語句組成,用來進行有關的操作,以實現(xiàn)函數(shù)的功能(4) 語句包括兩
18、類一類是聲明語句,另一類是執(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計方法中的封裝信息隱蔽繼承派生多態(tài)等功能在一個類中可以包括數(shù)據(jù)成員和成員函數(shù),他們可以被指定為私有的(private)和公用的(public)屬性私有的數(shù)據(jù)成員和成員函數(shù)只能被本類的成員函數(shù)所調(diào)用(7)C+程序書寫格式自由,一行內(nèi)可以寫幾個語句, 一
19、個語句可以分寫在多行上C+程序沒有行號,也不像FORTRAN或COBOL那樣嚴格規(guī)定書寫格式(語句必須從某一列開始書寫)(8) 一個好的有使用價值的源程序都應當加上必要的注釋,以增加程序的可讀性C+還保留了C語言的注釋形式,可以用“/*/”對C+程序中的任何部分作注釋在“/*”和“*/”之間的全部內(nèi)容作為注釋用“/”作注釋時,有效范圍只有一行,即本行有效,不能跨行而用“/*/”作注釋時有效范圍為多行只要在開始處有一個“/*”,在最后一行結(jié)束處有一個“*/”即可因此,一般習慣是: 內(nèi)容較少的簡單注釋常用“/”,內(nèi)容較長的常用“/*/ ”1.4 C+程序的編寫和實現(xiàn)一個程序從編寫到最后得到運行結(jié)果
20、要經(jīng)歷以下一些步驟1. 用C+語言編寫程序用高級語言編寫的程序稱為“源程序”(source program)C+的源程序是以.cpp作為后綴的(cpp是c plus plus 的縮寫)2. 對源程序進行編譯為了使計算機能執(zhí)行高級語言源程序,必須先用一種稱為“編譯器(complier)”的軟件(也稱編譯程序或編譯系統(tǒng)),把源程序翻譯成二進制形式的“目標程序(object program)”編譯是以源程序文件為單位分別編譯的目標程序一般以.obj或.o作為后綴(object 的縮寫)編譯的作用是對源程序進行詞法檢查和語法檢查編譯時對文件中的全部內(nèi)容進行檢查,編譯結(jié)束后會顯示出所有的編譯出錯信息一般
21、編譯系統(tǒng)給出的出錯信息分為兩種,一種是錯誤(error);一種是警告(warning) 3. 將目標文件連接在改正所有的錯誤并全部通過編譯后,得到一個或多個目標文件此時要用系統(tǒng)提供的“連接程序(linker)”將一個程序的所有目標程序和系統(tǒng)的庫文件以及系統(tǒng)提供的其他信息連接起來,最終形成一個可執(zhí)行的二進制文件,它的后綴是.exe,是可以直接執(zhí)行的4. 運行程序 運行最終形成的可執(zhí)行的二進制文件(.exe文件),得到運行結(jié)果5. 分析運行結(jié)果如果運行結(jié)果不正確,應檢查程序或算法是否有問題圖1.11.5 關于C+上機實踐在了解了C+語言的初步知識后,讀者最好盡快在計算機上編譯和運行C+程序,以加深
22、對C+程序的認識,并初步掌握C+的上機操作讀者可以使用不同的C+編譯系統(tǒng),在不同的環(huán)境下編譯和運行一個C+程序但是需要強調(diào)的是,我們學習的是C+程序設計,應當掌握的是標準C+,而不應該只了解某一種“方言化”的C+不應當只會使用一種C+編譯系統(tǒng),只能在一種環(huán)境下工作,而應當能在不同的C+環(huán)境下運行自己的程序,并且了解不同的C+編譯系統(tǒng)的特點和使用方法,在需要時能將自己的程序方便地移植到不同的平臺上在本書的參考書C+程序設計題解與上機指導一書中簡單介紹了在Visual C+ 6.0和GCC兩種典型的環(huán)境下運行C+程序的方法請讀者選擇一種(如能做到兩種更好) C+編譯系統(tǒng),在該環(huán)境下輸入和運行習題中
23、的程序,掌握上機的方法和步驟第2章 數(shù)據(jù)類型與表達式2.1 C+的數(shù)據(jù)類型2.2 常量2.3 變量2.4 C+的運算符2.5 算術運算符與算術表達式2.6 賦值運算符與賦值表達式2.7 逗號運算符與逗號表達式2.1 C+的數(shù)據(jù)類型計算機處理的對象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的(例如整數(shù)浮點數(shù)字符等形式)不同的數(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+可以
24、使用的數(shù)據(jù)類型如下:C+的數(shù)據(jù)包括常量與變量,常量與變量都具有類型由以上這些數(shù)據(jù)類型還可以構(gòu)成更復雜的數(shù)據(jù)結(jié)構(gòu)例如利用指針和結(jié)構(gòu)體類型可以構(gòu)成表樹棧等復雜的數(shù)據(jù)結(jié)構(gòu)C+并沒有統(tǒng)一規(guī)定各類數(shù)據(jù)的精度數(shù)值范圍和在內(nèi)存中所占的字節(jié)數(shù),各C+編譯系統(tǒng)根據(jù)自己的情況作出安排書中表2.1列出了Visual C+數(shù)值型和字符型數(shù)據(jù)的情況說明:(1) 整型數(shù)據(jù)分為長整型(long int)一般整型(int)和短整型(short int)在int前面加long和short分別表示長整型和短整型(2) 整型數(shù)據(jù)的存儲方式為按二進制數(shù)形式存儲,例如十進制整數(shù)85的二進制形式為,則在內(nèi)存中的存儲形式如圖2.1所示圖2
25、.1(3) 在整型符號int和字符型符號char的前面,可以加修飾符signed(表示“有符號”)或unsigned(表示“無符號”)如果指定為signed,則數(shù)值以補碼形式存放,存儲單元中的最高位(bit)用來表示數(shù)值的符號如果指定為unsigned,則數(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ù)
26、分為單精度(float)雙精度(double)和長雙精度(long double)3種,在Visual C+ 6.0中,對float提供6位有效數(shù)字,對double提供15位有效數(shù)字,并且float和double的數(shù)值范圍不同對float分配4個字節(jié),對double和long double分配8個字節(jié)(5) 表中類型標識符一欄中,方括號 包含的部分可以省寫,如short和short int等效,unsigned int和unsigned等效常量的值是不能改變的,一般從其字面形式即可判別是否為常量常量包括兩大類,即數(shù)值型常量(即常數(shù))和字符型常量如12,0,-3為整型常量,4.6,-1.23為實
27、型常量,包含在兩個單撇號之間的字符為字符常量,如a,x這種從字面形式即可識別的常量稱為“字面常量”或“直接常量”2.2 常量2.2.1 什么是常量2.2.2 數(shù)值常量數(shù)值常量就是通常所說的常數(shù)在C+中,數(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ū)分為以上的類
28、別呢?(1) 一個整數(shù),如果其值在-32768+32767范圍內(nèi),認為它是short int型,它可以賦值給short int型int型和long int型變量(2) 一個整數(shù),如果其值超過了上述范圍,而在-+范圍內(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ù)可以
29、賦值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可一個整型常量可以用3種不同的方式表示: (1) 十進制整數(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,它相當于十進制數(shù)16(3) 十六進制整數(shù)在常數(shù)的開頭加一個數(shù)字0和一個英文字母X(或x),就表示
30、這是以十六進制數(shù)形式表示的常數(shù)如0X20表示這是十六進制數(shù)20,即(20)16,它相當于十進制數(shù)322. 浮點數(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é)
31、(2) 指數(shù)形式(即浮點形式)一個浮點數(shù)可以寫成指數(shù)形式,如3.14159可以表示為0.×101,3.14159×100,31.4159×10-1,314.159×10-2等形式在程序中應表示為: 0.e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的數(shù)是以10為底的冪,如e12表示1012其一般形式為數(shù)符 數(shù)字部分 指數(shù)部分上面各數(shù)據(jù)中的0.,3.14159, 31.4159, 314.159 等就是其中的數(shù)字部分可以看到: 由于指數(shù)部分的存在,使得同一個浮點數(shù)可以用不同的指數(shù)形式來表示,數(shù)字部分中小數(shù)點的位置是
32、浮動的例如: a=0.e1;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.e3等形式,在內(nèi)存中都是以規(guī)范化的指數(shù)形式存放,如圖2.3所示圖2.3數(shù)字部分必須小于1,同時,小數(shù)點后面第一個數(shù)字必須是一個非0數(shù)字,例如不能是0.因此314.159和314.159e0,31.4159e1,3.14159e2, 0.e3在內(nèi)存中
33、表示成0.×103存儲單元分為兩部分,一部分用來存放數(shù)字部分,一部分用來存放指數(shù)部分為便于理解,在圖2.3中是用十進制表示的,實際上在存儲單元中是用二進制數(shù)來表示小數(shù)部分,用2的冪次來表示指數(shù)部分的對于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理 2.2.3 字符常量1. 普通的字符常量用單撇號括起來的一個字符就是字符型常量如a,#,%,D都是合法的字符常量,在內(nèi)存中占一個字節(jié)注意: 字符常量只能包括一個字符,如AB 是不合法的字符常量區(qū)分大小寫字母,如A和a是兩個不同的字符常量撇號()是定界符,而不屬于字符常量的一部分如cout<<a;輸出的是一個字母“a”,而不是
34、3個字符“a ”2. 轉(zhuǎn)義字符常量除了以上形式的字符常量外,C+還允許用一種特殊形式的字符常量,就是以 “”開頭的字符序列例如,n代表一個“換行”符“cout<<n; ” 將輸出一個換行,其作用與“cout<<endl; ” 相同這種“控制字符”,在屏幕上是不能顯示的在程序中也無法用一個一般形式的字符表示,只能采用特殊形式來表示常用的以“”開頭的特殊字符見書中表2.23. 字符數(shù)據(jù)在內(nèi)存中的存儲形式及其使用方法將一個字符常量存放到內(nèi)存單元時,實際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中如果字符變量c1的值為a,c2的值為b,則
35、在變量中存放的是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ù)進行算術運算,此時相當于對它們的ASCII碼進行算術運算例2.1 將字符賦給整型變量#include <iostream>using namespace std;int main( ) int i,j; /i和j是整型變量i=A;
36、/將一個字符常量賦給整型變量ij=B; /將一個字符常量賦給整型變量jcout<<i<< <<j<<n; /輸出整型變量i和j的值,n 是換行符return 0;執(zhí)行時輸出 65 66i和j被指定為整型變量但在第5和第6行中,將字符A和B分別賦給i和j,它的作用相當于以下兩個賦值語句:i=65;j=66;因為A和B的ASCII碼為65和66在程序的第5和第6行是把65和66直接存放到i和j的內(nèi)存單元中因此輸出65和66可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的但是應注意字符數(shù)據(jù)只占一個字節(jié),它只能存放0255范圍內(nèi)的整數(shù)例2.2 字
37、符數(shù)據(jù)與整數(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 Ba的ASCII碼為97,而A的ASCII碼為65,b為98,B為66從ASCII代碼表中可以看到每一個小寫字母比它相應的大寫字母的ASCII代碼大32C+符數(shù)據(jù)與數(shù)值直接進行算術運算,a-32得到整數(shù)65,b
38、-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作為字符串結(jié)束標志但0并不是字符串的一部分,它只作為字符串的結(jié)束標志如cout<<abc<<endl;輸出3個字符abc,而不包括0注意: a和a代表不同的含義,a是字符串常量,a 是字符
39、常量前者占兩個字節(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)義字符的標志,把它和其后的字符一起作為一個轉(zhuǎn)義字符如果“”后面的字符不能與“”組成一個合法的轉(zhuǎn)義字符(如c),則在編譯時顯示出錯信息如果希望將“”字符也作為字符串中的一個字符,則應寫為abcn,此時字符包括5個字符,即a,b,c,n如果有以下輸出語句:co
40、ut<<abcn<<endl;則會輸出: abc,然后換行同理執(zhí)行cout<<I say Thank you!n;的輸出是: I say Thank you!如果在一個字符串中最后一個字符為“”,則表示它是續(xù)行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格如cout<<We must study C/本行最后的“”后面的空格和換行均不起作用+ hard!;/本行的字符緊連在上一行最后的“”前面字符之后則輸出: We must study C+ hard!2.2.4 符號常量為了編程和閱讀的方便,在C+程序設計中,常用一個符號名代表一個
41、常量,稱為符號常量,即以標識符形式出現(xiàn)的常量例2.3 符號常量的使用#define PRICE 30 /注意這不是語句,末尾不要加分號int main ( ) int num,total;num=10;total=num * PRICE;cout<<total=<<total<<endl;return 0; 程序中用預處理命令#define指定PRICE在本程序單位中代表常量30,此后凡在本程序單位中出現(xiàn)的PRICE都代表30,可以和常量一樣進行運算,程序運行結(jié)果為 total=300 請注意符號常量雖然有名字,但它不是變量它的值在其作用域(在本例中為主函數(shù)
42、)內(nèi)是不能改變的,也不能被賦值如用賦值語句“PRICE=40;”給PRICE賦值是錯誤的 使用符號常量的好處是:(1) 含義清楚(2) 在需要改變一個常量時能做到“一改全改” 如#define PRICE 352.3 變量2.3.1 什么是變量其實在前面的例子中已經(jīng)多次用到了變量在程序運行期間其值可以改變的量稱為變量一個變量應該有一個名字,并在內(nèi)存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值請注意區(qū)分變量名和變量值這兩個不同的概念,見圖2.6圖2.62.3.2 變量名規(guī)則先介紹標識符的概念和其他高級語言一樣,用來標識變量符號常量函數(shù)數(shù)組類型等實體名字的有效字符序列稱為標識符(identif
43、ier)簡單地說,標識符就是一個名字變量名是標識符的一種,變量的名字必須遵循標識符的命名規(guī)則C+規(guī)定標識符只能由字母數(shù)字和下劃線3種字符組成,且第一個字符必須為字母或下劃線下面列出的是合法的標識符,也是合法的變量名:sum, average, total, 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是兩個不同的變量名一般地,變量
44、名用小寫字母表示,與人們?nèi)粘A晳T一致,以增加可讀性應注意變量名不能與C+的關鍵字系統(tǒng)函數(shù)名和類名相同在國外軟件開發(fā)工作中,常習慣在變量前面加一個字母以表示該變量的類型,如iCount表示這是一個整型變量,cSex表示這是一個字符型變量C+沒有規(guī)定標識符的長度(字符個數(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,
45、d,e為單精度型變量,注意各變量間以逗號分隔,最后是分號可以在定義變量時指定它的初值如 float a=83.5,b,c=64.5,d=81.2,e; /對變量a,c,d指定了初值,b和d未指定初值C語言要求變量的定義應該放在所有的執(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+要求對變量作強
46、制定義的目的是:(1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確例如,如果在聲明部分寫了int student;而在執(zhí)行語句中錯寫成statent如statent=30;在編譯時檢查出statent未經(jīng)定義,作為錯誤處理輸出“變量statent未經(jīng)聲明”的信息,便于用戶發(fā)現(xiàn)錯誤,避免變量名使用時出錯(2) 每一個變量被指定為一確定類型,在編譯時就能為其分配相應的存儲單元如指定a和b為int型,一般的編譯系統(tǒng)對其各分配4個字節(jié),并按整數(shù)方式存儲數(shù)據(jù)(3) 指定每一變量屬于一個特定的類型,這就便于在編譯時,據(jù)此檢查該變量所進行的運算是否合法例如,整型變量a和b,可以進行求余
47、運算:a%b%是“求余”(見2.4 節(jié)),得到a/b的余數(shù)如果將a和b指定為實型變量,則不允許進行“求余”運算,在編譯時會給出有關的出錯信息2.3.4 為變量賦初值 允許在定義變量時對它賦予一個初值,這稱為變量初始化初值可以是常量,也可以是一個有確定值的表達式如float a,b=5.78*3.5,c=2*sin(2.0);表示定義了a,b,c為單精度浮點型變量,對b初始化為5.78*3, 對c初始化為2*sin(2.0),在編譯連接后,從標準函數(shù)庫得到正弦函數(shù)sin(2.0)的值,因此變量c有確定的初值變量a未初始化如果對變量未賦初值,則該變量的初值是一個不可預測的值,即該存儲單元中當時的內(nèi)
48、容是不知道的例如,若未對a和b賦值,執(zhí)行輸出語句cout<<a<< <<b<< <<c<<endl;輸出結(jié)果可能為1.48544e-38 15 1.81858(各次運行情況可能不同)初始化不是在編譯階段完成的(只有在第4章中介紹的靜態(tài)存儲變量和外部變量的初始化是在編譯階段完成的),而是在程序運行時執(zhí)行本函數(shù)時賦予初值的,相當于執(zhí)行一個賦值語句例如,int a=3;相當于以下兩個語句 :int a; / 指定a為整型變量a=3;/ 賦值語句,將3賦給a 對多個變量賦予同一初值,必須分別指定,不能寫成float a=b=c=4
49、.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在定義常變量時必須同時對它初始化(即指定其值),此后它的值不能再改變常變量不能出現(xiàn)在賦值號的左邊例如上面一行不能寫成const int a;a=3; /常變量不能被賦值可以用表達式對常變量初始化,如const int b=3+6,c=3*cos(1
50、.5);/b的值被指定為9,c的值被指定為3*cos(1.5)但應注意,由于使用了系統(tǒng)標準數(shù)學函數(shù)cos,必須將包含該函數(shù)有關的信息的頭文件“cmath”(或math.h)包含到本程序單位中來,可以在本程序單位的開頭加上以下#include命令:#include <cmath> 或 #include <math.h>變量的值應該是可以變化的,怎么值是固定的量也稱變量呢?其實,從計算機實現(xiàn)的角度看,變量的特征是存在一個以變量名命名的存儲單元,在一般情況下,存儲單元中的內(nèi)容是可以變化的對常變量來說,無非在此變量的基礎上加上一個限定: 存儲單元中的值不允許變化因此常變量又稱為
51、只讀變量(read-only-variable)請區(qū)別用#define命令定義的符號常量和用const定義的常變量符號常量只是用一個符號代替一個字符串,在預編譯時把所有符號常量替換為所指定的字符串,它沒有類型,在內(nèi)存中并不存在以符號常量命名的存儲單元而常變量具有變量的特征,它具有類型,在內(nèi)存中存在著以它命名的存儲單元,可以用sizeof運算符測出其長度與一般變量惟一的不同是指定變量的值不能改變用#define命令定義符號常量是C語言所采用的方法,C+把它保留下來是為了和C兼容C+的程序員一般喜歡用const定義常變量雖然二者實現(xiàn)的方法不同,但從使用的角度看,都可以認為用了一個標識符代表了一個常
52、量有些書上把用const定義的常變量也稱為定義常量,但讀者應該了解它和符號常量的區(qū)別2.4 C+的運算符C+的運算符十分豐富,使得C+的運算十分靈活方便例如把賦值號(=)也作為運算符處理,這樣,a=b=c=4就是合法的表達式,這是與其他語言不同的C+提供了以下運算符:(1) 算術運算符 +(加)-(減) *(乘) /(除) %(整除求余)+(自加) -(自減)(2) 關系運算符>(大于)<(小于) =(等于)>=(大于或等于)<=(小于或等于)!=(不等于)(3) 邏輯運算符 &&(邏輯與) |(邏輯或) !(邏輯非)(4) 位運算符 <<(
53、按位左移) >>(按位右移) &(按位與) |(按位或) (按位異或) (按位取反)(5) 賦值運算符 (=及其擴展賦值運算符)(6) 條件運算符 (?:)(7) 逗號運算符 (,)(8) 指針運算符 (*)(9)引用運算符和地址運算符 (&)(10) 求字節(jié)數(shù)運算符(sizeof)(11) 強制類型轉(zhuǎn)換運算符( (類型) 或類型( )(12) 成員運算符 (.)(13) 指向成員的運算符 (->)(14) 下標運算符 ( )(15) 其他 (如函數(shù)調(diào)用運算符()2.5 算術運算符與算術表達式2.5.1 基本的算術運算符在本章中主要介紹算術運算符與算術表達式,
54、賦值運算符與賦值表達式,逗號運算符與逗號表達式,其他運算符將在以后各章中陸續(xù)介紹+(加法運算符,或正值運算符如3+5,+3)-(減法運算符,或負值運算符如5-2,-3)* (乘法運算符如3*5)/(除法運算符如5/3)%(模運算符,或稱求余運算符,%兩側(cè)均應為整型數(shù)據(jù),如7%4的值為3)需要說明,兩個整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果值為1,舍去小數(shù)部分但是,如果除數(shù)或被除數(shù)中有一個為負值,則舍入的方向是不固定的例如,-5/3在有的C+系統(tǒng)上得到結(jié)果-1,有的C+系統(tǒng)則給出結(jié)果-2多數(shù)編譯系統(tǒng)采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠攏如果參加+, -,
55、*, / 運算的兩個數(shù)中有一個數(shù)為float型數(shù)據(jù),則運算的結(jié)果是double型,因為C+在運算時對所有float型數(shù)據(jù)都按double型數(shù)據(jù)處理2.5.2 算術表達式和運算符的優(yōu)先級與結(jié)合性用算術運算符和括號將運算對象(也稱操作數(shù))連接起來的符合C+語法規(guī)則的式子,稱C+算術表達式運算對象包括常量變量函數(shù)等例如,下面是一個合法的C+算術表達式:a*b/c-1.5+aC+語言規(guī)定了運算符的優(yōu)先級和結(jié)合性在求解表達式時,先按運算符的優(yōu)先級別高低次序執(zhí)行,例如先乘除后加減如有表達式a-b*c,b的左側(cè)為減號,右側(cè)為乘號,而乘號優(yōu)先于減號,因此,相當于a-(b*c)如果在一個運算對象兩側(cè)的運算符的優(yōu)先級別相同,如a-b+c,則按規(guī)定的“結(jié)合方向”處理C+規(guī)定了各種運算符的結(jié)合方向(結(jié)合性),算術運算符的結(jié)合方向為“自左至右”,即先左后右,因此b先與減號
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB 3683-2024 水松紙卷筒料圓壓圓燙金機
- 二零二五年度房屋租賃合同(含瑜伽館)
- 2025年度肥料產(chǎn)品包裝設計及印刷合同
- 2025年度綠色生態(tài)果園轉(zhuǎn)讓協(xié)議書
- 二零二五年度智慧城市建設項目業(yè)績提成合同
- 天津市2025年度勞動合同解除經(jīng)濟補償金支付與發(fā)放合同
- 二零二五年度科研機構(gòu)與高校人才合作就業(yè)協(xié)議書范本
- 二零二五年度臨時協(xié)議書:智慧社區(qū)建設與物業(yè)管理合作
- 2025年度智能車庫租賃與智慧城市建設項目合同
- 2025年度裝配行業(yè)人才培養(yǎng)終止合同協(xié)議
- 醫(yī)務人員生涯規(guī)劃
- FOCUS-PDCA改善案例-提高術前手術部位皮膚準備合格率醫(yī)院品質(zhì)管理成果匯報
- 2024解析:第五章透鏡及其應用-基礎練(解析版)
- 河南省第二屆職業(yè)技能大賽健康和社會照護項(世賽)項目技術工作文件
- 《護士禮儀與溝通》課件
- 專題05標點符號考點專訓(01)(含答案)2025年新高考語文一輪復習考點滿分寶典
- 保密法實施條例培訓
- 鉗工工藝學(第6版)完整全套教學課件
- DB11T 1035-2013 城市軌道交通能源消耗評價方法
- 老年科護士進修匯報
- 2024新能源光伏電站運行規(guī)程和檢修規(guī)程
評論
0/150
提交評論