




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
緒論
1.1C++的發(fā)展歷史C++源於C語言,而C語言是在B語言的基礎(chǔ)上發(fā)展起來的。
1960年出現(xiàn)了一種面向問題的高級語言ALGOL60。1963年英國劍橋大學(xué)推出了CPL(CombinedProgrammingLanguage)語言,後來經(jīng)簡化為BCPL語言。
1970年美國貝爾(Bell)實驗室的K.Thompson以BCPL語言為基礎(chǔ),設(shè)計了一種類似於BCPL的語言,取其第一字母B,稱為B語言。
1972年美國貝爾實驗室的DennisM.Ritchie為克服B語言的諸多不足,在B語言的基礎(chǔ)上重新設(shè)計了一種語言,取其第二字母C,故稱為C語言。1980年貝爾實驗室的BjarneStroustrup對C語言進行了擴充,推出了“帶類的C”,多次修改後起名為C++。以後又經(jīng)過不斷的改進,發(fā)展成為今天的C++。
C++改進了C的不足之處,支持面向?qū)ο蟮某淌皆O(shè)計,在改進的同時保持了C的簡潔性和高效性。
1.2C++程式的開發(fā)過程C++語言是一種高級程式設(shè)計語言,它的開發(fā)過程與其他高級語言程式開發(fā)過程類似,一般要經(jīng)過四個步驟:編輯編譯鏈接執(zhí)行1.2.1編輯 是指把按照C++語法規(guī)則編寫的程式代碼通過編輯器(BorlandC++5.05,VisualC++6.0,TurboC++3.0)輸入電腦,並存盤。在存盤時,C++原始檔案的擴展名為.CPP。1.2.2編譯 將編輯好的C++根源程式通過編譯器轉(zhuǎn)換為目標(biāo)檔(OBJ檔)。即生成該原始檔案的目標(biāo)代碼。
1.2.3鏈接 將用戶程式生成的多個目標(biāo)代碼檔(.obj)和系統(tǒng)提供的庫檔(.lib)中的某些代碼連接在一起,生成一個可執(zhí)行檔(.exe)。1.2.4執(zhí)行 把生成的可執(zhí)行檔運行,在螢?zāi)簧巷@示運行結(jié)果。用戶可以根據(jù)運行結(jié)果來判斷程式是否出錯。1.3C++的詞法與規(guī)則1.3.1C++的字元集數(shù)字:0,1,2,3,4,5,6,7,8,9。小寫字母:a,b,…,y,z。大寫字母:A,B,…,Y,Z。運算符:+,-,*,/,
%,<,<=,=,>=,>,!=,==,<<,>>,&,|,&&,‖,∧,~,(),[],{},->,?
,!,?,?:,,,;,”,#。特殊字元:(連字元或下劃線)。不可印出字元:空白格(包括空格、換行和跳位字元)。1.3.2詞與詞法規(guī)則1.識別字 識別字是對實體定義的一種定義符,由字母或下劃線(或連字元)開頭、後面跟字母或數(shù)字或下劃線(或空串)組成的字元序列,一般有效長度是8個字元(而ANSIC標(biāo)準(zhǔn)規(guī)定31個字元),用來標(biāo)識用戶定義的常量名、變數(shù)名、函數(shù)名、檔案名、數(shù)組名、和數(shù)據(jù)類型名和程式等。2.關(guān)鍵字 關(guān)鍵字是具有特定含義,作為專用定義符的單詞,不允許另作它用。auto break case char classconst continue default do ddefaultdelete double else enum explicitextern float for friend gotoif inline int long mutablenew operator private protectedpublic register return short signedsizeof static static_cast struct switchthis typedef union unsignedvirtualvoid while3.運算符和分隔符號 運算符是C++語言實現(xiàn)加、減等各種運算的符號。
C++語言的分隔符號主要是:空格、製錶和換行符。4.字串 字串是由雙引號括起來的字元。如“China”,“C++Program”等。
5.常量
C++語言中常量包括實型常量(浮點常量)和整型常量(十進位常量、八進制常量、十六進制常量)、浮點常量、字元常量和字串常量。
6.注釋
注釋是用來幫助閱讀、理解及維護程式。在編譯時,注釋部分被忽略,不產(chǎn)生目標(biāo)代碼。C++語言提供兩種注釋方式。一種是與C相容的多行注釋,用/*和*/分界。另一種是單行注釋,以“//”開頭的表明本行中“//”符號後的內(nèi)容是注釋。如下程式:
例1-1:一個簡單的C++程式。
#include<iostream.h> voidmain() { cout<<”ThisismyfirstC++program.\n”;//輸出ThisismyfirstC++program. /*輸出
ThisismyfirstC++program.*/
}1.3.3書寫格式
C++語言程式的書寫格式自由度高,靈活性強,隨意性大,如一行內(nèi)可寫一條語句,也可寫幾條語句;一個語句也可分寫在多行內(nèi)。不過應(yīng)採用適當(dāng)?shù)母袷綍鴮?,便於人們閱讀和理解。 為了增加程式的可讀性和利於理解,編寫程式時按如下要點書寫: (1)一般情況下每個語句佔用一行。 (2)不同結(jié)構(gòu)層次的語句,從不同的起始位置開始,即在同一結(jié)構(gòu)層次中的語句,縮進同樣的字數(shù)。 (3)表示結(jié)構(gòu)層次的大括弧,寫在該結(jié)構(gòu)化語句第一個字母的下方,與結(jié)構(gòu)化語句對齊,並佔用一行。 (4)適當(dāng)加些空格和空行。1.4面向?qū)ο蟪淌皆O(shè)計
面向?qū)ο蟪淌皆O(shè)計是在吸取結(jié)構(gòu)化程式設(shè)計的一切優(yōu)點的基礎(chǔ)上發(fā)展起來的一種新的程式設(shè)計方法。它的本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個整體——對象。 面向?qū)ο笫荂++中的主要概念,在學(xué)習(xí)C++之前首先要瞭解這些概念。1.4.1對象 從一般意義上講,對象是現(xiàn)實世界中一個實際存在的事物,它可以是有形的(比如一輛汽車),也可以是無形的(比如一項計畫)。對象是構(gòu)成世界的一個獨立單位,它具有自己的靜態(tài)特徵(狀態(tài))和動態(tài)特徵(操作)。靜態(tài)特徵即可以用某種數(shù)據(jù)來描述的特徵,動態(tài)特徵即對象所表現(xiàn)的行為或?qū)ο笏哂械墓δ堋? 面向?qū)ο笳Z言把狀態(tài)和操作封裝於對象體之中,並提供一種訪問機制,使對象的“私有數(shù)據(jù)”僅能由這個對象的操作來執(zhí)行。用戶只能通過允許公開的操作提出要求(消息),才能查詢和修改對象的狀態(tài)。1.4.2類 類是面向?qū)ο笳Z言必需提供的用戶定義的數(shù)據(jù)類型,它將具有相同狀態(tài)、操作和訪問機制的多個對象抽象成為一個對象類。 類與對象的關(guān)係如同汽車與具體的一輛車的關(guān)係。汽車都能跑,有四個輪子,所有的汽車組成了一個類,具體到一輛汽車,它具有類的全部特性(能跑,有四個輪子),是汽車類的一個子集或元素。類給出了屬於該類的全部對象的抽象定義,而對象則是符合這種定義的一個實體。所以,一個對象又稱作類的一個實例(instance)。
1.4.3封裝
封裝是面向?qū)ο蠓椒ǖ囊粋€重要原則。它有兩個涵義:第一個涵義是,把對象的全部屬性和全部服務(wù)結(jié)合在一起,形成一個不可分割的獨立單位(即對象)。第二個涵義也稱作“資訊隱蔽”,即盡可能隱蔽對象的內(nèi)部細節(jié),對外形成一個邊界(或者說形成一道屏障),只保留有限的對外介面使之與外部發(fā)生聯(lián)繫。這主要是指對象的外部不能直接地存取對象地屬性,只能通過幾個允許外部使用地服務(wù)與對象發(fā)生聯(lián)繫。
1.4.4繼承
繼承是面向?qū)ο笳Z言的另一特性。類與類之間可以組成繼承層次,一個類的定義(子類)可以定義在另一個已定義類(父類)的基礎(chǔ)上。子類可以繼承父類中的屬性和操作,也可以定義自己的屬性和操作。
C++語言支持單繼承和多繼承,因而具有繼承這一特性所帶來的優(yōu)勢,大大增加了程式的重用性。
1.4.5多態(tài)性
對象的多態(tài)性是指在一般類中定義的屬性或操作被特殊類繼承之後,可以具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。這使得同一個屬性或操作名在一般類及其各個特殊類中具有不同的語義。
1.5C++程式的構(gòu)成 C++語言程式由以下基本部分組成。1. 函數(shù) 一個C++程式是由若干個函數(shù)構(gòu)成的。函數(shù)分為庫函數(shù)(標(biāo)準(zhǔn)函數(shù))和自定義函數(shù)。庫函數(shù)一般是由系統(tǒng)提供的。一個完整的C++語言程式只有一個主函數(shù)。2. 預(yù)處理命令 預(yù)處理命令以位於行首的符號“#”開始,C++提供的預(yù)處理有宏定義命令、檔包含命令和條件編譯命令三種。
3. 程式語句 一條完整的語句必須以分號“;”結(jié)束。程式語句有如下幾類:(1)說明語句 用來說明變數(shù)的類型和初值。 如下面語句是把變數(shù)說明為浮點數(shù)。
floata,b,c;
又如下面語句是把變數(shù)sum說明為整型變數(shù),並賦初值為零。
intsum=0;(2)運算式語句 由一個運算式構(gòu)成一個語句,用以描述算術(shù)運算、邏輯運算、或產(chǎn)生某種特定動作,在任何運算式最後加一個分號就構(gòu)成了一個語句。如下例由賦值運算式加“;”就構(gòu)成一個賦值運算式語句。(3)程式控制語句 用來描述語句的執(zhí)行條件與執(zhí)行順序的語句,C++語言的控制語句有9種,如下頁所示。其語句中的括?。?/p>
)表示其中是條件,~表示內(nèi)嵌的語句。if()
~else 條件語句for()
~ 迴圈語句while()
~ 迴圈語句do~while()
迴圈語句continue 結(jié)束本次迴圈語句break 中止迴圈式switch語句switch 多分支選擇語句goto 轉(zhuǎn)移語句return 從函數(shù)返回語句(4)複合語句 複合語句是一種十分重要的語句,由大括弧{和}把一些說明和語句組合在一起,使它們在語法上等價於一個簡單語句;可由若干簡單語句或複合語句組成。 例如:
if(a>b) {c=a-b; d=c*a; } else {c=a+b; d=c*b; }
數(shù)據(jù)類型是指定義了一組數(shù)據(jù)以及定義在這一組數(shù)據(jù)的操作,它是程式中最基本的元素。
C++數(shù)據(jù)類型十分豐富,大體上可分為基本類型、空類型、構(gòu)造類型、指針類型、類類型五種。如圖2-1所示。
數(shù)據(jù)類型基本類型空類型(無值類型)void構(gòu)造類型類類型class指針類型整型int實型(浮點型)字元型邏輯型bool結(jié)構(gòu)類型struct數(shù)組類型枚舉型類型enum聯(lián)合型類型union單精確度型float雙精度型double單字符型char寬字元型w-char圖2-1C++數(shù)據(jù)類型2.1數(shù)據(jù)類型2.1.1基本類型 基本數(shù)據(jù)類型有4種:整型(int)、浮點型(float)、字元型(char)、邏輯型(bool)。 整型數(shù)在電腦內(nèi)部一般採用定點表示法,用於存儲整型量。(如123,-7等),存儲整數(shù)的位數(shù)依機器的不同而異。 浮點數(shù)和整數(shù)不同的地方是浮點數(shù)採用的是浮點表示法,也就是說,浮點數(shù)的小數(shù)點的位置不同,給出的精度也不相同。 字元類型表示單個字元,一個字元用一個位元組存儲。 邏輯類型,也稱布爾類型,表示運算式真和假。2.1.2空類型void
空類型void用於顯示說明一個函數(shù)不返回任何值。還可以說明指向void類型的指針,說明以後,這個指針就可指向各種不同類型的數(shù)據(jù)對象。2.1.3構(gòu)造類型 構(gòu)造類型又稱為組合類型,它是由基本類型按照某種規(guī)則組合而成的。數(shù)組:是由具有相同數(shù)據(jù)類型的元素組成的集合。結(jié)構(gòu)體:是由不同的數(shù)據(jù)類型構(gòu)成的一種混合的數(shù)據(jù)結(jié)構(gòu),構(gòu)成結(jié)構(gòu)體的成員的數(shù)據(jù)類型一般不同,並且在內(nèi)存中分別佔據(jù)不同的存儲單元。共用體:是類似於結(jié)構(gòu)體的一種構(gòu)造類型,與結(jié)構(gòu)體不同的是構(gòu)成共同體的數(shù)據(jù)成員共用同一段記憶體單元。枚舉:是將變數(shù)的值一一列舉出來,變數(shù)的值只限於列舉出來的值的範(fàn)圍內(nèi)。
2.1.4指針類型 指針類型變數(shù)用於存儲另一變數(shù)的地址,而不能用來存放基本類型的數(shù)據(jù)。它在內(nèi)存中佔據(jù)一個存儲單元。2.1.5類類型 類是體現(xiàn)面向?qū)ο蟪淌皆O(shè)計的最基本特徵,也是體現(xiàn)C++與C最大的不同之處。類是一個數(shù)據(jù)類型,它定義的是一種對象類型,由數(shù)據(jù)和方法組成,描述了屬於該類型的所有對象的性質(zhì)。
2.2常
量
常量是指在程式運行過程中其值不能改變的量。C++支持5種類型的常量:浮點型、整型、字元型、布爾型和枚舉型。常量在程式中一般以自身的存在形式體現(xiàn)其值。常量具有類型屬性,類型決定了各種常量在內(nèi)存中佔據(jù)存儲空間的大小。
2.2.1整型常量 整型數(shù)據(jù)表示通常意義上的整數(shù),整型常量可以用十進位、八進制或十六進製錶示。1.十進位常量 一般占一個機器字長,是一個帶正負號的常數(shù)(默認情況下為正數(shù)),如+3,-7等。2.八進制常量 由數(shù)字0開頭,其後由若干0~7的數(shù)字組成,如0378,0123等。3.十六進制常量 以0x或0X開頭,其後由若干0~9的數(shù)字及A~F(或小寫a~f)的字母組成,如0x173,0x3af。
整型常量可以後跟字母l或L表示long型(長整數(shù)),也可以跟u或U表示unsigned整數(shù)(無符號整數(shù)),如以下數(shù)是合法的:
375u //無符號整數(shù)
12345UL //無符號長整數(shù)
54321L //長整數(shù)
13579ul //無符號長整數(shù)2.2.2浮點數(shù)常量 浮點數(shù)也稱為實型數(shù)。只能以十進位形式表示。共有兩種表示形式:小數(shù)表示法和指數(shù)表示法。1.小數(shù)表示法 使用這種表示形式時,實型常量分為整數(shù)部分和小數(shù)部分。其中的一部分可在實際使用時省略,如10.2,.2,2.等。但整數(shù)和小數(shù)部分不能同時省略。2.指數(shù)表示法 也稱科學(xué)記數(shù)法,指數(shù)部分以E或e開始,而且必須是整數(shù)。如果浮點數(shù)採用指數(shù)表示法,則E或e的兩邊都至少要有一位數(shù)。如以下數(shù)是合法的:
1.2e20,-3.4e-2。
2.2.3字元常量與字串常量1.字元常量
C++中的字元常量通常是用單引號括起的一個字元。在內(nèi)存中,字元數(shù)據(jù)以ASCII碼存儲,如字元‘a(chǎn)’的ASCII碼為97。字元常量包括兩類,一類是可顯字元,如字母、數(shù)字和一些符號
‘@’、‘+’等,另一類是不可顯字元常量,如ASCII碼為13的字元表示回車。2.轉(zhuǎn)義字元 轉(zhuǎn)義字元是特殊的字元常量,表示時一般以轉(zhuǎn)義字元‘\’開始,後跟不同的字元表示不同的特殊字元,表2-1列出了常用的特殊字元。
名稱符號空字元(null)\0換行(newline)\n換頁(formfeed)\f回車(carriagereturn)\r退格(backspace)\b響鈴(bell)\a水準(zhǔn)製錶(horizontaltab)\t垂直製錶(verticaltab)\v反斜線(backslash)\\問號(questionmark)\?單引號(singlequote)\’雙引號(doublequote)\”表2-1
常用的特殊字元
3.字串常量 字串常量是由一對雙引號括起來的零個或多個字元序列。 字串可以寫在多行上,不過在這種情況下必須用反斜線‘\’表示下一行字元是這一行字元的延續(xù)。 字串常量實際上是一個字元數(shù)組,組成數(shù)組的字元除顯示給出的外,還包括字元結(jié)尾處標(biāo)識字串結(jié)束的符號‘\0’,所以字串“abc”實際上包含4個字元:‘a(chǎn)’、‘b’、‘c’和‘\0’。 需要注意的是‘a(chǎn)’和“a”的區(qū)別,‘a(chǎn)’是一個字元常量,在內(nèi)存中占一個位元組的存儲單元,而“a”是一個字串常量,在內(nèi)存中占兩個位元組,除了存儲‘a(chǎn)’以外,還要存儲字串結(jié)尾符‘\0’。
2.2.4布爾常量 布爾常量僅有兩個:false(假)和true(真)。
2.2.5枚舉常量 枚舉常量可以通過建立枚舉類型來定義。 枚舉類型是一種用戶自定義數(shù)據(jù)類型。在聲明枚舉類型時,需要把常量的值一一列舉出來,形式如下:
enum枚舉類型名
{常量值1,常量值2,…,常量值n};例如聲明一個名為color的枚舉類型:
enumcolor{Red,Green,Blue,White,Black};
枚舉常量是一種符號常量。Red,Green等是符號常量,它們表示各個枚舉值,在內(nèi)存中表示以整型數(shù)。如果沒有專門指定,第一個符號常量的枚舉值就是0,其他枚舉值依次為1,2,3…。所以,C++自動給Red賦0,Green賦1,等等。
2.3變
量
變數(shù)是指程式在運行時其值可改變的量。每個變數(shù)由一個變數(shù)名惟一標(biāo)識,同時,每個變數(shù)又具有一個特定的數(shù)據(jù)類型。不同類型的變數(shù)在內(nèi)存中佔有存儲單元的個數(shù)不同。
2.3.1變數(shù)名命名 變數(shù)名的命名要遵守以下規(guī)則:不能是C++保留字。C++的保留字如表2-2所列。第一個字元必須是字母或下劃線,中間不能有空格。變數(shù)名除了使用26個英文大小寫字母和數(shù)字外,只能使用下劃線。一般不要超過31個字元。變數(shù)名不要與C++中的庫函數(shù)名、類名和對象名相同。 例如,下列變數(shù)名是合法的變數(shù)名:
a123c3bfile_1asmautobreakcasecatchcharclassconstcontinuedefaultdeletedodoubleelseenumexternfloatforfriendgotoifinlineintlongnewoperatoroverloadprivateprotectedpublicregisterreturnshortsignedsizeofstaticstructswitchthistemplatethrowtrytypedefunionunsignedvirtualvoidvolatilewhile表2-2C++的標(biāo)準(zhǔn)保留字
2.3.2變數(shù)定義和說明
C++中,變數(shù)使用之前一定要定義或說明,變數(shù)定義的格式一般為:
[修飾符]類型
變數(shù)名;
[//注釋]
其中,類型指出變數(shù)所存放的數(shù)據(jù)的類型;變數(shù)名是任意合法的變數(shù)名;注釋指明該變數(shù)的含義和用途;修飾符進一步描述了變數(shù)的使用方式。修飾符和注釋是任選的,可以沒有。
多個同一類型的變數(shù)可以在一行中定義,中間用逗號隔開,也可以分別定義。 例如:
inta,b,c; //定義3個整型變數(shù)a,b,c和
inta; //定義整型變數(shù)a intb; //定義整型變數(shù)b intc; //定義整型變數(shù)c二者等價。2.3.3變數(shù)初始化 變數(shù)初始化一般採用兩種方式。 第一種方式是在定義變數(shù)時可以給變數(shù)賦一個初值,例如:
inta=3; floatb=3.4; constintc=5;
第二種方式是先定義變數(shù),然後通過賦值語句使變數(shù)初始化,例如:
inta; a=3;2.4運算符與運算式
在程式中,運算式是計算求值的基本單位,它是由運算符和運算數(shù)組成的式子。運算符是表示進行某種運算的符號。運算數(shù)包含常量、變數(shù)和函數(shù)等。
C++語言的運算符按其在運算式中與運算對象的關(guān)係(連接運算對象的個數(shù))可分為:單目運算(一元運算符,只需一個運算元)雙目運算(二元運算符,需兩個運算元)三目運算(三元運算符,需三個運算元)
按其在運算式中所起的作用又可分為:
算術(shù)運算符
+-*/%
關(guān)係運算符
<<=>===!=
邏輯運算符
!&&||
位運算符
<<>>~|^&
自增自減運算符
++--
賦值運算符
=及其擴展(+=-=*=/=%=等)條件運算符
?:
指針運算符
*和
&
逗號運算符
,
分量運算符
*->
函數(shù)調(diào)用運算符()下標(biāo)運算符[]
求位元組運算符
sizeof
強制類型轉(zhuǎn)換運算符:(type)
2.4.1算術(shù)運算符 算術(shù)運算符有雙目運算和單目運算兩種。包括:
+(加法運算符,或正值運算符,如1+2,+3)
-(減法運算符,或負值運算符,如1-2,-3)
*(乘法運算符,如1*2)
/(除法運算符,如1/2)
%(模運算符或稱求餘運算符,如7%3=1)
2.4.2賦值運算符(1)賦值運算符“=”的一般格式為: 變數(shù)=運算式; 表示將其右側(cè)的運算式求出結(jié)果,賦給其左側(cè)的變數(shù)。例如:
inti; i=3*(4+5); //i的值變?yōu)?7(2)賦值運算式本身的運算結(jié)果是右側(cè)運算式的值,而結(jié)果類型是左側(cè)變數(shù)的數(shù)據(jù)類型。例如:
inti=1.2*3; //結(jié)果為3,而不是3.6(3)賦值運算符的結(jié)合性是從右至左的,因此,C++程式中可以出現(xiàn)連續(xù)賦值的情況。例如,下麵的賦值是合法的:
inti,j,k; i=j=k=10; //i,j,k都賦值為10(4)複合運算符:
+=(加賦值),
-=(減賦值),
*=(乘賦值),
/=(除賦值),
%=(取模賦值),
<<=(左移賦值),
>>=(右移賦值),
&=(與賦值),
^=(異或賦值),
|=(或賦值)
它們的含義如下:a+=b 等價於
a=a+ba-=b 等價於
a=a-ba*=b 等價於
a=a*ba/=b 等價於
a=a/ba%=b 等價於
a=a%ba<<=b 等價於
a=a<<ba>>=b 等價於
a=a>>ba&=b 等價於
a=a&ba^=b 等價於
a=a^ba|=b 等價於
a=a|b例如:
inta=12; a+=a;表示
a=(a+a)=(12+12)=24;又例如:
inta=12; a+=a-=a*=a;表示
a=a*a//a=12*12=144 a=a-a//a=144-144=0 a=a+a//a=0+0=02.4.3關(guān)係運算符(1)關(guān)係運算符用於兩個值進行比較,運算結(jié)果為true(真)或false(假),分別用值非0(true)或0(false)表示。C++中的關(guān)係運算符如下:<(小於),
<=(小於等於),
>(大於),
>=(大於等於), ==(等於),
!=(不等於),
(2)關(guān)係運算符都是雙目運算符,其結(jié)合性是從左到右,<、<=、>、>=運算符的優(yōu)先順序相同,==和!=運算符的優(yōu)先順序相同,前者運算的優(yōu)先順序高於後者。(3)關(guān)係運算符的優(yōu)先順序低於算術(shù)運算符。例如:
a+b>c 等價於 (a+b)>c a!=b>c 等價於 a!=(b>c)
2.4.4邏輯運算符
&&(邏輯與),
||(邏輯或),?。ㄟ壿嫹牵? 邏輯運算式的結(jié)果為真則為1,結(jié)果為假則為0。 邏輯非(!)是單目運算符,邏輯與(&&)與邏輯或(||)為雙目運算符。
邏輯非的優(yōu)先順序最高,邏輯與次之,邏輯或最低。 邏輯運算真值表如表2-3所示。
表2-3邏輯運算真值(真為非0,假為0)aba&&ba||b!a!b0000110非00110非000101非0非011002.4.5自增、自減運算符(1)自增(++)、自減(--)運算符為變數(shù)的增1和減1提供了緊湊格式。(2)自增、自減運算符都是單目運算符,其作用是使變數(shù)的值增1或減1。(3)自增、自減運算符有四種應(yīng)用格式:
inta=3;b=a++;等價於b=a;a=a+1; inta=3;b=a--;等價於b=a;a=a-1;
(運算符後置用法,代表先使用變數(shù),然後對變數(shù)增值)
inta=3;b=++a;等價於a=a+1;b=a; inta=3;b=--a;等價於a=a-1;b=a;
(運算符前置用法,代表先對變數(shù)增值,再使用變數(shù))
(4)C++編譯器在處理時盡可能多的自左向右將運算符結(jié)合在一起。 例如:a+++b表示為(a++)+b而不是a+(++b)。(5)在調(diào)用函數(shù)時,實參的求值順序一般為自右向左。而不是PASCAL語言那樣自左向右。例如:
inta=1; printf(“%d,%d,%d”,a++,a++,a++);
輸出的結(jié)果為3,2,1而不是1,2,3。
2.4.6條件運算符(1)條件運算符“?:”是C++中惟一三目運算符,其形式為: 運算式1?運算式2:運算式3
它的運算方式為:先計算運算式1的值,如果其值為非0(真),則運算式2的值就是整個運算式的最終結(jié)果;否則運算式3的值就是整個運算式的值。常見的一個例子為:
max=((a>b)?a:b)
上面例子定義了一個求兩個數(shù)a和b中最大值,其中決定哪一個是最大值用了條件運算符。(2)條件運算符的結(jié)合性是自右向左。例如有以下條件運算式:
a>b?a:c>d?c:d相當(dāng)於
a>b?a:(c>d?c:d)(3)條件運算符的優(yōu)先順序別高於賦值運算符,低於關(guān)係運算符和算術(shù)運算符。例如有:
a>b?a-b:b-a相當(dāng)於
a>b?(a-b):(b-a)2.4.7位運算符(1)位(bit)是電腦中表示資訊的最小單位,一般用0和1表示。一個字元在電腦中用8個位表示,8個位組成一個位元組。C++語言需要將人們通常所習(xí)慣的十進位數(shù)表示為二進位、八進制或十六進制數(shù)來理解對位的操作。C++中所有的位運算符如下:
~(按位求反),
<<(左移),
>>(右移), &(按位與), ^(按位異或),
|(按位或)。(2)位運算符是對其運算元按其二進制形式逐位進行運算,參加位運算的運算元必須為整數(shù)。2.4.8sizeof運算符(求位元組運算符)(1)sizeof運算符是單目運算符,用於計算運算對象在內(nèi)存中所占位元組的多少,它有兩種形式:
sizeof(類型識別字);
sizeof運算式;(2)sizeof可以接受的類型識別字很多,如sizeof(int)表示求整型數(shù)據(jù)在內(nèi)存中所占位元組數(shù)。
例如:inta,則sizeof(a)表示求變數(shù)a在內(nèi)存中所占位元組數(shù)。 例如:inta[10],則sizeof(a)表示求數(shù)組a在內(nèi)存中所占位元組數(shù)。
2.4.9逗號運算符(1)逗號運算符用於將多個運算式連在一起,並將各運算式從左到右的順序依次求值,但只有其最右端的運算式的結(jié)果,作為整個逗號運算式的結(jié)果。(2)逗號運算式的一般格式為: 運算式1,運算式2,……,運算式n
例如:
inta=3,b=4,c=5; a+b,b+c,c+a;
則先求解a+b,再求解b+c,最後求解c+a,整個運算式的結(jié)果為c+a的結(jié)果。
2.4.10運算符優(yōu)先順序(1)運算符優(yōu)先順序決定了在運算式中各個運算符執(zhí)行的先後順序。高優(yōu)先順序運算符先於低優(yōu)先順序運算符進行運算。在優(yōu)先順序相同的情形下,則按從左到右的順序進行運算。(2)當(dāng)運算式中出現(xiàn)了括弧時,會改變優(yōu)先順序。先計算括弧中的子運算式值,再計算整個運算式的值。 表2-4(見教材)列出了C++的所有運算符集,依優(yōu)先順序從高到低排列。(3)運算符的結(jié)合方式有兩種:左結(jié)合和右結(jié)合。左結(jié)合表示運算符優(yōu)先與其左邊的識別字結(jié)合進行運算,如加法;右結(jié)合表示運算符優(yōu)先與其右邊的識別字結(jié)合,如單目運算符+、-。(4)同一優(yōu)先順序的優(yōu)先順序別相同,運算次序由結(jié)合方向決定。如1*2/3,*和/的優(yōu)先順序別相同,其結(jié)合方向自左向右,則等價於(1*2)/3。(5)不同的運算符要求有不同的運算對象個數(shù),單目運算符只需一個運算對象,如i++,-a,sizeof(b)等。2.4.11運算式 運算式是用於計算的式子,它由運算符、運算數(shù)和括弧組成。最簡單的運算式只有一個常量或變數(shù),當(dāng)運算式中有兩個或多個運算符時,運算式稱為複雜運算式,其中運算符執(zhí)行的先後順序由它們的優(yōu)先順序和結(jié)合性決定。執(zhí)行運算式所規(guī)定的運算,所得到的結(jié)果值便是運算式的值。
C++中由於運算符很豐富,因此運算式的種類也很多。常用的運算式有6種。
1. 算術(shù)運算式 由算術(shù)運算符和位操作運算符組成的運算式。其運算式的值是一個數(shù)值,運算式的類型由運算符和運算數(shù)確定。 例如,
a+3*(b/2)就是一個算術(shù)運算式。2. 邏輯運算式 由邏輯運算符組成的運算式。其運算式的值的類型為邏輯型,一般地,真用1表示,假用0表示。 例如,!a&&b||c就是一個邏輯運算式。
3. 關(guān)係運算式 由關(guān)係運算符組成的運算式。其運算式的值的類型為邏輯型,一般地,真用1表示,假用0表示。 例如,a>b!=c就是一個關(guān)係運算式。4. 賦值運算式 由賦值運算符組成的運算式。 例如,已知a=b就是一個賦值運算式。
5. 條件運算式 由三目運算符組成的運算式。條件運算式的值取決於?號前面的運算式,該運算式的值為非0時,整個運算式的值為:號前面運算式的值,否則為:號後面運算式的值。條件運算式的類型是:號前和:號後兩個運算式中類型高的一個運算式的類型。 例如,a>b?a:b就是一個條件運算式。6. 逗號運算式 用逗號將若干個運算式連起來組成的運算式。該運算式的值是組成逗號運算式的若干個運算式中最後一個運算式的值,類型也是最後一個運算式的類型。逗號運算式計算值的順序是從左至右逐個運算式分別計算。 例如,a+3,b+4,c+5就是一個逗號運算式。
2.4.12數(shù)據(jù)類型轉(zhuǎn)換
C++中數(shù)據(jù)類型轉(zhuǎn)換有兩類,即隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。1. 隱式類型轉(zhuǎn)換 隱式類型轉(zhuǎn)換是由編譯器自動完成的類型轉(zhuǎn)換。當(dāng)編譯器遇到不同類型的數(shù)據(jù)參與同一運算時,會自動將它們轉(zhuǎn)換為相同類型後再進行運算,賦值時會把所賦值的類型轉(zhuǎn)換為與被賦值變數(shù)類型一樣。隱式類型轉(zhuǎn)換按從低到高的順序進行,如圖2-2所示。
整型(int)短整型,字元型(short,char)單精確度浮點型(float)雙精度浮點型(double)無符號長整型(unsignedlong)長整型(long)無符號整型(unsigned)圖2-2數(shù)據(jù)類型轉(zhuǎn)換的順序
高級語言根源程式的基本組成單位是語句。在C++程式中,語句是最小的可執(zhí)行單元,一條語句由一個分號結(jié)束。
C++程式的語句按其功能可以劃分為兩類: 操作運算語句 流程控制語句 基本的控制結(jié)構(gòu)有三種: 順序結(jié)構(gòu),選擇結(jié)構(gòu),迴圈結(jié)構(gòu)
3.1順序控制語句
顧名思義,所謂順序結(jié)構(gòu),就是指按照語句在程式中的先後次序一條一條的順次執(zhí)行。順序控制語句是一類簡單的語句,上述的操作運算語句即是順序控制語句,包括運算式語句,輸入/輸出等。
3.1.1運算式語句
任何一個運算式後面加上一個分號就構(gòu)成了運算式語句(沒有分號的不是語句)。運算式是指用運算符連接各個運算對象,合乎語法規(guī)則的式子。 例如,以下都是運算式語句:
a=3+5; a>b?a:b; a=1,b=2,c=3; printf(“hello\n”);
常見的運算式語句有以下幾種:空語句、賦值語句、函數(shù)調(diào)用語句。
1.空語句 空語句是指只有一個分號而沒有運算式的語句。語法格式為: ;
空語句不做任何操作運算,而只是作為一種形式上的語句,填充在控制結(jié)構(gòu)之中。這些填充處需要一條語句,但又不做任何操作。 空語句是最簡單的運算式語句。
2.賦值語句 賦值語句是由賦值運算式加一個語句結(jié)束標(biāo)誌(分號“;”)構(gòu)成的語句。語法格式為: 變數(shù)
賦值運算符
運算式; 例如: a=1; b+=2; c=sin(d);
可以多重賦值,將一個運算式的值同時賦給多個變數(shù)。如:變數(shù)1=變數(shù)2=…=變數(shù)n=運算式; 等價於:變數(shù)1=運算式;變數(shù)2=運算式;…;變數(shù)n=運算式;
3.函數(shù)調(diào)用語句 函數(shù)調(diào)用語句是由函數(shù)調(diào)用運算式加一個語句結(jié)束標(biāo)誌(分號“;”)構(gòu)成的語句。 例如:
scanf(“%d”,&e);
max(a,b);
3.1.2
輸入/輸出(I/O)
C++程式?jīng)]有輸入/輸出語句,它的輸入/輸出功能由函數(shù)(scanf、printf)或流控制來實現(xiàn)。輸入/輸出流(I/0流)是輸入或輸出的一系列位元組。C++定義了運算符“<<”和“>>”的iostream類。在這裏只介紹如何利用C++的標(biāo)準(zhǔn)輸入/輸出流實現(xiàn)數(shù)據(jù)的輸入/輸出功能。
1.輸入 當(dāng)程式需要執(zhí)行鍵盤輸入時,可以使用抽取操作符“>>”從輸入流cin中抽取鍵盤輸入的字元和數(shù)字,並把它賦給指定的變數(shù)。例如:
#include<iostream.h> voidmain() { inta; cin>>a; }
注意:這裏的抽取操作符“>>”與位移運算符“>>”是同樣的符號,但這種符號在不同的地方其含義是不一樣的。
2.輸出 當(dāng)程式需要在螢?zāi)簧巷@示輸出時,可以使用插入操作符“<<”向輸出流cout中插入字元和數(shù)字,並把它在螢?zāi)簧巷@示輸出。例如:
#include<iostream.h> voidmain() { cout<<”Hello.\n”; }
與輸入一樣,這裏的插入操作符“<<”與位移運算符“<<”是同樣的符號,但這種符號在不同的地方其含義是不一樣的。
在C++程式中,cin與cout允許將任何基本數(shù)據(jù)類型的名字或值傳給流。而且書寫格式較靈活,可以在同一行中串連書寫,也可以分寫在幾行,提高可讀性。 例如:cout<<”hello”; cout<<3; cout<<endl;
等價於:
cout<<”hello”<<3<<endl;
也等價於:
cout<<”hello” //注意:行末無分號
<<3 //行末無分號
<<endl;
又例如:
inta;doubleb; cin>>a>>b;//cin可分辨不同的抽取
//變數(shù)類型3.常用的控制符 用控制符(manipulators)可以對I/O流的格式進行控制。C++在頭檔iomanip.h中定義了控制符對象,可以直接將這些控制符嵌入到I/O語句中進行格式控制。在使用這些控制符時,要在程式的開頭包含頭檔iomanip.h。
表3-1列出了常用的I/O流控制符。
控制符含義dec數(shù)值數(shù)據(jù)採用十進位表示hex數(shù)值數(shù)據(jù)採用十六進製錶示oct數(shù)值數(shù)據(jù)採用八進製錶示setw(n)設(shè)置域?qū)挒閚個字元setprecision(n)設(shè)置浮點數(shù)的小數(shù)位數(shù)(包括小數(shù)點)setioflags(ios::uppercase)十六進制數(shù)大寫輸出setioflags(ios::lowercase)十六進制數(shù)小寫輸出setiosflags(ios::left)左對齊setiosflags(ios::right)右對齊setiosflags(ios::showpos)設(shè)置正、負符號的顯示setfill(c)設(shè)置填充字元為cendl插入換行符,並刷新流
表3-1
常用的I/O流控制符
(1)控制不同進制的輸出(十進位、八進制、十六進制)
#include<iostream.h> voidmain() { inta=1001; cout<<”默認下:”<<a<<endl; cout<<”十進位:”<<dec<<a<<endl; cout<<”八進制:”<<oct<<a<<endl; cout<<”十六進制:”<<hex<<a<<endl;}
此程式的運行結(jié)果為: 默認下:1001
十進位:1001
八進制:1751
十六進制:3e9(2)控制輸出寬度
#include<iostream.h> #include<iomanip.h> voidmain() { inta=1234567890; doubleb=123.45; cout<<setw(10)<<a<<endl; cout<<setw(10)<<b<<endl; cout<<setw(8)<<b<<endl; cout<<setw(6)<<b<<endl; cout<<setw(4)<<b<<endl; }此程式的運行結(jié)果為:
1234567890 123.45 123.45 123.45
123.45(3)控制輸出精度
#include<iostream.h> #include<iomanip.h> voidmain() { doublea=1.234567; cout<<setprecision(3)<<a<<endl; }
如果希望顯示的數(shù)字是1.23,即保留兩位小數(shù),此時可用setprecision(n)控制符加以控制,此時顯示3位有效位。當(dāng)小數(shù)位數(shù)截短顯示時,進行四捨五入處理。
C++默認的輸出流數(shù)值的有效位是6。
(4)控制左右對齊 默認情況下,C++程式的I/O流以左對齊方式顯示輸出的內(nèi)容。使用控制符setiosflags(ios::left)和setiosflags(ios::right),可以控制輸出內(nèi)容的左、右對齊方式。setiosflags(ios::left)和setiosflags(ios::right)控制符在頭檔iomanip.h中定義。
(5)控制正、負符號的顯示
#include<iostream.h>#include<iomanip.h>voidmain(){cout<<10<<””<<-20<<endl;cout<<setiosflags(ios::showpos)<<30<<””<<-40<<endl;}此程式的運行結(jié)果為:10 -20+30 -40
(6)控制空位填充
#include<iostream.h>#include<iomanip.h>voidmain(){cout<<setfill(‘*’)<<setw(4)<<12<<endl;}此程式的運行結(jié)果為:**12
3.1.3複合語句
C++語言允許把一組語句用一對花括弧括起來,構(gòu)成一個複合語句。例如:
{ inta; a=1+2; }
請注意:一個複合語句的右花括弧“}”之後不能再寫分號。 複合語句也稱為分程式,是若干條語句的一個集合,它在語法上是一個整體,相當(dāng)於一個語句。在分程式中定義的變數(shù)只在此分程式中有效。
3.2選擇控制語句
選擇語句又稱為分支語句,它通過對給定的條件進行判斷,從而決定執(zhí)行兩個或多個分支中的哪一支。因此,在編寫選擇語句之前,應(yīng)該首先明確判斷條件是什麼,並確定當(dāng)判斷結(jié)果為“真”或“假”時應(yīng)分別執(zhí)行什麼樣的操作(演算法)。
C++程式中提供的選擇語句有兩種:
if…else語句和switch語句。
3.2.1if…else語句1.if語句
if語句的語法格式為:
if(條件運算式)或:
if(條件運算式)
語句; {
語句序列;
}
它的意義為:如果條件運算式進行一次測試,且測試為真,則執(zhí)行後面的語句。 當(dāng)語句序列只包含一條語句時,包圍該語句序列的花括弧可以省略。
例如:判斷用戶的輸入,如果輸入的數(shù)值大於0,則在螢?zāi)簧巷@示“正數(shù)”。
#include<iostream.h> voidmain() { inta; cin>>a; if(a>0) cout<<”正數(shù)”<<endl; }2.空語句 編譯器必須在if條件運算式的後面找到一個作為語句結(jié)束符的分號“;”,以標(biāo)誌if語句的結(jié)束。這樣,如果是下麵的代碼:
if(條件運算式);
//空語句做if中的語句 語句; 則不管條件運算式為真為假,總是接著執(zhí)行分號後的語句。即相當(dāng)於if語句不做任何事。3.if…else語句if…else語句的語法格式為:if(條件運算式){
語句序列1;}else{
語句序列2;}
它的意義為:如果“條件運算式”的判斷結(jié)果為真,則執(zhí)行語句序列1;如果“條件運算式”的判斷結(jié)果為假,則執(zhí)行語句序列2。
判斷用戶的輸入,如果輸入的數(shù)值大於0,則在螢?zāi)簧巷@示“正數(shù)”;否則在螢?zāi)簧巷@示“不是正數(shù)”。#include<iostream.h>voidmain(){inta;cin>>a;if(a>0)cout<<”正數(shù)”<<endl;elsecout<<”不是正數(shù)”<<endl;}
當(dāng)多個if…else語句嵌套時,為了防止出現(xiàn)二義性,C++語言規(guī)定,由後向前使每一個else都與其前面的最靠近它的if配對。如果一個else的上面又有一個未經(jīng)配對的else,則先處理上面的(內(nèi)層的)else的配對。 例如:判斷a、b、c三個數(shù)中的最大值。if(a>b)if(a>c)max=a;elsemax=c;elseif(b>c)max=b;elsemax=c;
當(dāng)多個if…else語句嵌套時,在容易誤解的地方可以按照語法關(guān)係加上花括弧來標(biāo)識邏輯關(guān)係的正確性。 如上例可以改寫為:if(a>b){if(a>c)max=a;elsemax=c;}else{if(b>c) max=b; else max=c;}
3.2.2switch語句
switch語句是多分支的選擇語句。嵌套的if語句可以處理多分支選擇。但是,用switch語句更加直觀。
switch語句的語法格式為:switch(整數(shù)運算式)
{case常量運算式1:<語句序列1>;
case常量運算式2:<語句序列2>;
……case常量運算式n:<語句序列n>;
default:<語句序列n+1>;
} switch語句的執(zhí)行順序是:首先對“整數(shù)運算式”進行計算,得到一個整型常量結(jié)果,然後從上到下尋找與此結(jié)果相匹配的常量運算式所在的case語句,以此作為入口,開始順序執(zhí)行入口處後面的各語句,直到遇到break語句,才結(jié)束switch語句,轉(zhuǎn)而執(zhí)行switch結(jié)構(gòu)後的其他語句。如果沒有找到與此結(jié)果相匹配的常量運算式,則從default:處開始執(zhí)行語句序列n+1。例如,根據(jù)考試成績的等級輸出百分制分數(shù)段:chargrade;//...switch(grade){case’A’:cout<<“85~100\n”;break;case’B’:cout<<“70~84\n”;break;case’C’:cout<<“60~69\n”;break;case’D’:cout<<“<60\n”;break;default:cout<<“error\n”;break;}若grade的值為‘A’,則程式的輸出結(jié)果為:85~100
幾點說明:(1)default語句是可缺省的。(2)switch後面括弧中的運算式只能是整型、字元型或枚舉型運算式。(3)在各個分支中的break語句起著退出switch語句的作用。(4)case語句起標(biāo)號的作用。標(biāo)號不能重名。(5)可以使多個case語句共用一組語句序列。(6)各個case(包括default)語句的出現(xiàn)次序可以任意。(7)每個case語句中不必用{},而整體的switch結(jié)構(gòu)一定要寫一對花括弧{}。(8)switch結(jié)構(gòu)也可以嵌套。3.3迴圈控制語句 C++提供了三種迴圈控制語句:while語句,do…while語句,for語句。三種語句都由相似的三部分組成:進入迴圈的條件,循環(huán)體,退出迴圈的條件;完成的功能也類似。所不同的只是三者進入與退出迴圈的方式不同。
while語句:當(dāng)條件滿足時進入,重複執(zhí)行循環(huán)體,直到條件不滿足時退出。
do…while語句:無條件進入,執(zhí)行一次循環(huán)體後判斷是否滿足條件,當(dāng)條件滿足時重複執(zhí)行循環(huán)體,直到條件不滿足時退出。
for語句:當(dāng)迴圈變數(shù)在指定範(fàn)圍內(nèi)變化時,重複執(zhí)行循環(huán)體,直到迴圈變數(shù)超出了指定的範(fàn)圍時退出。
3.3.1while語句
while語句的語法格式為:
while(條件運算式)
循環(huán)體; 它的含義為:首先對條件運算式進行判斷,若判斷結(jié)果為假(false,0),則跳過循環(huán)體,執(zhí)行while結(jié)構(gòu)後面的語句。若判斷結(jié)果為真(true,非0),則進入循環(huán)體,執(zhí)行其中的語句序列。執(zhí)行完一次循環(huán)體語句後,修改迴圈變數(shù),再對條件運算式進行判斷,若判斷結(jié)果為真,則再執(zhí)行一次循環(huán)體語句,……依次類推,直到判斷結(jié)果為假時,退出while迴圈語句,轉(zhuǎn)而執(zhí)行後面的語句。即“先判斷後執(zhí)行”。 while迴圈由4個部分組成:迴圈變數(shù)初始化,判斷條件,循環(huán)體,改變迴圈變數(shù)的值。 例如,計算sum=1+2+3+…+10的while迴圈結(jié)構(gòu)如下:
sum=0; i=1; //迴圈變數(shù)初始化
while(i<=10) //判斷條件
{ //循環(huán)體
sum=sum+i; i++; //改變迴圈變數(shù)的值
}注意:(1)如果循環(huán)體包含一個以上的語句,則應(yīng)該用花括弧括起來,以塊語句形式出現(xiàn)。(2)仔細定義迴圈變數(shù)的初始值和判斷條件的邊界值。(3)對條件運算式的計算總是比循環(huán)體的執(zhí)行多一次。這是因為最後一次判斷條件為假時不執(zhí)行循環(huán)體。(4)當(dāng)循環(huán)體不實現(xiàn)任何功能時,要使用空語句作為循環(huán)體,表示為:
while(條件運算式)
;(5)循環(huán)體中,改變迴圈變數(shù)的值很重要。如果迴圈變數(shù)的值恒定不變,或者當(dāng)條件運算式為一常數(shù)時,將會導(dǎo)致無限迴圈(也即死迴圈)。若要退出一個無限迴圈,必須在循環(huán)體內(nèi)用break等語句退出。
3.3.2do…while語句
do…while語句的語法格式為:
do
循環(huán)體;
while(條件運算式);
它的含義為:當(dāng)流程到達do後,立即執(zhí)行循環(huán)體語句,然後再對條件運算式進行判斷。若條件運算式的值為真(非0),則重複執(zhí)行循環(huán)體語句,否則退出。即“先執(zhí)行後判斷”方式。
do…while語句與while語句功能相似。
例如:計算sum=1+2+3+…+10的do…while迴圈結(jié)構(gòu)如下:
sum=0; i=1; //迴圈變數(shù)初始化
do { //循環(huán)體
sum=sum+i; i++; //改變迴圈變數(shù)的值
}while(i<=10) //判斷條件 與while語句不同的是:while語句有可能一次都不執(zhí)行循環(huán)體,而do…while迴圈至少執(zhí)行一次,因為直到程式到達循環(huán)體的尾部遇到while時,才知道繼續(xù)條件是什麼。
do…while結(jié)構(gòu)與while結(jié)構(gòu)中都具有一個while語句,很容易混淆。為明顯區(qū)分它們,do…while循環(huán)體即使是一個單語句,習(xí)慣上也使用花括弧包圍起來,並且while(運算式)直接寫在花括弧“}”的後面。這樣的書寫格式可以與while結(jié)構(gòu)清楚地區(qū)分開來。 例如:
do { sum+=i++; }while(i<=100);3.3.3for語句
for語句的語法格式為:
for(運算式1;運算式2;運算式3)
循環(huán)體; 其中,運算式1可以稱為初始化運算式,一般用於對迴圈變數(shù)進行初始化或賦初值;運算式2可以稱為條件運算式,當(dāng)它的判斷條件為真時,就執(zhí)行循環(huán)體語句,否則終止迴圈,退出for結(jié)構(gòu);運算式3可以稱為修正運算式,一般用於在每次循環(huán)體執(zhí)行之後,對迴圈變數(shù)進行修改操作;循環(huán)體是當(dāng)運算式2為真時執(zhí)行的一組語句序列。
具體來說,for語句的執(zhí)行過程如下: (1)先求解運算式1; (2)求解運算式2,若為0(假),則結(jié)束迴圈,並轉(zhuǎn)到(5); (3)若運算式2為非0(真),則執(zhí)行循環(huán)體,然後求解運算式3; (4)轉(zhuǎn)回(2); (5)執(zhí)行for語句下麵的一個語句。
例如,計算sum=1+2+3+…+10的for迴圈結(jié)構(gòu)如下:
sum=0; for(i=1;i<=10;i++)//初始化,判斷條
//件,修改方式,步長都在頂部描述
{ sum+=i; //循環(huán)體相對簡潔
}
由此例可見,for語句將循環(huán)體所用的控制都放在迴圈頂部統(tǒng)一表示,顯得更直觀。
除此之外,for語句還充分表現(xiàn)了其靈活性。比如,運算式3並不僅限於修正迴圈變數(shù)的值,還可以是任何操作。例如:for(sum=0,i=1;i<=10;sum+=i,i++);注意,此時for語句沒有循環(huán)體,也即循環(huán)體是一個空語句。 有時,運算式2被省略。即不判斷迴圈條件,迴圈無終止進行下去。這時候,需要在循環(huán)體中有跳出迴圈的控制語句。 最簡單的表示無限迴圈的方式如下:
for(
;
;)
//分號不能省略 三個運算式都可省略。即不設(shè)初值,不判斷條件(認為運算式2為真),迴圈變數(shù)不變化,無終止執(zhí)行循環(huán)體的語句。3.4跳轉(zhuǎn)語句
在C++中,除了提供順序執(zhí)行和選擇控制、迴圈控制語句外,還提供了一類跳轉(zhuǎn)語句。這類語句的總體功能是中斷當(dāng)前某段程式的執(zhí)行,並跳轉(zhuǎn)到程式的其他位置繼續(xù)執(zhí)行。常見的跳轉(zhuǎn)語句有三種:break語句、continue語句與goto語句。其中,前兩種語句不允許用戶自己指定跳轉(zhuǎn)到哪里,而是必須按照相應(yīng)的原則跳轉(zhuǎn),而後一種語句可以由用戶事先指定欲跳轉(zhuǎn)到的位置,按照用戶的需要進行跳轉(zhuǎn)。3.4.1
break語句
break語句的作用是:結(jié)束當(dāng)前正在執(zhí)行的迴圈(for、while、do…while)或多路分支(switch)程式結(jié)構(gòu),轉(zhuǎn)而執(zhí)行這些結(jié)構(gòu)後面的語句。 在switch語句中,break用來使流程跳出switch語句,繼續(xù)執(zhí)行switch後的語句。 在迴圈語句中,break用來從最近的封閉循環(huán)體內(nèi)跳出。
例如,下麵的代碼在執(zhí)行了break之後,繼續(xù)執(zhí)行“a+=1;”處的語句,而不是跳出所有的迴圈:
for(;;){…for(;;){…if(i==1)break;…}a+=1;//break跳至此處
//…}3.4.2continue語句
continue語句的作用是:結(jié)束當(dāng)前正在執(zhí)行的這一次迴圈(for、while、do…while),接著執(zhí)行下一次迴圈。即跳過循環(huán)體中尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行迴圈的判定。 在for迴圈中,continue用來轉(zhuǎn)去執(zhí)行運算式2。 在while迴圈和do…while迴圈中,continue用來轉(zhuǎn)去執(zhí)行對條件運算式的判斷。
continue語句和break語句的區(qū)別是:continue語句只結(jié)束本次迴圈,而不是終止整個迴圈的執(zhí)行。而break語句則是結(jié)束本次迴圈,不再進行條件判斷。
例如:
輸出1~100之間的不能被7整除的數(shù)。
for(inti=1;i<=100;i++) { if(i%7==0) continue; cout<<i<<endl; }
當(dāng)i被7整除時,執(zhí)行continue語句,結(jié)束本次迴圈,即跳過cout語句,轉(zhuǎn)去判斷i<=100是否成立。只有i不能被7整除時,才執(zhí)行cout函數(shù),輸出i。3.4.3goto語句
goto語句的語法格式為:
goto標(biāo)號; 其中,標(biāo)號是一個用戶自定義的識別字,它的命名規(guī)則與變數(shù)名的命名規(guī)則相同。定義標(biāo)號時,由一個識別字後面跟一個冒號組成。標(biāo)號的位置自由,可位於goto語句的前面,也可位於goto語句的後面,但必須與goto語句共處於同一函數(shù)中。
goto語句的作用是:結(jié)束當(dāng)前正在執(zhí)行的迴圈(for、while、do…while)或多路分支(switch)程式結(jié)構(gòu),轉(zhuǎn)而執(zhí)行標(biāo)號所標(biāo)識的語句。
例如:求1加到10的總和。
i=1;sum=0; loop: sum+=i++; if(i<=10) gotoloop; cout<<“thesumis”<<sum<<endl;
濫用goto語句將使程式流程無規(guī)則、可讀性差,現(xiàn)代程式設(shè)計方法主張限制使用goto語句。用goto語句實現(xiàn)的迴圈完全可用while或for迴圈來表示。一般地,goto語句只在一個地方有使用價值:當(dāng)要從多重迴圈深處直接跳轉(zhuǎn)到迴圈之外時,如果用break語句,將要用多次,而且可讀性並不好,這時goto可以發(fā)揮作用。
例3-8:判斷某一年是否是閏年。#include"iostream.h"voidmain(){intyear,leap;cout<<"pleaseinputayear:"<<endl;cin>>year;if((year%4==0&&year%100!=0)||(year%400==0))leap=1;elseleap=0;if(leap)cout<<year<<"isaleapyear."<<endl;elsecout<<year<<"isnotaleapyear."<<endl;}
最後看一個應(yīng)用程式:
C++語言認為函數(shù)是一個能完成某一獨立功能的副程式,也就是程式模組。
函數(shù)就是對複雜問題的一種“自頂向下,逐步求精”思想的體現(xiàn)。
編程者可以將一個大而複雜的程式分解為若干個相對獨立而且功能單一的小塊程式(函數(shù))進行編寫,並通過在各個函數(shù)之間進行調(diào)用,來實現(xiàn)總體的功能。
4.1函數(shù)概述
使用函數(shù)的優(yōu)點:(1)可讀性好;(2)易於查錯和修改;(3)便於分工編寫,分階段調(diào)試;(4)各個函數(shù)之間介面清晰,便於相互間交換資訊和使用;(5)節(jié)省程式代碼和存儲空間;(6)減少用戶總的工作量;(7)成為實現(xiàn)結(jié)構(gòu)程式設(shè)計思想的重要工具;(8)擴充語言和電腦的原設(shè)計能力;(9)便於驗證程式正確性。
設(shè)計C++程式的過程,實際上就是編寫函數(shù)的過程,至少也要編寫一個main()函數(shù)。 執(zhí)行C++程式,也就是執(zhí)行相應(yīng)的main()函數(shù)。即從main()函數(shù)的第一個左花括弧“{”開始,依次執(zhí)行後面的語句,直到最後一個右花括弧“}”為止。如果在執(zhí)行過程中遇到其他的函數(shù),則調(diào)用其他函數(shù)。調(diào)用完後,返回到剛才調(diào)用函數(shù)的下一條語句繼續(xù)執(zhí)行。而其他函數(shù)也只有在執(zhí)行main()函數(shù)的過程中被調(diào)用時才會執(zhí)行。
函數(shù)可以被一個函數(shù)調(diào)用,也可以調(diào)用另一個函數(shù),它們之間可以存在著調(diào)用上的嵌套關(guān)係。但是,C++不允許函數(shù)的定義嵌套,即在函數(shù)定義中再定義一個函數(shù)是非法的。
C++函數(shù)是一個獨立完成某個功能的語句塊,函數(shù)與函數(shù)之間通過輸入和輸出來聯(lián)繫。
4.2函數(shù)的定義與聲明
在C++程式中調(diào)用函數(shù)之前,首先要對函數(shù)進行定義。如果調(diào)用此函數(shù)在前,函數(shù)定義在後,就會產(chǎn)生編譯錯誤。 為了使函數(shù)的調(diào)用不受函數(shù)定義位置的影響,可以在調(diào)用函數(shù)前進行函數(shù)的聲明。這樣,不管函數(shù)是在哪里定義的,只要在調(diào)用前進行函數(shù)的聲明,就可以保證函數(shù)調(diào)用的合法性。4.2.1函數(shù)的定義
C++中的每一個函數(shù)都是從四個方面來進行定義:類型、函數(shù)名、形式參數(shù)表、函數(shù)體。 定義一個函數(shù)的語法格式為: 類型
函數(shù)名(形式參數(shù)表)
{
函數(shù)體;
}例如:intmax(inta,intb){intt;if(a>b)t=a;elset=b;returnt;}
類型就是該函數(shù)的類型,也就是該函數(shù)的返回值的類型,此類型可以是C++中除函數(shù)、數(shù)組類型之外的任何一個合法的數(shù)據(jù)類型,包括普通類型、指針類
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陶瓷插芯市場分析及競爭策略分析報告
- 珠光材料市場分析及競爭策略分析報告
- 農(nóng)村安置房合同范本
- 農(nóng)村山地合同范例
- 2004用工合同范本
- 植物保護模擬試題含參考答案
- 維修電工模擬練習(xí)題含答案
- 企業(yè)光纖租賃合同范本
- ppp項目股權(quán)合同范例
- 不予退款合同范本
- 2025年安徽職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫學(xué)生專用
- 2025年黑龍江農(nóng)墾職業(yè)學(xué)院單招職業(yè)傾向性測試題庫附答案
- 2025年黑龍江農(nóng)業(yè)工程職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整版
- 小學(xué)科學(xué)點亮我的小燈泡省公開課一等獎全國示范課微課金獎?wù)n件
- 2023-2024學(xué)年高中信息技術(shù)必修一滬科版(2019)第三單元項目六《 解決溫標(biāo)轉(zhuǎn)換問題-認識程序和程序設(shè)計語言》教學(xué)設(shè)計
- 浙江新陣地教育聯(lián)盟2025屆高三第二次聯(lián)考化學(xué)試題及答案
- 課件:以《哪吒2》為鏡借哪吒精神燃開學(xué)斗志
- 新生兒胃腸減壓護理
- 2024預(yù)防流感課件完整版
- 校園食品安全培訓(xùn)課件
- 六十四卦爻象全圖(彩色)(共6頁)
評論
0/150
提交評論