版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
C++程序設(shè)計(jì)中國(guó)高等院校計(jì)算機(jī)根底教育課程體系規(guī)劃教材譚浩強(qiáng)編著總目錄 第1篇基本知識(shí) 第1章C++的初步知識(shí) 第2章數(shù)據(jù)類(lèi)型與表達(dá)式 第2篇面向過(guò)程的程序設(shè)計(jì) 第3章程序設(shè)計(jì)初步 第4章函數(shù)與預(yù)處理 第5章數(shù)組 第6章指針 第7章自定義數(shù)據(jù)類(lèi)型 第3篇基于對(duì)象的程序設(shè)計(jì) 第8章類(lèi)和對(duì)象 第9章關(guān)于類(lèi)和對(duì)象的進(jìn)一步討論 第10章運(yùn)算符重載 第4篇面向?qū)ο蟮某绦蛟O(shè)計(jì) 第11章繼承與派生 第12章多態(tài)性與虛函數(shù) 第13章輸入輸出流 第14章C++工具第1章C++的初步知識(shí)第2章數(shù)據(jù)類(lèi)型與表達(dá)式第1篇
基本知識(shí)第1章C++的初步知識(shí)*1.1從C到C++*1.2最簡(jiǎn)單的C++程序
1.3C++程序的構(gòu)成和書(shū)寫(xiě)形式
1.4C++程序的編寫(xiě)和實(shí)現(xiàn)
1.5關(guān)于C++上機(jī)實(shí)踐計(jì)算機(jī)誕生初期,人們要使用計(jì)算機(jī)必須用機(jī)器語(yǔ)言或匯編語(yǔ)言編寫(xiě)程序。世界上第一種計(jì)算機(jī)高級(jí)語(yǔ)言誕生于1954年,它是FORTRAN語(yǔ)言。先后出現(xiàn)了多種計(jì)算機(jī)高級(jí)語(yǔ)言。其中使用最廣泛、影響最大的當(dāng)推BASIC語(yǔ)言和C語(yǔ)言。BASIC語(yǔ)言是1964年在FORTRAN語(yǔ)言的根底上簡(jiǎn)化而成的,它是為初學(xué)者設(shè)計(jì)的小型高級(jí)語(yǔ)言。C語(yǔ)言是1972年由美國(guó)貝爾實(shí)驗(yàn)室的研制成功的。它不是為初學(xué)者設(shè)計(jì)的,而是為計(jì)算機(jī)專(zhuān)業(yè)人員設(shè)計(jì)的。大多數(shù)系統(tǒng)軟件和許多應(yīng)用軟件都是用C語(yǔ)言編寫(xiě)的。*1.1從C到C++但是隨著軟件規(guī)模的增大,用C語(yǔ)言編寫(xiě)程序漸漸顯得有些吃力了。C++是由AT&TBell〔貝爾〕實(shí)驗(yàn)室的BjarneStroustrup博士及其同事于20世紀(jì)80年代初在C語(yǔ)言的根底上開(kāi)發(fā)成功的。C++保存了C語(yǔ)言原有的所有優(yōu)點(diǎn),增加了面向?qū)ο蟮臋C(jī)制。C++是由C開(kāi)展而來(lái)的,與C兼容。用C語(yǔ)言寫(xiě)的程序根本上可以不加修改地用于C++。從C++的名字可以看出它是C的超集。C++既可用于面向過(guò)程的結(jié)構(gòu)化程序設(shè)計(jì),又可用于面向?qū)ο蟮某绦蛟O(shè)計(jì),是一種功能強(qiáng)大的混合型的程序設(shè)計(jì)語(yǔ)言。C++對(duì)C的“增強(qiáng)”,表現(xiàn)在兩個(gè)方面:〔1〕在原來(lái)面向過(guò)程的機(jī)制根底上,對(duì)C語(yǔ)言的功能做了不少擴(kuò)充?!?〕增加了面向?qū)ο蟮臋C(jī)制。面向?qū)ο蟪绦蛟O(shè)計(jì),是針對(duì)開(kāi)發(fā)較大規(guī)模的程序而提出來(lái)的,目的是提高軟件開(kāi)發(fā)的效率。不要把面向?qū)ο蠛兔嫦蜻^(guò)程對(duì)立起來(lái),面向?qū)ο蠛兔嫦蜻^(guò)程不是矛盾的,而是各有用途、互為補(bǔ)充的。學(xué)習(xí)C++,既要會(huì)利用C++進(jìn)行面向過(guò)程的結(jié)構(gòu)化程序設(shè)計(jì),也要會(huì)利用C++進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。本書(shū)既介紹C++在面向過(guò)程程序設(shè)計(jì)中的應(yīng)用,也介紹C++在面向?qū)ο蟪绦蛟O(shè)計(jì)中的應(yīng)用。例1.1輸出一行字符:“ThisisaC++program.”。程序如下:#include<iostream>//包含頭文件iostreamusingnamespacestd;//使用命名空間stdintmain〔〕{cout<<″ThisisaC++program.″;return0;}在運(yùn)行時(shí)會(huì)在屏幕上輸出以下一行信息:ThisisaC++program.*1.2最簡(jiǎn)單的C++程序用main代表“主函數(shù)”的名字。每一個(gè)C++程序都必須有一個(gè)main函數(shù)。main前面的int的作用是聲明函數(shù)的類(lèi)型為整型。程序第6行的作用是向操作系統(tǒng)返回一個(gè)零值。如果程序不能正常執(zhí)行,那么會(huì)自動(dòng)向操作系統(tǒng)返回一個(gè)非零值,一般為-1。函數(shù)體是由大括號(hào){}括起來(lái)的。本例中主函數(shù)內(nèi)只有一個(gè)以cout開(kāi)頭的語(yǔ)句。注意C++所有語(yǔ)句最后都應(yīng)當(dāng)有一個(gè)分號(hào)。再看程序的第1行“#include<iostream>”,這不是C++的語(yǔ)句,而是C++的一個(gè)預(yù)處理命令,它以“#”開(kāi)頭以與C++語(yǔ)句相區(qū)別,行的末尾沒(méi)有分號(hào)。#include<iostream>是一個(gè)“包含命令”,它的作用是將文件iostream的內(nèi)容包含到該命令所在的程序文件中,代替該命令行。文件iostream的作用是向程序提供輸入或輸出時(shí)所需要的一些信息。iostream是i-o-stream3個(gè)詞的組合,從它的形式就可以知道它代表“輸入輸出流”的意思,由于這類(lèi)文件都放在程序單元的開(kāi)頭,所以稱(chēng)為“頭文件”〔headfile〕。在程序進(jìn)行編譯時(shí),先對(duì)所有的預(yù)處理命令進(jìn)行處理,將頭文件的具體內(nèi)容代替#include命令行,然后再對(duì)該程序單元進(jìn)行整體編譯。程序的第2行“usingnamespacestd;”的意思是“使用命名空間std”。C++標(biāo)準(zhǔn)庫(kù)中的類(lèi)和函數(shù)是在命名空間std中聲明的,因此程序中如果需要用到C++標(biāo)準(zhǔn)庫(kù)〔此時(shí)就需要用#include命令行〕,就需要用“usingnamespacestd;”作聲明,表示要用到命名空間std中的內(nèi)容。在初學(xué)C++時(shí),對(duì)本程序中的第1,2行可以不必深究,只需知道:如果程序有輸入或輸出時(shí),必須使用“#include<iostream>”命令以提供必要的信息,同時(shí)要用“usingnamespacestd;”,使程序能夠使用這些信息,否那么程序編譯時(shí)將出錯(cuò)。例1.2求a和b兩個(gè)數(shù)之和??梢詫?xiě)出以下程序://求兩數(shù)之和〔本行是注釋行〕#include<iostream>//預(yù)處理命令usingnamespacestd;//使用命名空間stdintmain〔〕//主函數(shù)首部{//函數(shù)體開(kāi)始inta,b,sum;//定義變量cin>>a>>b;//輸入語(yǔ)句sum=a+b;//賦值語(yǔ)句cout<<″a+b=″<<sum<<endl;//輸出語(yǔ)句return0;//如程序正常結(jié)束,向操作系統(tǒng)返回一個(gè)零值}//函數(shù)結(jié)束本程序的作用是求兩個(gè)整數(shù)a和b之和sum。第1行“//求兩數(shù)之和”是一個(gè)注釋行,C++規(guī)定在一行中如果出現(xiàn)“//”,那么從它開(kāi)始到本行末尾之間的全部?jī)?nèi)容都作為注釋。如果在運(yùn)行時(shí)從鍵盤(pán)輸入123456↙那么輸出為a+b=579例1.3給兩個(gè)數(shù)x和y,求兩數(shù)中的大者。在本例中包含兩個(gè)函數(shù)。#include<iostream>//預(yù)處理命令usingnamespacestd;intmax〔intx,inty〕//定義max函數(shù),函數(shù)值為整型,形式參數(shù)x,y為整型{//max函數(shù)體開(kāi)始intz;//變量聲明,定義本函數(shù)中用到的變量z為整型if〔x>y〕z=x;//if語(yǔ)句,如果x>y,那么將x的值賦給zelsez=y;//否那么,將y的值賦給zreturn〔z〕;//將z的值返回,通過(guò)max帶回調(diào)用處}//max函數(shù)結(jié)束intmain〔〕//主函數(shù){//主函數(shù)體開(kāi)始inta,b,m;//變量聲明cin>>a>>b;//輸入變量a和b的值m=max〔a,b〕;//調(diào)用max函數(shù),將得到的值賦給mcout<<″max=″<<m<<′\\n′;//輸出大數(shù)m的值return0;//如程序正常結(jié)束,向操作系統(tǒng)返回一個(gè)零值}//主函數(shù)結(jié)束本程序包括兩個(gè)函數(shù):主函數(shù)main和被調(diào)用的函數(shù)max。程序運(yùn)行情況如下:1825↙〔輸入18和25給a和b〕max=25〔輸出m的值〕注意輸入的兩個(gè)數(shù)據(jù)間用一個(gè)或多個(gè)空格間隔,不能以逗號(hào)或其他符號(hào)間隔。在上面的程序中,max函數(shù)出現(xiàn)在main函數(shù)之前,因此在main函數(shù)中調(diào)用max函數(shù)時(shí),編譯系統(tǒng)能識(shí)別max是已定義的函數(shù)名。如果把兩個(gè)函數(shù)的位置對(duì)換一下,即先寫(xiě)main函數(shù),后寫(xiě)max函數(shù),這時(shí)在編譯main函數(shù)遇到max時(shí),編譯系統(tǒng)無(wú)法知道m(xù)ax代表什么含義,因而無(wú)法編譯,按出錯(cuò)處理。為了解決這個(gè)問(wèn)題,在主函數(shù)中需要對(duì)被調(diào)用函數(shù)作聲明。上面的程序可以改寫(xiě)如下:#include<iostream>usingnamespacestd;intmain〔〕{intmax〔intx,inty〕;//對(duì)max函數(shù)作聲明inta,b,c;cin>>a>>b;c=max〔a,b〕;//調(diào)用max函數(shù)cout<<″max=″<<c<<endl;return0;}intmax〔intx,inty〕//定義max函數(shù){intz;if〔x>y〕z=x;elsez=y;return〔z〕;}只要在被調(diào)用函數(shù)的首部的末尾加一個(gè)分號(hào),就成為對(duì)該函數(shù)的函數(shù)聲明。函數(shù)聲明的位置應(yīng)當(dāng)在函數(shù)調(diào)用之前。下面舉一個(gè)包含類(lèi)〔class〕和對(duì)象〔object〕的C++程序,目的是使讀者初步了解C++是怎樣表達(dá)面向?qū)ο蟪绦蛟O(shè)計(jì)方法的。例1.4包含類(lèi)的C++程序。#include<iostream>//預(yù)處理命令usingnamespacestd;classStudent//聲明一個(gè)類(lèi),類(lèi)名為Student{private://以下為類(lèi)中的私有局部intnum;//私有變量numintscore;//私有變量scorepublic://以下為類(lèi)中的公用局部voidsetdata〔〕//定義公用函數(shù)setdata{cin>>num;//輸入num的值cin>>score;//輸入score的值} voiddisplay〔〕//定義公用函數(shù)display{cout<<″num=″<<num<<endl;//輸出num的值cout<<″score=″<<score<<endl;//輸出score的值};};//類(lèi)的聲明結(jié)束Studentstud1,stud2;//定義stud1和stud2為Student類(lèi)的變量,稱(chēng)為對(duì)象intmain〔〕//主函數(shù)首部{stud1.setdata〔〕;//調(diào)用對(duì)象stud1的setdata函數(shù)stud2.setdata〔〕;//調(diào)用對(duì)象stud2的setdata函數(shù)stud1.display〔〕;//調(diào)用對(duì)象stud1的display函數(shù)stud2.display〔〕;//調(diào)用對(duì)象stud2的display函數(shù)return0;}在一個(gè)類(lèi)中包含兩種成員:數(shù)據(jù)和函數(shù),分別稱(chēng)為數(shù)據(jù)成員和成員函數(shù)。在C++中把一組數(shù)據(jù)和有權(quán)調(diào)用這些數(shù)據(jù)的函數(shù)封裝在一起,組成一種稱(chēng)為“類(lèi)〔class〕”的數(shù)據(jù)結(jié)構(gòu)。在上面的程序中,數(shù)據(jù)成員num,score和成員函數(shù)setdata,display組成了一個(gè)名為Student的“類(lèi)”類(lèi)型。成員函數(shù)是用來(lái)對(duì)數(shù)據(jù)成員進(jìn)行操作的。也就是說(shuō),一個(gè)類(lèi)是由一批數(shù)據(jù)以及對(duì)其操作的函數(shù)組成的。類(lèi)可以表達(dá)數(shù)據(jù)的封裝性和信息隱蔽。在上面的程序中,在聲明Student類(lèi)時(shí),把類(lèi)中的數(shù)據(jù)和函數(shù)分為兩大類(lèi):private〔私有的〕和public〔公用的〕。把全部數(shù)據(jù)〔num,score〕指定為私有的,把全部函數(shù)〔setdata,display〕指定為公用的。在大多數(shù)情況下,會(huì)把所有數(shù)據(jù)指定為私有,以實(shí)現(xiàn)信息隱蔽。具有“類(lèi)”類(lèi)型特征的變量稱(chēng)為“對(duì)象”〔object〕。程序中第18~24行是主函數(shù)。程序運(yùn)行情況如下:100198.5↙〔輸入學(xué)生1的學(xué)號(hào)和成績(jī)〕100276.5↙〔輸入學(xué)生2的學(xué)號(hào)和成績(jī)〕num=1001〔輸出學(xué)生1的學(xué)號(hào)〕score=98.5〔輸出學(xué)生1的成績(jī)〕num=1002〔輸出學(xué)生2的學(xué)號(hào)〕score=76.5〔輸出學(xué)生2的成績(jī)〕C++程序的結(jié)構(gòu)和書(shū)寫(xiě)格式歸納如下:〔1〕一個(gè)C++程序可以由一個(gè)程序單位或多個(gè)程序單位構(gòu)成。每一個(gè)程序單位作為一個(gè)文件。在程序編譯時(shí),編譯系統(tǒng)分別對(duì)各個(gè)文件進(jìn)行編譯,因此,一個(gè)文件是一個(gè)編譯單元。〔2〕在一個(gè)程序單位中,可以包括以下幾個(gè)局部:①預(yù)處理命令。上節(jié)4個(gè)程序中都包括#include命令。②全局聲明局部〔在函數(shù)外的聲明局部〕。在這局部中包括對(duì)用戶(hù)自己定義的數(shù)據(jù)類(lèi)型的聲明和程序中所用到的變量的定義。1.3C++程序的構(gòu)成和書(shū)寫(xiě)形式③函數(shù)。函數(shù)是實(shí)現(xiàn)操作的局部,因此函數(shù)是程序中必須有的和最根本的組成局部。每一個(gè)程序必須包括一個(gè)或多個(gè)函數(shù),其中必須有一個(gè)〔而且只能有一個(gè)〕主函數(shù)〔main函數(shù)〕。但是并不要求每一個(gè)程序文件都必須具有以上3個(gè)局部,可以缺少某些局部〔包括函數(shù)〕?!?〕一個(gè)函數(shù)由兩局部組成:①函數(shù)首部,即函數(shù)的第一行。包括函數(shù)名、函數(shù)類(lèi)型、函數(shù)屬性、函數(shù)參數(shù)〔形參〕名、參數(shù)類(lèi)型。一個(gè)函數(shù)名后面必須跟一對(duì)圓括號(hào),函數(shù)參數(shù)可以缺省,如intmain〔〕。②函數(shù)體,即函數(shù)首部下面的大括號(hào)內(nèi)的局部。如果在一個(gè)函數(shù)中有多個(gè)大括號(hào),那么最外層的一對(duì){}為函數(shù)體的范圍。函數(shù)體一般包括:局部聲明局部〔在函數(shù)內(nèi)的聲明局部〕。包括對(duì)本函數(shù)中所用到的類(lèi)型、函數(shù)的聲明和變量的定義。對(duì)數(shù)據(jù)的聲明既可以放在函數(shù)之外〔其作用范圍是全局的〕,也可以放在函數(shù)內(nèi)〔其作用范圍是局部的,只在本函數(shù)內(nèi)有效〕。執(zhí)行局部。由假設(shè)干個(gè)執(zhí)行語(yǔ)句組成,用來(lái)進(jìn)行有關(guān)的操作,以實(shí)現(xiàn)函數(shù)的功能?!?〕語(yǔ)句包括兩類(lèi)。一類(lèi)是聲明語(yǔ)句,另一類(lèi)是執(zhí)行語(yǔ)句。C++對(duì)每一種語(yǔ)句賦予一種特定的功能。語(yǔ)句是實(shí)現(xiàn)操作的根本成分,顯然,沒(méi)有語(yǔ)句的函數(shù)是沒(méi)有意義的。C++語(yǔ)句必須以分號(hào)結(jié)束?!?〕一個(gè)C++程序總是從main函數(shù)開(kāi)始執(zhí)行的,而不管main函數(shù)在整個(gè)程序中的位置如何?!?〕類(lèi)〔class〕是C++新增加的重要的數(shù)據(jù)類(lèi)型,是C++對(duì)C的最重要的開(kāi)展。有了類(lèi),就可以實(shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)方法中的封裝、信息隱蔽、繼承、派生、多態(tài)等功能。在一個(gè)類(lèi)中可以包括數(shù)據(jù)成員和成員函數(shù),他們可以被指定為私有的〔private〕和公用的〔public〕屬性。私有的數(shù)據(jù)成員和成員函數(shù)只能被本類(lèi)的成員函數(shù)所調(diào)用?!?〕C++程序書(shū)寫(xiě)格式自由,一行內(nèi)可以寫(xiě)幾個(gè)語(yǔ)句,一個(gè)語(yǔ)句可以分寫(xiě)在多行上。C++程序沒(méi)有行號(hào),也不像FORTRAN或COBOL那樣嚴(yán)格規(guī)定書(shū)寫(xiě)格式〔語(yǔ)句必須從某一列開(kāi)始書(shū)寫(xiě)〕?!?〕一個(gè)好的、有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋?zhuān)栽黾映绦虻目勺x性。C++還保存了C語(yǔ)言的注釋形式,可以用“/*……*/”對(duì)C++程序中的任何局部作注釋。在“/*”和“*/”之間的全部?jī)?nèi)容作為注釋。用“//”作注釋時(shí),有效范圍只有一行,即本行有效,不能跨行。而用“/*……*/”作注釋時(shí)有效范圍為多行。只要在開(kāi)始處有一個(gè)“/*”,在最后一行結(jié)束處有一個(gè)“*/”即可。因此,一般習(xí)慣是:內(nèi)容較少的簡(jiǎn)單注釋常用“//”,內(nèi)容較長(zhǎng)的常用“/*……*/”。一個(gè)程序從編寫(xiě)到最后得到運(yùn)行結(jié)果要經(jīng)歷以下一些步驟。1.用C++語(yǔ)言編寫(xiě)程序用高級(jí)語(yǔ)言編寫(xiě)的程序稱(chēng)為“源程序”〔sourceprogram〕。C++的源程序是以.cpp作為后綴的〔cpp是cplusplus的縮寫(xiě)〕。2.對(duì)源程序進(jìn)行編譯為了使計(jì)算機(jī)能執(zhí)行高級(jí)語(yǔ)言源程序,必須先用一種稱(chēng)為“編譯器〔complier〕”的軟件〔也稱(chēng)編譯程序或編譯系統(tǒng)〕,把源程序翻譯成二進(jìn)制形式的“目標(biāo)程序〔objectprogram〕”。1.4C++程序的編寫(xiě)和實(shí)現(xiàn)編譯是以源程序文件為單位分別編譯的。目標(biāo)程序一般以.obj或.o作為后綴〔object的縮寫(xiě)〕。編譯的作用是對(duì)源程序進(jìn)行詞法檢查和語(yǔ)法檢查。編譯時(shí)對(duì)文件中的全部?jī)?nèi)容進(jìn)行檢查,編譯結(jié)束后會(huì)顯示出所有的編譯出錯(cuò)信息。一般編譯系統(tǒng)給出的出錯(cuò)信息分為兩種,一種是錯(cuò)誤〔error〕;一種是警告〔warning〕。3.將目標(biāo)文件連接在改正所有的錯(cuò)誤并全部通過(guò)編譯后,得到一個(gè)或多個(gè)目標(biāo)文件。此時(shí)要用系統(tǒng)提供的“連接程序〔linker〕”將一個(gè)程序的所有目標(biāo)程序和系統(tǒng)的庫(kù)文件以及系統(tǒng)提供的其他信息連接起來(lái),最終形成一個(gè)可執(zhí)行的二進(jìn)制文件,它的后綴是.exe,是可以直接執(zhí)行的。4.運(yùn)行程序運(yùn)行最終形成的可執(zhí)行的二進(jìn)制文件〔.exe文件〕,得到運(yùn)行結(jié)果。5.分析運(yùn)行結(jié)果如果運(yùn)行結(jié)果不正確,應(yīng)檢查程序或算法是否有問(wèn)題。圖1.1在了解了C++語(yǔ)言的初步知識(shí)后,讀者最好盡快在計(jì)算機(jī)上編譯和運(yùn)行C++程序,以加深對(duì)C++程序的認(rèn)識(shí),并初步掌握C++的上機(jī)操作。讀者可以使用不同的C++編譯系統(tǒng),在不同的環(huán)境下編譯和運(yùn)行一個(gè)C++程序。但是需要強(qiáng)調(diào)的是,我們學(xué)習(xí)的是C++程序設(shè)計(jì),應(yīng)當(dāng)掌握的是標(biāo)準(zhǔn)C++,而不應(yīng)該只了解某一種“方言化”的C++。不應(yīng)當(dāng)只會(huì)使用一種C++編譯系統(tǒng),只能在一種環(huán)境下工作,而應(yīng)當(dāng)能在不同的C++環(huán)境下運(yùn)行自己的程序,并且了解不同的C++編譯系統(tǒng)的特點(diǎn)和使用方法,在需要時(shí)能將自己的程序方便地移植到不同的平臺(tái)上。1.5關(guān)于C++上機(jī)實(shí)踐在本書(shū)的參考書(shū)《C++程序設(shè)計(jì)題解與上機(jī)指導(dǎo)》一書(shū)中簡(jiǎn)單介紹了在VisualC++6.0和GCC兩種典型的環(huán)境下運(yùn)行C++程序的方法。請(qǐng)讀者選擇一種〔如能做到兩種更好〕C++編譯系統(tǒng),在該環(huán)境下輸入和運(yùn)行習(xí)題中的程序,掌握上機(jī)的方法和步驟。第2章數(shù)據(jù)類(lèi)型與表達(dá)式2.1C++的數(shù)據(jù)類(lèi)型2.2常量2.3變量2.4C++的運(yùn)算符2.5算術(shù)運(yùn)算符與算術(shù)表達(dá)式2.6賦值運(yùn)算符與賦值表達(dá)式2.7逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式計(jì)算機(jī)處理的對(duì)象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的〔例如整數(shù)、浮點(diǎn)數(shù)、字符等形式〕。不同的數(shù)據(jù)之間往往還存在某些聯(lián)系〔例如由假設(shè)干個(gè)整數(shù)組成一個(gè)整數(shù)數(shù)組〕。數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式。例如,數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu)。不同的計(jì)算機(jī)語(yǔ)言所允許使用的數(shù)據(jù)結(jié)構(gòu)是不同的。處理同一類(lèi)問(wèn)題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會(huì)不同。例如,對(duì)10個(gè)整數(shù)排序和對(duì)包含10個(gè)元素的整型數(shù)組排序的算法是不同的。C++可以使用的數(shù)據(jù)類(lèi)型如下:2.1C++的數(shù)據(jù)類(lèi)型 短整型〔shortint〕 整型 整型〔int〕 長(zhǎng)整型〔longint〕 根本類(lèi)型字符型〔char〕 單精度型〔float〕 浮點(diǎn)型 雙精度型〔double〕 長(zhǎng)雙精度型〔longdouble〕 布爾型〔bool〕 枚舉類(lèi)型〔enum〕 數(shù)據(jù)類(lèi)型構(gòu)造類(lèi)型數(shù)組類(lèi)型 結(jié)構(gòu)體類(lèi)型〔struct〕 共用體類(lèi)型〔union〕 類(lèi)類(lèi)型〔class〕 指針類(lèi)型 引用類(lèi)型 空類(lèi)型〔void〕布爾型就是邏輯型,空類(lèi)型就是無(wú)值型。C++的數(shù)據(jù)包括常量與變量,常量與變量都具有類(lèi)型。由以上這些數(shù)據(jù)類(lèi)型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。例如利用指針和結(jié)構(gòu)體類(lèi)型可以構(gòu)成表、樹(shù)、棧等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。C++并沒(méi)有統(tǒng)一規(guī)定各類(lèi)數(shù)據(jù)的精度、數(shù)值范圍和在內(nèi)存中所占的字節(jié)數(shù),各C++編譯系統(tǒng)根據(jù)自己的情況作出安排。書(shū)中表2.1列出了VisualC++數(shù)值型和字符型數(shù)據(jù)的情況。說(shuō)明:〔1〕整型數(shù)據(jù)分為長(zhǎng)整型〔longint〕、一般整型〔int〕和短整型〔shortint〕。在int前面加long和short分別表示長(zhǎng)整型和短整型?!?〕整型數(shù)據(jù)的存儲(chǔ)方式為按二進(jìn)制數(shù)形式存儲(chǔ),例如十進(jìn)制整數(shù)85的二進(jìn)制形式為1010101,那么在內(nèi)存中的存儲(chǔ)形式如圖2.1所示。圖2.1〔3〕在整型符號(hào)int和字符型符號(hào)char的前面,可以加修飾符signed〔表示“有符號(hào)”〕或unsigned〔表示“無(wú)符號(hào)”〕。如果指定為signed,那么數(shù)值以補(bǔ)碼形式存放,存儲(chǔ)單元中的最高位〔bit〕用來(lái)表示數(shù)值的符號(hào)。如果指定為unsigned,那么數(shù)值沒(méi)有符號(hào),全部二進(jìn)制位都用來(lái)表示數(shù)值本身。例如短整型數(shù)據(jù)占兩個(gè)字節(jié),見(jiàn)圖2.2。圖2.2有符號(hào)時(shí),能存儲(chǔ)的最大值為215-1,即32767,最小值為-32768。無(wú)符號(hào)時(shí),能存儲(chǔ)的最大值為216-1,即65535,最小值為0。有些數(shù)據(jù)是沒(méi)有負(fù)值的,可以使用unsigned,它存儲(chǔ)正數(shù)的范圍比用signed時(shí)要大一倍?!?〕浮點(diǎn)型〔又稱(chēng)實(shí)型〕數(shù)據(jù)分為單精度〔float〕、雙精度〔double〕和長(zhǎng)雙精度〔longdouble〕3種,在VisualC++6.0中,對(duì)float提供6位有效數(shù)字,對(duì)double提供15位有效數(shù)字,并且float和double的數(shù)值范圍不同。對(duì)float分配4個(gè)字節(jié),對(duì)double和longdouble分配8個(gè)字節(jié)?!?〕表中類(lèi)型標(biāo)識(shí)符一欄中,方括號(hào)[]包含的局部可以省寫(xiě),如short和shortint等效,unsignedint和unsigned等效。常量的值是不能改變的,一般從其字面形式即可判別是否為常量。常量包括兩大類(lèi),即數(shù)值型常量〔即常數(shù)〕和字符型常量。如12,0,-3為整型常量,4.6,-1.23為實(shí)型常量,包含在兩個(gè)單撇號(hào)之間的字符為字符常量,如′a′,′x′。這種從字面形式即可識(shí)別的常量稱(chēng)為“字面常量”或“直接常量”。2.2常量
2.2.1什么是常量數(shù)值常量就是通常所說(shuō)的常數(shù)。在C++中,數(shù)值常量是區(qū)分類(lèi)型的,從字面形式即可識(shí)別其類(lèi)型。1.整型常量〔整數(shù)〕的類(lèi)型在上一節(jié)中道:整型數(shù)據(jù)可分為int,shortint,longint以及unsignedint,unsignedshort,unsignedlong等類(lèi)別。整型常量也分為以上類(lèi)別。為什么將數(shù)值常量區(qū)分為不同的類(lèi)別呢?因?yàn)樵谶M(jìn)行賦值或函數(shù)的參數(shù)虛實(shí)結(jié)合時(shí)要求數(shù)據(jù)類(lèi)型匹配。那么,一個(gè)整型常量怎樣從字面上區(qū)分為以上的類(lèi)別呢?2.2.2數(shù)值常量〔1〕一個(gè)整數(shù),如果其值在-32768~+32767范圍內(nèi),認(rèn)為它是shortint型,它可以賦值給shortint型、int型和longint型變量?!?〕一個(gè)整數(shù),如果其值超過(guò)了上述范圍,而在-2147483648~+2147483647范圍內(nèi),那么認(rèn)為它是longint型,可以將它賦值給一個(gè)int或longint型變量?!?〕如果某一計(jì)算機(jī)系統(tǒng)的C++版本〔例如VisualC++〕確定int與longint型數(shù)據(jù)在內(nèi)存中占據(jù)的長(zhǎng)度相同,那么它們能夠表示的數(shù)值的范圍相同。因此,一個(gè)int型的常量也同時(shí)是一個(gè)longint型常量,可以賦給int型或longint型變量?!?〕常量無(wú)unsigned型。但一個(gè)非負(fù)值的整數(shù)可以賦值給unsigned整型變量,只要它的范圍不超過(guò)變量的取值范圍即可。一個(gè)整型常量可以用3種不同的方式表示:〔1〕十進(jìn)制整數(shù)。如1357,-432,0等。在一個(gè)整型常量后面加一個(gè)字母l或L,那么認(rèn)為是longint型常量。例如123L,421L,0L等,這往往用于函數(shù)調(diào)用中。如果函數(shù)的形參為longint,那么要求實(shí)參也為longint型,此時(shí)用123作實(shí)參不行,而要用123L作實(shí)參。〔2〕八進(jìn)制整數(shù)。在常數(shù)的開(kāi)頭加一個(gè)數(shù)字0,就表示這是以八進(jìn)制數(shù)形式表示的常數(shù)。如020表示這是八進(jìn)制數(shù)20,即〔20〕8,它相當(dāng)于十進(jìn)制數(shù)16。〔3〕十六進(jìn)制整數(shù)。在常數(shù)的開(kāi)頭加一個(gè)數(shù)字0和一個(gè)英文字母X〔或x〕,就表示這是以十六進(jìn)制數(shù)形式表示的常數(shù)。如0X20表示這是十六進(jìn)制數(shù)20,即〔20〕16,它相當(dāng)于十進(jìn)制數(shù)32。2.浮點(diǎn)數(shù)的表示方法一個(gè)浮點(diǎn)數(shù)可以用兩種不同的方式表示:〔1〕十進(jìn)制小數(shù)形式。如21.456,-7.98等。它一般由整數(shù)局部和小數(shù)局部組成,可以省略其中之一〔如78.或.06,.0〕,但不能二者皆省略。C++編譯系統(tǒng)把用這種形式表示的浮點(diǎn)數(shù)一律按雙精度常量處理,在內(nèi)存中占8個(gè)字節(jié)。如果在實(shí)數(shù)的數(shù)字之后加字母F或f,表示此數(shù)為單精度浮點(diǎn)數(shù),如1234F,-43f,占4個(gè)字節(jié)。如果加字母L或l,表示此數(shù)為長(zhǎng)雙精度數(shù)〔longdouble〕,在GCC中占12個(gè)字節(jié),在VisualC++6.0中占8個(gè)字節(jié)?!?〕指數(shù)形式〔即浮點(diǎn)形式〕一個(gè)浮點(diǎn)數(shù)可以寫(xiě)成指數(shù)形式,如3.14159可以表示為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ù)局部的存在,使得同一個(gè)浮點(diǎn)數(shù)可以用不同的指數(shù)形式來(lái)表示,數(shù)字局部中小數(shù)點(diǎn)的位置是浮動(dòng)的。例如:a=0.314159e1;a=3.14159e0;a=31.4159e-1;a=314.159e-2;以上4個(gè)賦值語(yǔ)句中,用了不同形式的浮點(diǎn)數(shù),但其作用是相同的。在程序中不管把浮點(diǎn)數(shù)寫(xiě)成小數(shù)形式還是指數(shù)形式,在內(nèi)存中都是以指數(shù)形式〔即浮點(diǎn)形式〕存儲(chǔ)的。例如不管在程序中寫(xiě)成314.159或314.159e0,31.4159e1,3.14159e2,0.314159e3等形式,在內(nèi)存中都是以標(biāo)準(zhǔn)化的指數(shù)形式存放,如圖2.3所示。圖2.3數(shù)字局部必須小于1,同時(shí),小數(shù)點(diǎn)后面第一個(gè)數(shù)字必須是一個(gè)非0數(shù)字,例如不能是0.0314159。因此314.159和314.159e0,31.4159e1,3.14159e2,0.314159e3在內(nèi)存中表示成0.314159×103。存儲(chǔ)單元分為兩局部,一局部用來(lái)存放數(shù)字局部,一局部用來(lái)存放指數(shù)局部。為便于理解,在圖2.3中是用十進(jìn)制表示的,實(shí)際上在存儲(chǔ)單元中是用二進(jìn)制數(shù)來(lái)表示小數(shù)局部,用2的冪次來(lái)表示指數(shù)局部的。對(duì)于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理。1.普通的字符常量用單撇號(hào)括起來(lái)的一個(gè)字符就是字符型常量。如′a′,′#′,′%′,′D′都是合法的字符常量,在內(nèi)存中占一個(gè)字節(jié)。注意:①字符常量只能包括一個(gè)字符,如′AB′是不合法的。②字符常量區(qū)分大小寫(xiě)字母,如′A′和′a′是兩個(gè)不同的字符常量。③撇號(hào)〔′〕是定界符,而不屬于字符常量的一局部。如cout<<′a′;輸出的是一個(gè)字母“a”,而不是3個(gè)字符“′a′”。2.2.3字符常量2.轉(zhuǎn)義字符常量除了以上形式的字符常量外,C++還允許用一種特殊形式的字符常量,就是以“\”開(kāi)頭的字符序列。例如,′\n′代表一個(gè)“換行”符?!癱out<<′\n′;”將輸出一個(gè)換行,其作用與“cout<<endl;”相同。這種“控制字符”,在屏幕上是不能顯示的。在程序中也無(wú)法用一個(gè)一般形式的字符表示,只能采用特殊形式來(lái)表示。常用的以“\”開(kāi)頭的特殊字符見(jiàn)書(shū)中表2.2。3.字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式及其使用方法將一個(gè)字符常量存放到內(nèi)存單元時(shí),實(shí)際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符相應(yīng)的ASCII代碼放到存儲(chǔ)單元中。如果字符變量c1的值為′a′,c2的值為′b′,那么在變量中存放的是′a′的ASCII碼97,′b′的ASCII碼98,如圖2.4〔a〕所示,實(shí)際上在內(nèi)存中是以二進(jìn)制形式存放的,如圖2.4〔b〕所示。圖2.4既然字符數(shù)據(jù)是以ASCII碼存儲(chǔ)的,它的存儲(chǔ)形式就與整數(shù)的存儲(chǔ)形式類(lèi)似。這樣,在C++中字符型數(shù)據(jù)和整型數(shù)據(jù)之間就可以通用。一個(gè)字符數(shù)據(jù)可以賦給一個(gè)整型變量,反之,一個(gè)整型數(shù)據(jù)也可以賦給一個(gè)字符變量。也可以對(duì)字符數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,此時(shí)相當(dāng)于對(duì)它們的ASCII碼進(jìn)行算術(shù)運(yùn)算。例2.1將字符賦給整型變量。#include<iostream>usingnamespacestd;intmain〔〕{inti,j;//i和j是整型變量i=′A′;//將一個(gè)字符常量賦給整型變量ij=′B′;//將一個(gè)字符常量賦給整型變量jcout<<i<<′′<<j<<′\n′;//輸出整型變量i和j的值,′\n′是換行符return0;}執(zhí)行時(shí)輸出6566i和j被指定為整型變量。但在第5和第6行中,將字符′A′和′B′分別賦給i和j,它的作用相當(dāng)于以下兩個(gè)賦值語(yǔ)句:i=65;j=66;因?yàn)椤銩′和′B′的ASCII碼為65和66。在程序的第5和第6行是把65和66直接存放到i和j的內(nèi)存單元中。因此輸出65和66。可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的。但是應(yīng)注意字符數(shù)據(jù)只占一個(gè)字節(jié),它只能存放0~255范圍內(nèi)的整數(shù)。例2.2字符數(shù)據(jù)與整數(shù)進(jìn)行算術(shù)運(yùn)算。下面程序的作用是將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母。#include<iostream>usingnamespacestd;intmain〔〕{charc1,c2;c1=′a′;c2=′b′;c1=c1-32;c2=c2-32;cout<<c1<<′′<<c2<<endl;return0;}運(yùn)行結(jié)果為AB′a′的ASCII碼為97,而′A′的ASCII碼為65,′b′為98,′B′為66。從ASCII代碼表中可以看到每一個(gè)小寫(xiě)字母比它相應(yīng)的大寫(xiě)字母的ASCII代碼大32。C++符數(shù)據(jù)與數(shù)值直接進(jìn)行算術(shù)運(yùn)算,′a′-32得到整數(shù)65,′b′-32得到整數(shù)66。將65和66存放在c1,c2中,由于c1,c2是字符變量,因此用cout輸出c1,c2時(shí),得到字符A和B〔A的ASCII碼為65,B的ASCII碼為66〕。4.字符串常量用雙撇號(hào)括起來(lái)的局部就是字符串常量,如″abc″,″Hello!″,″a+b″,″Liping″都是字符串常量。字符串常量″abc″在內(nèi)存中占4個(gè)字節(jié)〔而不是3個(gè)字節(jié)〕,見(jiàn)圖2.5。圖2.5編譯系統(tǒng)會(huì)在字符串最后自動(dòng)加一個(gè)′\0′作為字符串結(jié)束標(biāo)志。但′\0′并不是字符串的一局部,它只作為字符串的結(jié)束標(biāo)志。如cout<<″abc″<<endl;輸出3個(gè)字符abc,而不包括′\0′。注意:″a″和′a′代表不同的含義,″a″是字符串常量,′a′是字符常量。前者占兩個(gè)字節(jié),后者占1個(gè)字節(jié)。請(qǐng)分析下面的程序片段:charc;//定義一個(gè)字符變量c=′a′;//正確c=″a″;//錯(cuò)誤,c只能容納一個(gè)字符字符串常量要用字符數(shù)組來(lái)存放,見(jiàn)第5章。請(qǐng)思考:字符串常量″abc\n″包含幾個(gè)字符?不是5個(gè)而是4個(gè)字符,其中“\n”是一個(gè)轉(zhuǎn)義字符。但它在內(nèi)存中占5個(gè)字節(jié)〔包括一個(gè)“\0”字符〕。編譯系統(tǒng)遇到“\”時(shí)就會(huì)把它認(rèn)作轉(zhuǎn)義字符的標(biāo)志,把它和其后的字符一起作為一個(gè)轉(zhuǎn)義字符。如果“\”后面的字符不能與“\”組成一個(gè)合法的轉(zhuǎn)義字符〔如″\c″〕,那么在編譯時(shí)顯示出錯(cuò)信息。如果希望將“\”字符也作為字符串中的一個(gè)字符,那么應(yīng)寫(xiě)為″abc\\n″,此時(shí)字符包括5個(gè)字符,即a,b,c,\,n。如果有以下輸出語(yǔ)句:cout<<″abc\\\n″<<endl;那么會(huì)輸出:abc\,然后換行。同理執(zhí)行cout<<″Isay\″Thankyou?。堋澹躰″;的輸出是:Isay″Thankyou!″如果在一個(gè)字符串中最后一個(gè)字符為“\”,那么表示它是續(xù)行符,下一行的字符是該字符串的一局部,且在兩行字符串間無(wú)空格。如cout<<″WemuststudyC\//本行最后的“\”后面的空格和換行均不起作用++hard!″;//本行的字符緊連在上一行最后的“\”前面字符之后那么輸出:WemuststudyC++hard!為了編程和閱讀的方便,在C++程序設(shè)計(jì)中,常用一個(gè)符號(hào)名代表一個(gè)常量,稱(chēng)為符號(hào)常量,即以標(biāo)識(shí)符形式出現(xiàn)的常量。例2.3符號(hào)常量的使用。#definePRICE30//注意這不是語(yǔ)句,末尾不要加分號(hào)intmain〔〕{intnum,total;num=10;total=num*PRICE;cout<<″total=″<<total<<endl;return0;}2.2.4符號(hào)常量程序中用預(yù)處理命令#define指定PRICE在本程序單位中代表常量30,此后凡在本程序單位中出現(xiàn)的PRICE都代表30,可以和常量一樣進(jìn)行運(yùn)算,程序運(yùn)行結(jié)果為total=300請(qǐng)注意符號(hào)常量雖然有名字,但它不是變量。它的值在其作用域〔在本例中為主函數(shù)〕內(nèi)是不能改變的,也不能被賦值。如用賦值語(yǔ)句“PRICE=40;”給PRICE賦值是錯(cuò)誤的。使用符號(hào)常量的好處是:〔1〕含義清楚?!?〕在需要改變一個(gè)常量時(shí)能做到“一改全改”。如#definePRICE35其實(shí)在前面的例子中已經(jīng)屢次用到了變量。在程序運(yùn)行期間其值可以改變的量稱(chēng)為變量。一個(gè)變量應(yīng)該有一個(gè)名字,并在內(nèi)存中占據(jù)一定的存儲(chǔ)單元,在該存儲(chǔ)單元中存放變量的值。請(qǐng)注意區(qū)分變量名和變量值這兩個(gè)不同的概念,見(jiàn)圖2.6。圖2.62.3變量
2.3.1什么是變量先介紹標(biāo)識(shí)符的概念。和其他高級(jí)語(yǔ)言一樣,用來(lái)標(biāo)識(shí)變量、符號(hào)常量、函數(shù)、數(shù)組、類(lèi)型等實(shí)體名字的有效字符序列稱(chēng)為標(biāo)識(shí)符〔identifier〕。簡(jiǎn)單地說(shuō),標(biāo)識(shí)符就是一個(gè)名字。變量名是標(biāo)識(shí)符的一種,變量的名字必須遵循標(biāo)識(shí)符的命名規(guī)那么。C++規(guī)定標(biāo)識(shí)符只能由字母、數(shù)字和下劃線3種字符組成,且第一個(gè)字符必須為字母或下劃線。下面列出的是合法的標(biāo)識(shí)符,也是合法的變量名:sum,average,total,day,month,Student_name,tan,BASIC,li_ling下面是不合法的標(biāo)識(shí)符和變量名:2.3.2變量名規(guī)那么M.D.John,$123,#33,3G64,Lingli,C++,Zhang-ling,U.S.A.注意,在C++中,大寫(xiě)字母和小寫(xiě)字母被認(rèn)為是兩個(gè)不同的字符。因此,sum和SUM是兩個(gè)不同的變量名。一般地,變量名用小寫(xiě)字母表示,與人們?nèi)粘A?xí)慣一致,以增加可讀性。應(yīng)注意變量名不能與C++的關(guān)鍵字、系統(tǒng)函數(shù)名和類(lèi)名相同。在國(guó)外軟件開(kāi)發(fā)工作中,常習(xí)慣在變量前面加一個(gè)字母以表示該變量的類(lèi)型,如iCount表示這是一個(gè)整型變量,cSex表示這是一個(gè)字符型變量。C++沒(méi)有規(guī)定標(biāo)識(shí)符的長(zhǎng)度〔字符個(gè)數(shù)〕,但各個(gè)具體的C編譯系統(tǒng)都有自己的規(guī)定。有的系統(tǒng)取32個(gè)字符,超過(guò)的字符不被識(shí)別。在C++語(yǔ)言中,要求對(duì)所有用到的變量作強(qiáng)制定義,也就是必須“先定義,后使用”,如例2.2和例2.3那樣。定義變量的一般形式是變量類(lèi)型變量名表列;變量名表列指的是一個(gè)或多個(gè)變量名的序列。如floata,b,c,d,e;定義a,b,c,d,e為單精度型變量,注意各變量間以逗號(hào)分隔,最后是分號(hào)??梢栽诙x變量時(shí)指定它的初值。如floata=83.5,b,c=64.5,d=81.2,e;//對(duì)變量a,c,d指定了初值,b和d未指定初值2.3.3定義變量C語(yǔ)言要求變量的定義應(yīng)該放在所有的執(zhí)行語(yǔ)句之前,而C++那么放松了限制,只要求在第一次使用該變量之前進(jìn)行定義即可。也就是說(shuō),它可以出現(xiàn)在語(yǔ)句的中間,如inta;//定義變量a〔在使用a之前定義〕a=3;//執(zhí)行語(yǔ)句,對(duì)a賦值floatb;//定義變量b〔在使用b之前定義〕b=4.67;//執(zhí)行語(yǔ)句,對(duì)b賦值charc;//定義變量c〔在使用c之前定義〕c=′A′;//執(zhí)行語(yǔ)句,對(duì)c賦值C++要求對(duì)變量作強(qiáng)制定義的目的是:〔1〕凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確。例如,如果在聲明局部寫(xiě)了intstudent;而在執(zhí)行語(yǔ)句中錯(cuò)寫(xiě)成statent。如statent=30;在編譯時(shí)檢查出statent未經(jīng)定義,作為錯(cuò)誤處理。輸出“變量statent未經(jīng)聲明”的信息,便于用戶(hù)發(fā)現(xiàn)錯(cuò)誤,防止變量名使用時(shí)出錯(cuò)?!?〕每一個(gè)變量被指定為一確定類(lèi)型,在編譯時(shí)就能為其分配相應(yīng)的存儲(chǔ)單元。如指定a和b為int型,一般的編譯系統(tǒng)對(duì)其各分配4個(gè)字節(jié),并按整數(shù)方式存儲(chǔ)數(shù)據(jù)?!?〕指定每一變量屬于一個(gè)特定的類(lèi)型,這就便于在編譯時(shí),據(jù)此檢查該變量所進(jìn)行的運(yùn)算是否合法。例如,整型變量a和b,可以進(jìn)行求余運(yùn)算:a%b%是“求余”〔見(jiàn)2.4節(jié)〕,得到a/b的余數(shù)。如果將a和b指定為實(shí)型變量,那么不允許進(jìn)行“求余”運(yùn)算,在編譯時(shí)會(huì)給出有關(guān)的出錯(cuò)信息。允許在定義變量時(shí)對(duì)它賦予一個(gè)初值,這稱(chēng)為變量初始化。初值可以是常量,也可以是一個(gè)有確定值的表達(dá)式。如floata,b=5.78*3.5,c=2*sin〔2.0〕;表示定義了a,b,c為單精度浮點(diǎn)型變量,對(duì)b初始化為5.78*3,對(duì)c初始化為2*sin〔2.0〕,在編譯連接后,從標(biāo)準(zhǔn)函數(shù)庫(kù)得到正弦函數(shù)sin〔2.0〕的值,因此變量c有確定的初值。變量a未初始化。如果對(duì)變量未賦初值,那么該變量的初值是一個(gè)不可預(yù)測(cè)的值,即該存儲(chǔ)單元中當(dāng)時(shí)的內(nèi)容是不知道的。例如,假設(shè)未對(duì)a和b賦值,執(zhí)行輸出語(yǔ)句2.3.4為變量賦初值cout<<a<<″″<<b<<″″<<c<<endl;輸出結(jié)果可能為1.48544e-38151.81858〔各次運(yùn)行情況可能不同〕初始化不是在編譯階段完成的〔只有在第4章中介紹的靜態(tài)存儲(chǔ)變量和外部變量的初始化是在編譯階段完成的〕,而是在程序運(yùn)行時(shí)執(zhí)行本函數(shù)時(shí)賦予初值的,相當(dāng)于執(zhí)行一個(gè)賦值語(yǔ)句。例如,inta=3;相當(dāng)于以下兩個(gè)語(yǔ)句:inta;//指定a為整型變量a=3;//賦值語(yǔ)句,將3賦給a對(duì)多個(gè)變量賦予同一初值,必須分別指定,不能寫(xiě)成floata=b=c=4.5;而應(yīng)寫(xiě)成floata=4.5,b=4.5,c=4.5;或floata,b,c=4.5;a=b=c;在定義變量時(shí),如果加上關(guān)鍵字const,那么變量的值在程序運(yùn)行期間不能改變,這種變量稱(chēng)為常變量〔constantvariable〕。例如,constinta=3;//用const來(lái)聲明這種變量的值不能改變,指定其值始終為3在定義常變量時(shí)必須同時(shí)對(duì)它初始化〔即指定其值〕,此后它的值不能再改變。常變量不能出現(xiàn)在賦值號(hào)的左邊。例如上面一行不能寫(xiě)成constinta;a=3;//常變量不能被賦值可以用表達(dá)式對(duì)常變量初始化,如2.3.5常變量constintb=3+6,c=3*cos〔1.5〕;//b的值被指定為9,c的值被指定為3*cos〔1.5〕但應(yīng)注意,由于使用了系統(tǒng)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)cos,必須將包含該函數(shù)有關(guān)的信息的頭文件“cmath”〔或math.h〕包含到本程序單位中來(lái),可以在本程序單位的開(kāi)頭加上以下#include命令:#include<cmath>或#include<math.h>變量的值應(yīng)該是可以變化的,怎么值是固定的量也稱(chēng)變量呢?其實(shí),從計(jì)算機(jī)實(shí)現(xiàn)的角度看,變量的特征是存在一個(gè)以變量名命名的存儲(chǔ)單元,在一般情況下,存儲(chǔ)單元中的內(nèi)容是可以變化的。對(duì)常變量來(lái)說(shuō),無(wú)非在此變量的根底上加上一個(gè)限定:存儲(chǔ)單元中的值不允許變化。因此常變量又稱(chēng)為只讀變量〔read-only-variable〕。請(qǐng)區(qū)別用#define命令定義的符號(hào)常量和用const定義的常變量。符號(hào)常量只是用一個(gè)符號(hào)代替一個(gè)字符串,在預(yù)編譯時(shí)把所有符號(hào)常量替換為所指定的字符串,它沒(méi)有類(lèi)型,在內(nèi)存中并不存在以符號(hào)常量命名的存儲(chǔ)單元。而常變量具有變量的特征,它具有類(lèi)型,在內(nèi)存中存在著以它命名的存儲(chǔ)單元,可以用sizeof運(yùn)算符測(cè)出其長(zhǎng)度。與一般變量惟一的不同是指定變量的值不能改變。用#define命令定義符號(hào)常量是C語(yǔ)言所采用的方法,C++把它保存下來(lái)是為了和C兼容。C++的程序員一般喜歡用const定義常變量。雖然二者實(shí)現(xiàn)的方法不同,但從使用的角度看,都可以認(rèn)為用了一個(gè)標(biāo)識(shí)符代表了一個(gè)常量。有些書(shū)上把用const定義的常變量也稱(chēng)為定義常量,但讀者應(yīng)該了解它和符號(hào)常量的區(qū)別。C++的運(yùn)算符十分豐富,使得C++的運(yùn)算十分靈活方便。例如把賦值號(hào)〔=〕也作為運(yùn)算符處理,這樣,a=b=c=4就是合法的表達(dá)式,這是與其他語(yǔ)言不同的。C++提供了以下運(yùn)算符:〔1〕算術(shù)運(yùn)算符+〔加〕-〔減〕*〔乘〕/〔除〕%〔整除求余〕++〔自加〕--〔自減〕〔2〕關(guān)系運(yùn)算符>〔大于〕<〔小于〕==〔等于〕>=〔大于或等于〕<=〔小于或等于〕?。健膊坏扔凇?.4C++的運(yùn)算符〔3〕邏輯運(yùn)算符&&〔邏輯與〕||〔邏輯或〕!〔邏輯非〕〔4〕位運(yùn)算符<<〔按位左移〕>>〔按位右移〕&〔按位與〕|〔按位或〕∧〔按位異或〕~〔按位取反〕〔5〕賦值運(yùn)算符〔=及其擴(kuò)展賦值運(yùn)算符〕〔6〕條件運(yùn)算符〔?:〕〔7〕逗號(hào)運(yùn)算符〔,〕〔8〕指針運(yùn)算符〔*〕〔9〕引用運(yùn)算符和地址運(yùn)算符〔&〕〔10〕求字節(jié)數(shù)運(yùn)算符〔sizeof〕〔11〕強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符〔〔類(lèi)型〕或類(lèi)型〔〕〕〔12〕成員運(yùn)算符〔.〕〔13〕指向成員的運(yùn)算符〔->〕〔14〕下標(biāo)運(yùn)算符〔[]〕〔15〕其他〔如函數(shù)調(diào)用運(yùn)算符〔〕〕在本章中主要介紹算術(shù)運(yùn)算符與算術(shù)表達(dá)式,賦值運(yùn)算符與賦值表達(dá)式,逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式,其他運(yùn)算符將在以后各章中陸續(xù)介紹。+〔加法運(yùn)算符,或正值運(yùn)算符。如3+5,+3〕-〔減法運(yùn)算符,或負(fù)值運(yùn)算符。如5-2,-3〕*〔乘法運(yùn)算符。如3*5〕/〔除法運(yùn)算符。如5/3〕%〔模運(yùn)算符,或稱(chēng)求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如7%4的值為3〕。2.5算術(shù)運(yùn)算符與算術(shù)表達(dá)式
2.5.1根本的算術(shù)運(yùn)算符需要說(shuō)明,兩個(gè)整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果值為1,舍去小數(shù)局部。但是,如果除數(shù)或被除數(shù)中有一個(gè)為負(fù)值,那么舍入的方向是不固定的。例如,-5/3在有的C++系統(tǒng)上得到結(jié)果-1,有的C++系統(tǒng)那么給出結(jié)果-2。多數(shù)編譯系統(tǒng)采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠攏。如果參加+,-,*,/運(yùn)算的兩個(gè)數(shù)中有一個(gè)數(shù)為float型數(shù)據(jù),那么運(yùn)算的結(jié)果是double型,因?yàn)镃++在運(yùn)算時(shí)對(duì)所有float型數(shù)據(jù)都按double型數(shù)據(jù)處理。用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象〔也稱(chēng)操作數(shù)〕連接起來(lái)的、符合C++語(yǔ)法規(guī)那么的式子,稱(chēng)C++算術(shù)表達(dá)式。運(yùn)算對(duì)象包括常量、變量、函數(shù)等。例如,下面是一個(gè)合法的C++算術(shù)表達(dá)式:a*b/c-1.5+′a′C++語(yǔ)言規(guī)定了運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。在求解表達(dá)式時(shí),先按運(yùn)算符的優(yōu)先級(jí)別上下次序執(zhí)行,例如先乘除后加減。如有表達(dá)式a-b*c,b的左側(cè)為減號(hào),右側(cè)為乘號(hào),而乘號(hào)優(yōu)先于減號(hào),因此,相當(dāng)于a-〔b*c〕。如果在一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符的優(yōu)先級(jí)別相同,如a-b+c,那么按規(guī)定的“結(jié)合方向”處理。2.5.2算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)與結(jié)合性C++規(guī)定了各種運(yùn)算符的結(jié)合方向〔結(jié)合性〕,算術(shù)運(yùn)算符的結(jié)合方向?yàn)椤白宰笾劣摇?,即先左后右,因此b先與減號(hào)結(jié)合,執(zhí)行a-b的運(yùn)算,再執(zhí)行加c的運(yùn)算。“自左至右的結(jié)合方向”又稱(chēng)“左結(jié)合性”,即運(yùn)算對(duì)象先與左面的運(yùn)算符結(jié)合。以后可以看到有些運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆?,即右結(jié)合性〔例如賦值運(yùn)算符〕。關(guān)于“結(jié)合性”的概念在其他一些高級(jí)語(yǔ)言中是沒(méi)有的,是C和C++的特點(diǎn)之一,希望能弄清楚。附錄B列出了所有運(yùn)算符以及它們的優(yōu)先級(jí)別和結(jié)合性。在表達(dá)式中常遇到不同類(lèi)型數(shù)據(jù)之間進(jìn)行運(yùn)算,如10+′a′+1.5-8765.1234*′b′在進(jìn)行運(yùn)算時(shí),不同類(lèi)型的數(shù)據(jù)要先轉(zhuǎn)換成同一類(lèi)型,然后進(jìn)行運(yùn)算。轉(zhuǎn)換的規(guī)那么按圖2.7所示。圖2.72.5.3表達(dá)式中各類(lèi)數(shù)值型數(shù)據(jù)間的混合運(yùn)算假設(shè)已指定i為整型變量,f為float變量,d為double型變量,e為long型,有下面表達(dá)式:10+′a′+i*f-d/e運(yùn)算次序?yàn)椋孩龠M(jìn)行10+′a′的運(yùn)算,先將′a′轉(zhuǎn)換成整數(shù)97,運(yùn)算結(jié)果為107。②進(jìn)行i*f的運(yùn)算。先將i與f都轉(zhuǎn)換成double型,運(yùn)算結(jié)果為double型。③整數(shù)107與i*f的積相加。先將整數(shù)107轉(zhuǎn)換成雙精度數(shù)〔小數(shù)點(diǎn)后加假設(shè)干個(gè)0,即107.000…00〕,結(jié)果為double型。④將變量e轉(zhuǎn)換成double型,d/e結(jié)果為double型。⑤將10+′a′+i*f的結(jié)果與d/e的商相減,結(jié)果為double型。上述的類(lèi)型轉(zhuǎn)換是由系統(tǒng)自動(dòng)進(jìn)行的。在C和C++中,常在表達(dá)式中使用自增〔++〕和自減〔--〕運(yùn)算符,他們的作用是使變量的值增1或減1,如++i〔在使用i之前,先使i的值加1,如果i的原值為3,那么執(zhí)行j=++i后,j的值為4〕--i〔在使用i之前,先使i的值減1,如果i的原值為3,那么執(zhí)行j=--i后,j的值為2〕i++〔在使用i之后,使i的值加1,如果i的原值為3,那么執(zhí)行j=i++后,j的值為3,然后i變?yōu)?〕i--〔在使用i之后,使i的值減1,如果i的原值為3,那么執(zhí)行j=i--后,j的值為3,然后i變?yōu)?〕2.5.4自增和自減運(yùn)算符++i是先執(zhí)行i=i+1后,再使用i的值;而i++是先使用i的值后,再執(zhí)行i=i+1。正確地使用++和--,可以使程序簡(jiǎn)潔、清晰、高效。請(qǐng)注意:〔1〕自增運(yùn)算符〔++〕和自減運(yùn)算符〔--〕只能用于變量,而不能用于常量或表達(dá)式?!?〕++和--的結(jié)合方向是“自右至左”,見(jiàn)附錄B?!?〕自增運(yùn)算符〔++〕和自減運(yùn)算符〔--〕使用十分靈活,但在很多情況下可能出現(xiàn)歧義性,產(chǎn)生“意想不到”的副作用?!?〕自增〔減〕運(yùn)算符在C++程序中是經(jīng)常見(jiàn)到的,常用于循環(huán)語(yǔ)句中,使循環(huán)變量自動(dòng)加1。也用于指針變量,使指針指向下一個(gè)地址。在表達(dá)式中不同類(lèi)型的數(shù)據(jù)會(huì)自動(dòng)地轉(zhuǎn)換類(lèi)型,以進(jìn)行運(yùn)算。有時(shí)程序編制者還可以利用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需類(lèi)型。例如:〔double〕a〔將a轉(zhuǎn)換成double類(lèi)型〕〔int〕〔x+y〕〔將x+y的值轉(zhuǎn)換成整型〕〔float〕〔5%3〕〔將5%3的值轉(zhuǎn)換成float型〕強(qiáng)制類(lèi)型轉(zhuǎn)換的一般形式為〔類(lèi)型名〕〔表達(dá)式〕注意:如果要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的對(duì)象是一個(gè)變量,該變量可以不用括號(hào)括起來(lái)。如果要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的對(duì)象是一個(gè)包含多項(xiàng)的表達(dá)式,那么表達(dá)式應(yīng)該用括號(hào)括起來(lái)。如果寫(xiě)成2.5.5強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符〔int〕x+y那么只將x轉(zhuǎn)換成整型,然后與y相加。以上強(qiáng)制類(lèi)型轉(zhuǎn)換的形式是原來(lái)C語(yǔ)言使用的形式,C++把它保存了下來(lái),以利于兼容。C++還增加了以下形式:類(lèi)型名〔表達(dá)式〕如int〔x〕或int〔x+y〕類(lèi)型名不加括號(hào),而變量或表達(dá)式用括號(hào)括起來(lái)。這種形式類(lèi)似于函數(shù)調(diào)用。但許多人仍習(xí)慣于用第一種形式,把類(lèi)型名包在括號(hào)內(nèi),這樣比較清楚。需要說(shuō)明的是在強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí),得到一個(gè)所需類(lèi)型的中間變量,但原來(lái)變量的類(lèi)型未發(fā)生變化。例如:〔int〕x如果x原指定為float型,值為3.6,進(jìn)行強(qiáng)制類(lèi)型運(yùn)算后得到一個(gè)int型的中間變量,它的值等于3,而x原來(lái)的類(lèi)型和值都不變。例2.4強(qiáng)制類(lèi)型轉(zhuǎn)換。#include<iostream>usingnamespacestd;intmain〔〕{floatx;inti;x=3.6;i=〔int〕x;cout<<″x=″<<x<<″,i=″<<i<<endl;return0;}運(yùn)行結(jié)果如下:x=3.6,i=3x的型仍為float型,值仍等于3.6。由上可知,有兩種類(lèi)型轉(zhuǎn)換,一種是在運(yùn)算時(shí)不必用戶(hù)指定,系統(tǒng)自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換,如3+6.5。第二種是強(qiáng)制類(lèi)型轉(zhuǎn)換。當(dāng)自動(dòng)類(lèi)型轉(zhuǎn)換不能實(shí)現(xiàn)目的時(shí),可以用強(qiáng)制類(lèi)型轉(zhuǎn)換。此外,在函數(shù)調(diào)用時(shí),有時(shí)為了使實(shí)參與形參類(lèi)型一致,可以用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符得到一個(gè)所需類(lèi)型的參數(shù)。賦值符號(hào)“=”就是賦值運(yùn)算符,它的作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量。如“a=3”的作用是執(zhí)行一次賦值操作〔或稱(chēng)賦值運(yùn)算〕。把常量3賦給變量a。也可以將一個(gè)表達(dá)式的值賦給一個(gè)變量。2.6賦值運(yùn)算符與賦值表達(dá)式
2.6.1賦值運(yùn)算符如果賦值運(yùn)算符兩側(cè)的類(lèi)型不一致,但都是數(shù)值型或字符型時(shí),在賦值時(shí)會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換?!?〕將浮點(diǎn)型數(shù)據(jù)〔包括單、雙精度〕賦給整型變量時(shí),舍棄其小數(shù)局部?!?〕將整型數(shù)據(jù)賦給浮點(diǎn)型變量時(shí),數(shù)值不變,但以指數(shù)形式存儲(chǔ)到變量中?!?〕將一個(gè)double型數(shù)據(jù)賦給float變量時(shí),要注意數(shù)值范圍不能溢出?!?〕字符型數(shù)據(jù)賦給整型變量,將字符的ASCII碼賦給整型變量。2.6.2賦值過(guò)程中的類(lèi)型轉(zhuǎn)換〔5〕將一個(gè)int、short或long型數(shù)據(jù)賦給一個(gè)char型變量,只將其低8位原封不動(dòng)地送到char型變量〔發(fā)生截?cái)唷?。例如shortinti=289;charc;c=i;//將一個(gè)int型數(shù)據(jù)賦給一個(gè)char型變量賦值情況見(jiàn)圖2.8。為方便起見(jiàn),以一個(gè)int型數(shù)據(jù)占兩個(gè)字節(jié)〔16位〕的情況來(lái)說(shuō)明。圖2.8〔6〕將signed〔有符號(hào)〕型數(shù)據(jù)賦給長(zhǎng)度相同的unsigned〔無(wú)符號(hào)〕型變量,將存儲(chǔ)單元內(nèi)容原樣照搬〔連原有的符號(hào)位也作為數(shù)值一起傳送〕。例2.5將有符號(hào)數(shù)據(jù)傳送給無(wú)符號(hào)變量。#include<iostream>usingnamespacestd;intmain〔〕{unsignedshorta;shortintb=-1;a=b;cout<<″a=″<<a<<endl;return0;}運(yùn)行結(jié)果為65535賦給b的值是-1,怎么會(huì)得到65535呢?請(qǐng)看圖2.9所示的賦值情況。圖2.9-1的補(bǔ)碼形式為〔即全部16個(gè)二進(jìn)制位均為1〕,將它傳送給a,而a是無(wú)符號(hào)型變量,16個(gè)位全1是十進(jìn)制的65535。如
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度內(nèi)參內(nèi)容深度挖掘與分析合同4篇
- 二零二五版高新技術(shù)研發(fā)中心建設(shè)擔(dān)保合同4篇
- 2025年度電視節(jié)目宣傳推廣合同范本4篇
- 2025年度農(nóng)藥企業(yè)安全生產(chǎn)責(zé)任保險(xiǎn)合同范本3篇
- 二零二五年度基礎(chǔ)設(shè)施建設(shè)承諾協(xié)議書(shū)合同4篇
- 二零二四年度智能農(nóng)業(yè)管理系統(tǒng)軟件開(kāi)發(fā)合同3篇
- 二零二五年度鋼棚戶(hù)外展覽搭建合同4篇
- 2025版古建筑門(mén)樓修繕與旅游開(kāi)發(fā)合作合同3篇
- 個(gè)性化設(shè)計(jì)委托合同:2024年專(zhuān)業(yè)模板一
- 二零二五年度電商品牌代理銷(xiāo)售合同模板4篇
- 2024年英語(yǔ)高考全國(guó)各地完形填空試題及解析
- 智能養(yǎng)老院視頻監(jiān)控技術(shù)方案
- 你比我猜題庫(kù)課件
- 體育概論(第二版)課件第三章體育目的
- 無(wú)人駕駛航空器安全操作理論復(fù)習(xí)測(cè)試附答案
- 建筑工地春節(jié)留守人員安全技術(shù)交底
- 默納克-NICE1000技術(shù)交流-V1.0
- 蝴蝶蘭的簡(jiǎn)介
- 老年人心理健康量表(含評(píng)分)
- 《小兒靜脈輸液速度》課件
- 營(yíng)銷(xiāo)人員薪酬標(biāo)準(zhǔn)及績(jī)效考核辦法
評(píng)論
0/150
提交評(píng)論