《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章_第1頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章_第2頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章_第3頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章_第4頁(yè)
《C++面向?qū)ο蟪绦蛟O(shè)計(jì)》課件第2章_第5頁(yè)
已閱讀5頁(yè),還剩200頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

2.1C++字符集和關(guān)鍵字

(C++CharacterSetandKeywords)

2.2基本數(shù)據(jù)類型和表達(dá)式

(BasicDataTypesandExpressions) 2.3運(yùn)算符與表達(dá)式(OperatorsandExpressions)2.4C++程序的基本控制結(jié)構(gòu)

(BasicControlStructureofC++Program)

2.5動(dòng)態(tài)內(nèi)存分配(DynamicStorageAllocation) 2.6常見編程錯(cuò)誤(CommonProgrammingErrors)本章小結(jié)(ChapterSummary)習(xí)題2(Exercises2)

2.1.1字符集(CharacterSet)

C++?語(yǔ)言的字符集由下列字符組成:

(1)?52個(gè)大小寫英文字母:a~z和A~Z。

(2)?10個(gè)數(shù)字字符:0~9。

(3)其他字符:空格、?!、#、%、^、&、*、?_(下劃線)等。2.1C++字符集和關(guān)鍵字(C++CharacterSetandKeywords)2.1.2標(biāo)識(shí)符(Identifier)

標(biāo)識(shí)符是程序設(shè)計(jì)人員用來(lái)對(duì)程序中的一些實(shí)體進(jìn)行標(biāo)識(shí)的一種單詞。它是由若干個(gè)字符組成的具有一定意義的最小詞法單元。通常使用標(biāo)識(shí)符來(lái)定義函數(shù)名、類名、對(duì)象名、變量名、常量名、類型名和語(yǔ)句標(biāo)號(hào)名等。C++?規(guī)定:標(biāo)識(shí)符是由大小寫字母、數(shù)字字符和下劃線符號(hào)組成的以字母或下劃線開頭的字符集合。2.1.3關(guān)鍵字(Keywords)

關(guān)鍵字用來(lái)說(shuō)明C++?語(yǔ)言中某一固定含義的字。例如,float是關(guān)鍵字,它用來(lái)說(shuō)明浮點(diǎn)類型的對(duì)象(變量)。下面是部分常用關(guān)鍵字:2.1.4其他標(biāo)識(shí)(OtherIdentifiers)

除了上面提到的標(biāo)識(shí)符和關(guān)鍵字以外,在程序中還會(huì)有以下幾種標(biāo)識(shí)。

1.常量

C++?語(yǔ)言中,常量分為數(shù)字常量、字符常量和字符串常量。

2.運(yùn)算符

運(yùn)算符是一些用來(lái)進(jìn)行某種操作的單詞,它實(shí)際上是系統(tǒng)預(yù)定義的函數(shù)名,這些函數(shù)作用于被操作的對(duì)象上將獲得一個(gè)結(jié)果值。

3.特定字

特定字是指具有特定含義的標(biāo)識(shí)符,主要有如下幾個(gè):

define、include、undef、ifdef、ifndef、endif、line、progma和error。

4.分隔符

分隔符被稱為程序中的標(biāo)點(diǎn)符號(hào),用來(lái)分隔單詞與程序正文,表示某個(gè)程序?qū)嶓w的結(jié)束和另一個(gè)程序?qū)嶓w的開始。

5.注釋符

注釋在程序中起對(duì)程序注解和說(shuō)明的作用,其目的是便于對(duì)程序進(jìn)行閱讀和分析。C++語(yǔ)言中的注釋方法如下兩種:

(1)使用“/*”和“*/”括起來(lái)進(jìn)行注釋,在“/*”和“*/”之間的所有字符都為注釋符。這種注釋方法適用于多行注釋信息的情況,是C語(yǔ)言中原有的注釋方法。

(2)使用“//”,從“//”后的字符開始,直到它所在行的行尾所有字符都被作為注釋信息。2.2.1C++?的基本數(shù)據(jù)類型(C++BasicDataTypes)

1.基本數(shù)據(jù)類型

C++?的基本數(shù)據(jù)類型有4種:整型(int)、浮點(diǎn)型(float)、字符型(char)、邏輯型(bool)。2.2基本數(shù)據(jù)類型和表達(dá)式(BasicDataTypesandExpressions)一個(gè)數(shù)據(jù)類型定義了數(shù)據(jù)(以變量或常量的形式來(lái)描述)可接受值的集合以及對(duì)它能執(zhí)行的操作。數(shù)據(jù)類型有3種主要用途:

①指明對(duì)該類型的數(shù)據(jù)應(yīng)分配多大的內(nèi)存空間;

②定義能用于該類型數(shù)據(jù)的操作;

③防止數(shù)據(jù)類型不匹配。C++?的數(shù)據(jù)類型如圖2-1所示。圖2-1C++?的數(shù)據(jù)類型

2.修飾符

在基本的數(shù)據(jù)類型前可以添加修飾符,以改變基本類型的意義。修飾符主要包括signed(有符號(hào))、unsigned(無(wú)符號(hào))、short(短型)和long(長(zhǎng)型)。

基本的數(shù)據(jù)類型及其表示范圍如表2-1所示。表2-1基本的數(shù)據(jù)類型及其表示范圍2.2.2常量(Constants)

常量就是指在程序運(yùn)行的整個(gè)過(guò)程中值始終保持不變的量。

1.整型常量

整型常量就是以文字形式出現(xiàn)的整數(shù),包括正整數(shù)、零、負(fù)整數(shù),其表示形式有十進(jìn)制、八進(jìn)制、十六進(jìn)制。

2.實(shí)型常量

C++?提供了兩種實(shí)型常量的表示形式:定點(diǎn)數(shù)形式、指數(shù)形式。

3.字符常量

字符常量由一對(duì)單引號(hào)括起的一個(gè)字符表示,其值為所括起字符在ASCII表中的編碼。

字符常量包括以下兩種類型:

(1)常規(guī)字符:?jiǎn)我?hào)括起的一個(gè)字符,如?'a'、'x'、'?'等。

(2)轉(zhuǎn)義字符:以?\?開頭的字符序列,如?\n、\b?等。常用的轉(zhuǎn)義字符如表2-2所示。表2-2常用的轉(zhuǎn)義字符

4.字符串常量

字符串常量是由一對(duì)雙引號(hào)括起的字符序列,字符序列中可以包含空格、轉(zhuǎn)義序列或任何其他字符。例如:

“C++isabetterC\n”

需要注意的是?'a'?和?"a"?的區(qū)別,'a'?是一個(gè)字符常量,在內(nèi)存中占一個(gè)字節(jié)的存儲(chǔ)單元,而?"a"?是一個(gè)字符串常量,在內(nèi)存中占兩個(gè)字節(jié),除了存儲(chǔ)?'a'?以外,還要存儲(chǔ)字符串結(jié)尾符?'\0'。表2-3所示為字符常量與字符串常量的區(qū)別。表2-3字符常量與字符串常量的區(qū)別

5.布爾常量

布爾(bool)常量?jī)H有兩個(gè):true(真)和false(假)。通常以1表示真,0表示假。

6.枚舉常量

枚舉指一一列舉變量的值,變量的值只能從所列舉的值中取其一。

枚舉聲明:

enum<枚舉名>{<枚舉表>};2.2.3變量(Variables)

在程序運(yùn)行過(guò)程中,其值可以被改變的量稱為變量。

1.變量的聲明

變量的命名規(guī)則:變量名是只能由英文字母、十進(jìn)制數(shù)字符號(hào)和下劃線組成的字符序列,該序列只能以字母或下劃線開頭。變量有以下三個(gè)特征:

(1)每一個(gè)變量有一個(gè)變量名。

(2)每一個(gè)變量有一個(gè)類型。

(3)每一個(gè)變量保存一個(gè)值。

變量在使用之前需要先聲明其類型和名稱。

變量聲明語(yǔ)句的形式如下:

數(shù)據(jù)類型變量名1,變量名2,…,變量名n;

2.變量賦值與初始化

在聲明變量的同時(shí),可以給它賦以初值,稱為變量初始化。賦值形式如下:

數(shù)據(jù)類型標(biāo)識(shí)符1(初始值1),…,標(biāo)識(shí)符n(初始值n);

數(shù)據(jù)類型標(biāo)識(shí)符1=初始值1,…,標(biāo)識(shí)符n=初始值n;

3.整型變量

整型變量可分為有符號(hào)短整型、無(wú)符號(hào)短整型、有符號(hào)整型、無(wú)符號(hào)整型、有符號(hào)長(zhǎng)整型、無(wú)符號(hào)長(zhǎng)整型。

注意:對(duì)變量的定義一般放在一個(gè)函數(shù)的開頭部分。

4.實(shí)型變量

C++?語(yǔ)言的實(shí)型變量可分為以下兩種:

(1)單精度型:類型關(guān)鍵字為float,一般占4個(gè)字節(jié)。

(2)雙精度型:類型關(guān)鍵字為double,一般占8個(gè)字節(jié)。

例如:

floatx,y; //指定x、y為單精度實(shí)型變量

doublew; //指定w為雙精度實(shí)型變量

5.字符變量

字符變量用來(lái)存儲(chǔ)字符常量。注意:每個(gè)字符變量只能存放一個(gè)字符,一般一個(gè)字節(jié)存放一個(gè)字符,即一個(gè)字符變量在內(nèi)存中占一個(gè)字節(jié)。將一個(gè)字符常量放到一個(gè)字符變量中,并不是把該字符本身放到內(nèi)存單元中,而是將該字符的ASCII碼值(無(wú)符號(hào)整數(shù))以二進(jìn)制的形式存儲(chǔ)到內(nèi)存單元中。字符變量的類型關(guān)鍵字為char。

【例2-1】

字符類型與數(shù)值類型間的轉(zhuǎn)換。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{

charch1,ch2; //定義兩個(gè)字符變量:ch1,ch2

ch1='a'; //給字符變量ch1賦值字母a

ch2='b'; //給字符變量ch2賦值字母b

cout<<"ch1="<<ch1<<'\t'<<"ch2="<<ch2<<"\n";

cout<<"ch1="<<(int)ch1<<"ch2="<<(int)ch2<<"\n";

//(int)類型強(qiáng)制轉(zhuǎn)換為整型

return0;

}運(yùn)行結(jié)果:

ch1=ach2=b

ch1=97ch2=98

C++?語(yǔ)言還允許對(duì)字符型數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,此時(shí)就是對(duì)它們的ASCII碼值進(jìn)行算術(shù)運(yùn)算。字符型數(shù)據(jù)與整型數(shù)據(jù)可以互相賦值。

【例2-2】

字符型數(shù)據(jù)與整型數(shù)據(jù)互相賦值。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{

charch1,ch2;

ch1='a';ch2='b';

ch1=ch1-32; //字符型數(shù)據(jù)ch1減掉32再重新賦給ch1

ch2=ch2-32; //字符型數(shù)據(jù)ch2減掉32再重新賦給ch2

printf("ch1=%c,ch2=%c\n",ch1,ch2);

printf("ch1=%d,ch2=%d\n",ch1,ch2);

return0;

}

運(yùn)行結(jié)果:

ch1=Ach2=B

ch1=97ch2=982.2.4表達(dá)式(Expressions)

表達(dá)式是計(jì)算求值的基本單位,它是由運(yùn)算符和運(yùn)算數(shù)組成的式子。運(yùn)算符是表示進(jìn)行某種運(yùn)算的符號(hào),運(yùn)算數(shù)包含常量、變量和函數(shù)等。

(1)一個(gè)表達(dá)式的值可以用來(lái)參與其他操作。

(2)一個(gè)常量或標(biāo)識(shí)對(duì)象的標(biāo)識(shí)符是一個(gè)最簡(jiǎn)單的表達(dá)式,其值是常量或?qū)ο蟮闹?。運(yùn)算符就是對(duì)數(shù)據(jù)(也稱操作數(shù),可以是常量或變量)進(jìn)行指定操作、運(yùn)算并產(chǎn)生新值的特殊符號(hào)。

C++?語(yǔ)言的運(yùn)算符按其在表達(dá)式中與運(yùn)算對(duì)象的關(guān)系(連接運(yùn)算對(duì)象的個(gè)數(shù))可分為以下三類:

(1)單目運(yùn)算(一元運(yùn)算符,只需一個(gè)操作數(shù));

(2)雙目運(yùn)算(二元運(yùn)算符,需兩個(gè)操作數(shù));

(3)三目運(yùn)算(三元運(yùn)算符,需三個(gè)操作數(shù))。2.3運(yùn)算符與表達(dá)式(OperatorsandExpressions)左值(leftvalue,簡(jiǎn)寫為lvalue)是指只能出現(xiàn)在賦值表達(dá)式左邊的表達(dá)式。左值表達(dá)式具有存放數(shù)據(jù)的空間,而且存放是允許的。例如:

inta=3; //a是變量,所以a是左值

constintb=4; //b是常量,所以b不是左值

右值(rightvalue,簡(jiǎn)寫為rvalue)是指只能出現(xiàn)在賦值表達(dá)式右邊的表達(dá)式。左值表達(dá)式也可以作為右值表達(dá)式。例如:

inta,b=6;

a=b; //b是變量,所以是左值,此處作為右值

a=8; //8是常量,只能作右值,不能作為左值表達(dá)式可產(chǎn)生左值、右值或不產(chǎn)生值。例如:

inta;

(a=4)=28;

//a=4是左值表達(dá)式,可以被賦以值28

/*28是右值表達(dá)式,而a=4是左值表達(dá)式(C++?的語(yǔ)法規(guī)定),所以可以放在賦值語(yǔ)句的左邊。該語(yǔ)句表示將剛剛賦給a的值4用28代替*/2.3.1算術(shù)運(yùn)算符與算術(shù)表達(dá)式

(ArithmeticOperatorsandArithmeticExpressions)

算術(shù)運(yùn)算符在編寫程序中是最常用的一種運(yùn)算符。

1.算術(shù)運(yùn)算符

算術(shù)運(yùn)算符有雙目運(yùn)算和單目運(yùn)算兩種,包括:

(1)?+:加法運(yùn)算符,也稱正值運(yùn)算符,如12+2、+8。(2)-:減法運(yùn)算符,也稱負(fù)值運(yùn)算符,如56-2、-8。

(3)*:乘法運(yùn)算符,如3*7。

(4)?/:除法運(yùn)算符,如2/5。

(5)?%:模運(yùn)算符,也稱求余運(yùn)算符,如7%3=1。

2.算術(shù)表達(dá)式

算術(shù)表達(dá)式是由數(shù)值運(yùn)算符和位操作運(yùn)算符組成的表達(dá)式。算術(shù)表達(dá)式的值是一個(gè)數(shù)值。算術(shù)表達(dá)式的類型由運(yùn)算符和運(yùn)算數(shù)確定。例如,a+3*(b/2)就是一個(gè)算術(shù)表達(dá)式。

3.算術(shù)類型轉(zhuǎn)換

C++中算術(shù)類型轉(zhuǎn)換有兩類,即隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。

隱式類型轉(zhuǎn)換按從低到高的順序進(jìn)行,如圖2-2所示。圖2-2隱式類型轉(zhuǎn)換

2)顯式類型轉(zhuǎn)換

顯式類型轉(zhuǎn)換是由程序員顯式指出的類型轉(zhuǎn)換,其轉(zhuǎn)換形式有以下兩種:

類型名(表達(dá)式)

(類型名)表達(dá)式

這里的“類型名”是指任何合法的C++?數(shù)據(jù)類型,如float、int等。通過(guò)類型的顯式轉(zhuǎn)換可以將“表達(dá)式”轉(zhuǎn)換成適當(dāng)?shù)念愋?。例如,“doublef=3.6;”將f轉(zhuǎn)換成int類型可以寫成“intn=(int)f;”,這樣n為3。2.3.2關(guān)系運(yùn)算與邏輯運(yùn)算

(RelationOperateandLogicOperate)

1.關(guān)系運(yùn)算符

C++提供了一組關(guān)系運(yùn)算符,以實(shí)現(xiàn)對(duì)數(shù)據(jù)的關(guān)系比較。C++中的關(guān)系運(yùn)算符如下:

<(小于),<=(小于等于),>(大于),

>=(大于等于), ==(等于),!=(不等于)

2.邏輯運(yùn)算符

邏輯運(yùn)算符用于進(jìn)行復(fù)雜的邏輯判斷。邏輯運(yùn)算符的操作數(shù)類型為bool型,其返回類型亦為bool型。C++?中的邏輯運(yùn)算符如下:

&&(邏輯與),||(邏輯或),!(邏輯非)

注意:

(1)邏輯表達(dá)式的結(jié)果為真則為1,結(jié)果為假則為0。

(2)邏輯非(!)是單目運(yùn)算符,邏輯與(&&)與邏輯或(||)為雙目運(yùn)算符。

(3)邏輯非的優(yōu)先級(jí)最高,邏輯與次之,邏輯或最低。

C++?中邏輯運(yùn)算的真值表如表2-4所示。表2-4C++中邏輯運(yùn)算的真值表

(4)?C++對(duì)于二元運(yùn)算符&&和||可進(jìn)行短路求值(short-circuitevaluation)。由于&&與||表達(dá)式按從左到右的順序進(jìn)行計(jì)算,因此如果根據(jù)左邊的計(jì)算結(jié)果能得到整個(gè)邏輯表達(dá)式的結(jié)果,那么右邊的計(jì)算就不需要進(jìn)行了,該規(guī)則叫短路求值。①當(dāng)多個(gè)表達(dá)式用&&連接時(shí),若一個(gè)為假,則整個(gè)連接為假。

例如:

intn=3,m=6;

if(n>4&&m++<10)

cout<<“mshouldnotchanged.\n”;

cout<<“m=”<<m<<endl;

輸出結(jié)果為m=6。②當(dāng)多個(gè)表達(dá)式用?||?連接時(shí),若一個(gè)為真,則整個(gè)連接為真。

例如:

inti=l,j;

則表達(dá)式i++||i++||i++的值為1(真),運(yùn)算結(jié)束后,變量i的值為2,而不是4。因?yàn)檫M(jìn)行第一個(gè)i++運(yùn)算時(shí),其值為1(真),這時(shí)整個(gè)邏輯表達(dá)式的值為真已能確定,所以就不再進(jìn)行后面的計(jì)算了。因此,變量只進(jìn)行了一次自加運(yùn)算,其值為2。2.3.3賦值運(yùn)算符與賦值表達(dá)式

(Assignment

OperatorandAssignmentExpression)

賦值運(yùn)算用于實(shí)現(xiàn)對(duì)變量的賦值,即為已聲明的變量賦一個(gè)特定值。C++中的賦值運(yùn)算符除了對(duì)變量進(jìn)行賦值以外,作為一種運(yùn)算符,還具有運(yùn)算的結(jié)果。賦值運(yùn)算符是雙目運(yùn)算符。

1.賦值運(yùn)算

(1)賦值運(yùn)算符“=”的一般格式如下:

變量=表達(dá)式;

表示將其右側(cè)的表達(dá)式求出結(jié)果,賦給其左側(cè)的變量。例如:

inti;

i=3*(4+5); //i的值變?yōu)?7

(2)賦值表達(dá)式本身的運(yùn)算結(jié)果是右側(cè)表達(dá)式的值,而結(jié)果類型是左側(cè)變量的數(shù)據(jù)類型。例如:

inti=1.2*3; //結(jié)果為3,而不是3.6

(3)賦值運(yùn)算符的結(jié)合性是從右至左的,因此,C++程序中可以出現(xiàn)連續(xù)賦值的情況。例如,下面的賦值是合法的:

inti,j,k;

i=j=k=10; //i、j、k都賦值為10

(4)復(fù)合運(yùn)算符如下:

+=?(加賦值):a+=b等價(jià)于a=a+b。

-=?(減賦值):a-=b等價(jià)于a=a-b。*=?(乘賦值):a*=b等價(jià)于a=a*b。

/=?(除賦值):a/=b等價(jià)于a=a/b。

%=?(取模賦值):a%=b等價(jià)于a=a%b。

<<=?(左移賦值):a<<=b等價(jià)于a=a<<b。

>>=?(右移賦值):a>>=b等價(jià)于a=a>>b。

&=?(與賦值):a&=b等價(jià)于a=a&b。

^=?(異或賦值):a^=b等價(jià)于a=a^b。

|=?(或賦值):a|=b等價(jià)于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=0

2.自增與自減運(yùn)算符

自增(++)、自減(--)運(yùn)算符是C++

中使用效率很高的兩個(gè)運(yùn)算符,且都是單目運(yùn)算符,為變量的增1和減1提供了緊湊格式。自增、自減運(yùn)算符有以下四種應(yīng)用格式:

inta=3;b=a++; 等價(jià)于

b=a;a=a+1;

inta=3;b=a--; 等價(jià)于 b=a;a=a-1;

inta=3;b=++a; 等價(jià)于 a=a+1;b=a;

inta=3;b=--a; 等價(jià)于 a=a-1;b=a;在調(diào)用函數(shù)時(shí),實(shí)參的求值順序一般為自右向左。

例如:

inta=1;

printf(“%d,%d,%d”,a++,a++,a++);

輸出的結(jié)果為3,2,1,而不是1,2,3。

由于?++、--?運(yùn)算符內(nèi)含了賦值運(yùn)算,所以運(yùn)算對(duì)象只能作用于左值,不能作用于常量和表達(dá)式。例如,5++、(x+y)++?都是不合法的。

【例2-3】自增、自減運(yùn)算符的用法與運(yùn)算規(guī)則示例。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{

intx=6,y;cout<<"x="<<x<<endl; //輸出x的初值

y=++x; //前置運(yùn)算,x的值先增1,再賦值給y

cout<<"x="<<x<<"y="<<y<<endl;

y=x--; //后置運(yùn)算,x先賦值給y,再增1

cout<<"x="<<x<<"y="<<y<<endl;

return0;

}運(yùn)行結(jié)果:

x=6

x=7y=7

x=6y=72.3.4條件運(yùn)算符與逗號(hào)表達(dá)式

(ConditionOperatorandCommaExpression)

1.條件運(yùn)算符

在C++中只提供了一個(gè)三目運(yùn)算符,即條件運(yùn)算符“?:”,其一般形式如下:

表達(dá)式1?表達(dá)式2:表達(dá)式3

條件運(yùn)算的運(yùn)算規(guī)則是:首先判斷表達(dá)式1的值,若其值為真(非0),則取表達(dá)式2的值為整個(gè)表達(dá)式的值;若其值為假(0),則取表達(dá)式3的值為整個(gè)表達(dá)式的值。

【例2-4】

用條件運(yùn)算符判斷成績(jī)是否及格。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{

intscore; cout<<“請(qǐng)輸入一個(gè)成績(jī):”;

cin>>score;

cout<<"該成績(jī)"<<(score>=60?"及格":"不及格")<<endl;

return0;

}

運(yùn)行結(jié)果:

請(qǐng)輸入一個(gè)成績(jī):90

該成績(jī)及格

2.逗號(hào)表達(dá)式

逗號(hào)運(yùn)算符用于將多個(gè)表達(dá)式連在一起,并按各表達(dá)式從左到右的順序依次求值,但只有其最右端的表達(dá)式的結(jié)果作為整個(gè)逗號(hào)表達(dá)式的結(jié)果。逗號(hào)表達(dá)式的一般格式如下:

表達(dá)式1,表達(dá)式2,…,表達(dá)式n

例如:

inta=3,b=4,c=5;

a+b,b+c,c+a;

表示先求解a+b,再求解b+c,最后求解c+a,整個(gè)表達(dá)式的結(jié)果為c+a的結(jié)果。2.3.5表達(dá)式的副作用和表達(dá)式語(yǔ)句

(Expression

Side-EffectandExpressionStatement)

1.運(yùn)算符的優(yōu)先級(jí)

運(yùn)算符的優(yōu)先級(jí)決定了表達(dá)式中各個(gè)運(yùn)算符執(zhí)行的先后順序。若同一優(yōu)先級(jí)的優(yōu)先級(jí)別相同,則運(yùn)算次序由結(jié)合方向決定。對(duì)于表達(dá)式:

exp1+exp2;

先計(jì)算exp1還是exp2,不同的編譯器有不同的做法。在C++?中,對(duì)簡(jiǎn)單的表達(dá)式,交換律是成立的,但對(duì)復(fù)合表達(dá)式,交換律未必成立。例如:

c=a*b+++b;與

c=++b+a*b;

在VC++中,前者的運(yùn)行結(jié)果為21,后者為24。

在表達(dá)式中,括號(hào)的優(yōu)先級(jí)是最高的。C++?中,對(duì)于簡(jiǎn)單的表達(dá)式,括號(hào)優(yōu)先可以做到,但復(fù)合表達(dá)式未必如此,值順序使括號(hào)失去作用。例如:

inta=3,b=5,c;

c=++b*(a+b);

2.求值次序與副作用

在數(shù)學(xué)上,對(duì)于雙目運(yùn)算符,不論先計(jì)算哪一個(gè)操作數(shù),都要求最終的計(jì)算結(jié)果一樣。

C++中規(guī)定,應(yīng)先計(jì)算邏輯與(&&)和邏輯或(||)的第一個(gè)操作數(shù),再計(jì)算第二個(gè)操作數(shù),以便進(jìn)行短路求值。條件(?:)、逗號(hào)(,)運(yùn)算符也規(guī)定了操作數(shù)的計(jì)算次序。

3.副作用的消除

在前面例子中產(chǎn)生歧義的原因主要是?++x。++x具有變量x的修改(副作用)和提供表達(dá)式值兩個(gè)操作。同樣,賦值表達(dá)式也會(huì)引起副作用。例如:

inta,b=20;

a=(b=25)+b;2.4.1程序的結(jié)構(gòu)與控制

(ProgramStructureandControl)

1.程序結(jié)構(gòu)

結(jié)構(gòu)化程序設(shè)計(jì)強(qiáng)調(diào)程序設(shè)計(jì)風(fēng)格和程序結(jié)構(gòu)的規(guī)范化,規(guī)定了幾種具有良好特性的“基本結(jié)構(gòu)”,將它們作為構(gòu)成程序的基本單元,每一種基本結(jié)構(gòu)可以包含一個(gè)或多個(gè)語(yǔ)句。2.4C++程序的基本控制結(jié)構(gòu)(BasicControlStructureofC++Program)

1)順序結(jié)構(gòu)

順序結(jié)構(gòu)中,A和B兩個(gè)框是順序執(zhí)行的,即在執(zhí)行完A框所指定的操作后,必然接著執(zhí)行B框所指定的操作,如圖2-3所示。圖2-3順序結(jié)構(gòu)

2)選擇結(jié)構(gòu)

選擇結(jié)構(gòu)中必包含一個(gè)判斷框,根據(jù)給定的條件P是否成立而選擇執(zhí)行A框或B框,即無(wú)論條件P是否成立,只能執(zhí)行A框或B框,如圖2-4所示。當(dāng)然,A或B可以有一個(gè)是空的,如圖2-5所示。

圖2-4選擇結(jié)構(gòu)(一)圖2-5選擇結(jié)構(gòu)(二)

3)循環(huán)結(jié)構(gòu)

(1)當(dāng)型(while型)循環(huán)結(jié)構(gòu)。

當(dāng)型循環(huán)結(jié)構(gòu)中,在執(zhí)行while語(yǔ)句時(shí),首先計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),執(zhí)行循環(huán)體語(yǔ)句,然后重復(fù)上述過(guò)程,直到循環(huán)條件表達(dá)式的值為假(0)時(shí),循環(huán)結(jié)束,程序控制轉(zhuǎn)至while循環(huán)語(yǔ)句的下一語(yǔ)句,如圖2-6所示。

(2)直到型(until型)循環(huán)結(jié)構(gòu)。

直到型循環(huán)結(jié)構(gòu)中,do…while語(yǔ)句首先執(zhí)行循環(huán)體一次,再判別表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán),如圖2-7所示。圖2-6當(dāng)型循環(huán)結(jié)構(gòu)

圖2-7直到型循環(huán)結(jié)構(gòu)

2.控制語(yǔ)句

控制語(yǔ)句用以完成一定的控制功能,C++有9種控制語(yǔ)句,分別如下:

(1)?if()…else…:條件語(yǔ)句。

(2)?for()…:循環(huán)語(yǔ)句。

(3)?while()…:循環(huán)語(yǔ)句。

(4)?do…while():循環(huán)語(yǔ)句。

(5)?switch:多分支選擇語(yǔ)句。

(6)?continue:結(jié)束本次循環(huán)。

(7)?break:終止switch或循環(huán)語(yǔ)句。

(8)?return:返回語(yǔ)句。

(9)?goto:轉(zhuǎn)向語(yǔ)句。2.4.2順序結(jié)構(gòu)程序設(shè)計(jì)

(SequenceStructureProgramming)

所謂順序結(jié)構(gòu),就是指按照語(yǔ)句在程序中的先后次序一條一條地順次執(zhí)行。順序控制語(yǔ)句是一類簡(jiǎn)單的語(yǔ)句,它包括表達(dá)式語(yǔ)句、輸入/輸出等。

1.?dāng)?shù)據(jù)的輸入和輸出

C++語(yǔ)言不提供輸入、輸出語(yǔ)句,而是提供一個(gè)面向?qū)ο蟮腎/O軟件包,用I/O流類庫(kù)來(lái)實(shí)現(xiàn)數(shù)據(jù)的輸入和輸出。

2.I/O的基本格式

1)輸入語(yǔ)句

當(dāng)程序需要執(zhí)行鍵盤輸入時(shí),可以使用抽取操作符“>>”從輸入流cin中抽取鍵盤輸入的字符和數(shù)字,并把它們賦給指定的變量。cin用于輸入流操作,與抽取操作符“>>”配合可以實(shí)現(xiàn)從鍵盤輸入數(shù)據(jù)。

輸入語(yǔ)句的一般格式如下:

cin>><變量名1>[>><變量名2>>>…>><變量名n>];例如:

#include<iostream>

usingnamespacestd;

intmain()

{

inta;

cin>>a;

return0;

}

2)輸出語(yǔ)句

當(dāng)程序需要在屏幕上顯示輸出時(shí),可以使用插入操作符“<<”向輸出流cout中插入字符和數(shù)字,并把它們顯示在屏幕上。cout用于輸出流操作,與插入操作符“<<”配合可以實(shí)現(xiàn)向屏幕輸出數(shù)據(jù)。

輸出語(yǔ)句的一般格式如下:

cout<<<表達(dá)式1>[<<<表達(dá)式2><<…<<<表達(dá)式n>];例如:

#include<iostream>

usingnamespacestd;

intmain()

{

cout<<"Hello.\n";

return0;

}

cout<<“hello”;

cout<<3;

cout<<endl;

等價(jià)于

cout<<“hello”<<3<<endl;

也等價(jià)于

cout<<“hello" //注意:行末無(wú)分號(hào)

<<3 //行末無(wú)分號(hào)

<<endl;

3)?I/O流的常用控制符

用控制符(manipulators)可以對(duì)I/O流的格式進(jìn)行控制。C++?在頭文件iomanip.h中定義了控制符對(duì)象,可以直接將這些控制符嵌入到I/O語(yǔ)句中進(jìn)行格式控制。在使用這些控制符時(shí),要在程序的開頭包含頭文件iomanip.h。表2-5列出了I/O流的常用控制符。表2-5I/O流的常用控制符

【例2-5】

使用格式控制字符控制不同進(jìn)制的輸出示例。

程序如下:

#include<iostream>

usingnamespacestd;

#include<iomanip.h>

voidmain()

{

inta=27;

floatx=3.14;cout<<"a="<<oct<<a<<"a="<<hex<<a<<endl;

//分別以八進(jìn)制和十六進(jìn)制的形式輸出a

cout<<"x="<<x<<setw(10)<<"x="<<x<<endl;

cout<<setiosflags(ios::fixed)<<"x="<<x<<endl;

}

運(yùn)行結(jié)果:

a=33

a=1b

x=3.14x=3.14

x=3.140000

【例2-6】

使用格式控制字符控制輸出寬度和空位填充示例。

程序如下:

#include<iostream>

usingnamespacestd;

#include<iomanip.h>//setfill在頭文件iomanip.h中定義

voidmain()

{

cout<<setfill('%')<<setw(3)<<11<<endl<<setw(5)<<11<<endl;

cout<<setfill('');

}

運(yùn)行結(jié)果:

%11

%%%11

【例2-7】使用格式控制字符控制輸出精度和正、負(fù)號(hào)的顯示示例。

程序如下:

#include<iostream>

usingnamespacestd;

#include<iomanip.h>

voidmain()

{

doublea=1.234567;

cout<<setprecision(3)<<a<<endl;

cout<<20.0/4<<endl;

cout<<setiosflags(ios::showpoint)<<20.0/4<<endl; //強(qiáng)制顯示小數(shù)點(diǎn)

cout<<20<<""<<-30<<endl;

cout<<setiosflags(ios::showpos)<<20<<""<<-30<<endl; //強(qiáng)制顯示符號(hào)

}運(yùn)行結(jié)果:

1.23

5

5.00

20-30

+20-30

【例2-8】

使用格式控制字符控制左右對(duì)齊示例。

程序如下:

#include<iostream>

usingnamespacestd;

#include<iomanip.h>

voidmain()

{cout<<setiosflags(ios::right)<<setw(4)<<4<<setw(4)<<5<<endl;

//右對(duì)齊

cout<<setiosflags(ios::left)<<setw(4)<<6<<setw(4)<<7<<endl;

//左對(duì)齊

}

運(yùn)行結(jié)果:

45

67

3.字符輸入、輸出函數(shù)

1)字符輸入函數(shù)getch()、getche()和getchar()

getch():直接從鍵盤接收一個(gè)字符,如charc1;c1=getch();表示將一個(gè)從鍵盤輸入的字符賦給字符型變量c1,在屏幕上不回顯該字符。

getche():直接從鍵盤接收一個(gè)字符,并在屏幕上回顯該字符。

getchar():從鍵盤接收一個(gè)字符,并在屏幕上回顯該字符,在按回車鍵后該字符才進(jìn)入內(nèi)存。

【例2-9】

輸入、輸出函數(shù)示例。

程序如下:

#include<iostream>

usingnamespacestd;

#include<conio.h>

voidmain()

{charc1;

c1=getch();

cout<<"c1="<<c1<<endl;

c1=getche();

cout<<"c1="<<c1<<endl;

c1=getchar();

cout<<"c1="<<c1<<endl;

}運(yùn)行結(jié)果:

c1=A

Bc1=B

C

c1=C

注意:

(1)當(dāng)使用getchar()時(shí),必須將有關(guān)的頭文件stdio.h包含進(jìn)源文件。

(2)當(dāng)使用getch()、getche()時(shí),必須將有關(guān)的頭文件conio.h包含進(jìn)源文件。

2)字符輸出函數(shù)putch()和putchar()

putch()和putchar()的功能是在屏幕上以字符形式顯示字符變量ch。例如:

charc1='M';

putch(c1);/*在屏幕上顯示字符M,這里將putch()換成putchar()其結(jié)果是一樣的*/

4.順序結(jié)構(gòu)程序舉例

【例2-10】

編寫程序計(jì)算圓的面積s和周長(zhǎng)l。

#include<iostream>

usingnamespacestd;

constfloatPI=3.14159;

voidmain()

{floats,l,r;

cout<<"PleaseInputr∶";

cin>>r;

s=PI*r*r;

l=2*PI*r;

cout<<"r="<<r<<"s="<<s<<"l="<<l<<endl;

}

運(yùn)行結(jié)果:

PleaseInputr:10

r=10s=314.159l=62.8381

【例2-11】

從鍵盤上輸入一個(gè)三位數(shù),然后逆序輸出。例如,輸入123,輸出321。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{

intn,i,j,k;

cin>>n;i=n/100; //求百位上的數(shù)字

n=n-i*100;

j=n/10; //求十位上的數(shù)字

n=n-j*10; //求個(gè)位上的數(shù)字

k=n;

cout<<"逆序數(shù)為:"<<k<<j<<i<<endl;

}

運(yùn)行結(jié)果:

123

逆序數(shù):

321

【例2-12】

已知三角形的兩邊A、B及其夾角alfa,求第三邊C及面積S。

分析:根據(jù)三角形公式可知:程序如下:

#include<iostream>

#include<math.h>

#definePI3.1415926

usingnamespacestd:

voidmain()

{floatA,B,C,S,alfa;

cin>>A>>B>>alfa;

alfa=alfa*PI/180;

C=sqrt(A*A+B*B-2*A*B*cos(alfa));

S=0.5*A*B*sin(alfa);

cout<<"A="<<A<<"B="<<B<<"alfa="<<alfa<<endl;

cout<<"第三邊長(zhǎng)C="<<C<<"面積S="<<S<<endl;

}運(yùn)行時(shí)輸入為:124330<CR>

運(yùn)行結(jié)果:

A=12B=43alfa=0.532599

第三邊長(zhǎng)C=33.1551,面積S=1292.4.3選擇結(jié)構(gòu)程序設(shè)計(jì)

(BranchingStructureProgramming)

通常計(jì)算機(jī)程序是按語(yǔ)句在程序中書寫的順序來(lái)執(zhí)行的,然而在許多情況下,語(yǔ)句執(zhí)行的順序需要依賴于輸入的數(shù)據(jù)或表達(dá)式的值。

1.條件語(yǔ)句

1)?if語(yǔ)句

if語(yǔ)句的語(yǔ)法格式為:

if(條件表達(dá)式)

語(yǔ)句;

if(條件表達(dá)式)

{

語(yǔ)句序列;

}

【例2-13】

讀入三個(gè)數(shù),按從小到大的順序把它們打印出來(lái)。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{

doublea,b,c,t;

cout<<"請(qǐng)輸入三個(gè)數(shù):\n";cin>>a>>b>>c;

if(a>b)

{

t=a;a=b;b=t;

}

if(a>c)

{

t=a;a=c;c=t;

} if(b>c)

{

t=b;b=c;c=t;

}

cout<<a<<"\t"<<b<<"\t"<<c<<endl;

}

2)空語(yǔ)句

編譯器必須在if條件表達(dá)式的后面找到一個(gè)作為語(yǔ)句結(jié)束符的分號(hào)“;”,以標(biāo)志if語(yǔ)句的結(jié)束。例如,下面的代碼:

if(條件表達(dá)式);//空語(yǔ)句作if中的語(yǔ)句

語(yǔ)句;

表示不管條件表達(dá)式為真或假,總是接著執(zhí)行分號(hào)后的語(yǔ)句,即相當(dāng)于if語(yǔ)句不做任何事。

3)if…else語(yǔ)句

if…else語(yǔ)句的語(yǔ)法格式如下:

if(條件表達(dá)式)

{

語(yǔ)句序列1;

}

else

{

語(yǔ)句序列2;

}

【例2-14】判斷鍵盤輸入的整數(shù)是否為偶數(shù),若是則輸出is,若不是則輸出not。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{

intx;

cout<<“請(qǐng)輸入一個(gè)整數(shù):\n”;

cin>>x;

if(x%2==0)cout<<“is”<<endl;

elsecout<<"not"<<endl;

}

4)語(yǔ)句嵌套

當(dāng)多個(gè)if…else語(yǔ)句嵌套時(shí),為了防止出現(xiàn)二義性,C++?語(yǔ)言規(guī)定,由后向前使每一個(gè)else都與其前面最靠近它的if配對(duì)。如果一個(gè)else的上面又有一個(gè)未經(jīng)配對(duì)的else,則先處理上面的(內(nèi)層的)else的配對(duì)。當(dāng)多個(gè)if…else語(yǔ)句嵌套時(shí),在容易誤解的地方可以按照語(yǔ)法關(guān)系加上花括號(hào)來(lái)標(biāo)識(shí)邏輯關(guān)系的正確性。上例可以改寫如下:

if(a>b)

{

if(a>c)

max=a;

else

max=c;

}else

{

if(b>c)

max=b;

else

max=c;

}

【例2-15】

求一元二次方程ax2+bx+c=0的根。其中,系數(shù)a(a?≠?0)、b、c的值由鍵盤輸入。

程序如下:

#include<iostream>

usingnamespacestd;

#include<math.h>

voidmain()

{floata,b,c,delta,x1,x2;

constfloatzero=0.0001;

cout<<"輸入三個(gè)系數(shù)a(a!=0),b,c:"<<endl;

cin>>a>>b>>c;

cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl;

delta=b*b-4*a*c;

if(fabs(delta)<zero)

{cout<<"方程有兩個(gè)相同實(shí)根:";

cout<<"x1=x2="<<-b/(2*a)<<endl;

}

elseif(delta>0)

{

delta=sqrt(delta);

x1=(-b+delta)/(2*a);

x2=(-b-delta)/(2*a);cout<<"方程有兩個(gè)不同實(shí)根:";

cout<<"x1="<<x1<<'\t'<<"x2="<<x2<<endl;

}

elsecout<<"方程無(wú)實(shí)根!";//delta<0

}

運(yùn)行結(jié)果:

輸入三個(gè)系數(shù)a(a!=0),b,c:

1-812

a=1b=-8c=12

方程有兩個(gè)不同實(shí)根:x1=6x2=2

2.switch語(yǔ)句

switch語(yǔ)句是多分支的選擇語(yǔ)句。嵌套的if語(yǔ)句可以處理多分支選擇,但是用switch語(yǔ)句更加直觀。

switch語(yǔ)句的語(yǔ)法格式如下:

switch(整數(shù)表達(dá)式)

{

case常量表達(dá)式1:<語(yǔ)句序列1>;

case常量表達(dá)式2:<語(yǔ)句序列2>;

…case常量表達(dá)式n:<語(yǔ)句序列n>;

default:<語(yǔ)句序列n+1>;

}

switch語(yǔ)句的執(zhí)行流程如圖2-8所示。圖2-8switch語(yǔ)句的執(zhí)行流程

【例2-16】

根據(jù)考試成績(jī)的等級(jí)輸出百分制分?jǐn)?shù)段。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{

chargrade;

cout<<“請(qǐng)輸入成績(jī)等級(jí):\n”;

cin>>grade;

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;

}

}

運(yùn)行結(jié)果:

A

85~100

【例2-17】

編寫一個(gè)四則運(yùn)算計(jì)算器程序輸入兩個(gè)數(shù)和一個(gè)四則運(yùn)算符,輸出運(yùn)算結(jié)果。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{

floatoperandl,operand2,result;

charoperato;

cin>>operandl>>operato>>operandswitch(operato)//由operato的值決定執(zhí)行哪一條case語(yǔ)句

{

case'+': result=operandl+operand2;

cout<<"result="<<result<<endl; break;

case'-': result=operandl-operand2;

cout<<"result="<<result<<endl; break;

case'*': result=operandl*operand2;

cout<<"result="<<result<<endl; break;

case'/': result=operandl/operand2;

cout<<"result="<<result<<endl; break;

default: cout<<"Illegaloperato,error!\n";

}

}

運(yùn)行結(jié)果:

18*3

result=542.4.4循環(huán)結(jié)構(gòu)程序設(shè)計(jì)

(LoopingStructureProgramming)

若干個(gè)在一定的條件下反復(fù)執(zhí)行的語(yǔ)句就構(gòu)成了循環(huán)體,循環(huán)體連同對(duì)循環(huán)的控制就組成了循環(huán)結(jié)構(gòu)。

C++提供了三種循環(huán)控制語(yǔ)句:while語(yǔ)句、do…while語(yǔ)句和for語(yǔ)句。

1.while語(yǔ)句

while語(yǔ)句的語(yǔ)法格式如下:

while(條件表達(dá)式)

循環(huán)體;

上述語(yǔ)句的含義為:首先對(duì)條件表達(dá)式進(jìn)行判斷,若判斷結(jié)果為假(false,0),則跳過(guò)循環(huán)體,執(zhí)行while結(jié)構(gòu)后面的語(yǔ)句,若判斷結(jié)果為真(true,非0),則進(jìn)入循環(huán)體,執(zhí)行其中的語(yǔ)句序列。例如,計(jì)算sum=1+2+3+…+10的while循環(huán)結(jié)構(gòu)如下:

sum=0;

i=1; //循環(huán)變量初始化

while(i<=10) //判斷條件

{ //循環(huán)體

sum=sum+i;

i++; //改變循環(huán)變量的值

}

2.do…while語(yǔ)句

do…while語(yǔ)句的語(yǔ)法格式如下:

do

循環(huán)體;

while(條件表達(dá)式);

上述語(yǔ)句的含義為:當(dāng)流程到達(dá)do后,立即執(zhí)行循環(huán)體語(yǔ)句,然后對(duì)條件表達(dá)式進(jìn)行判斷,若條件表達(dá)式的值為真(非0),則重復(fù)執(zhí)行循環(huán)體語(yǔ)句,否則退出。

do…while語(yǔ)句為“先執(zhí)行后判斷”方式。do…while語(yǔ)句與while語(yǔ)句的功能相似。

例如,計(jì)算sum=1+2+3+…+10的do…while循環(huán)結(jié)構(gòu)如下:

sum=0;

i=1; //循環(huán)變量初始化

do

{ //循環(huán)體

sum=sum+i;

i++; //改變循環(huán)變量的值

}while(i<=10) //判斷條件

do…while結(jié)構(gòu)與while結(jié)構(gòu)中都有一個(gè)while語(yǔ)句,很容易混淆。為了明顯區(qū)分它們,do…while循環(huán)體即使是一個(gè)單語(yǔ)句,習(xí)慣上也使用花括號(hào)括起來(lái),并且while(表達(dá)式)直接寫在花括號(hào)“}”的后面。

例如:

do

{

sum+=i++;

}while(i<=100);

3.for語(yǔ)句

for語(yǔ)句的語(yǔ)法格式如下:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

循環(huán)體;

其中,表達(dá)式1稱為初始化表達(dá)式,一般用于對(duì)循環(huán)變量進(jìn)行初始化或賦初值;表達(dá)式2稱為條件表達(dá)式,當(dāng)它的判斷條件為真時(shí),執(zhí)行循環(huán)體語(yǔ)句,否則終止循環(huán),退出for結(jié)構(gòu);表達(dá)式3稱為修正表達(dá)式,一般用于在每次循環(huán)體執(zhí)行之后,對(duì)循環(huán)變量進(jìn)行修改操作;循環(huán)體是當(dāng)表達(dá)式2為真時(shí)執(zhí)行的一組語(yǔ)句序列。例如,計(jì)算sum=1+2+3+…+10的for循環(huán)結(jié)構(gòu)如下:

sum=0;

for(i=1;i<=10;i++)

//初始化、判斷條件、修改方式、步長(zhǎng)都在頂部描述

{

sum+=i; //循環(huán)體相對(duì)簡(jiǎn)潔

}最簡(jiǎn)單的表示無(wú)限循環(huán)的方式如下:

for(;;)//分號(hào)不能省略

三個(gè)表達(dá)式都可省略,即不設(shè)初值,不判斷條件(認(rèn)為表達(dá)式2為真),循環(huán)變量不變化,無(wú)終止執(zhí)行循環(huán)體的語(yǔ)句。

4.跳轉(zhuǎn)語(yǔ)句

在C++中,除了提供順序執(zhí)行語(yǔ)句、選擇控制語(yǔ)句和循環(huán)控制語(yǔ)句外,還提供了一類跳轉(zhuǎn)語(yǔ)句。這類語(yǔ)句的總體功能是中斷當(dāng)前某段程序的執(zhí)行,并跳轉(zhuǎn)到程序的其他位置繼續(xù)執(zhí)行。

1)?break語(yǔ)句

break語(yǔ)句的作用是:結(jié)束當(dāng)前正在執(zhí)行的循環(huán)(for、while、do…while)或多路分支(switch)程序結(jié)構(gòu),轉(zhuǎn)而執(zhí)行這些結(jié)構(gòu)后面的語(yǔ)句。

例如,下面的代碼在執(zhí)行了break之后,繼續(xù)執(zhí)行a+=1;?處的語(yǔ)句,而不是跳出所有的循環(huán)。

for(;;)

{…

for(;;)

{

if(i==1)

break;

}

a+=1;//break跳至此處

//…

}

2)continue語(yǔ)句

continue語(yǔ)句的作用是:結(jié)束當(dāng)前正在執(zhí)行的這一次循環(huán)(for、while、do…while),接著執(zhí)行下一次循環(huán),即跳過(guò)循環(huán)體中尚未執(zhí)行的語(yǔ)句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。?

例如,輸出1~100之間不能被7整除的數(shù)。

for(inti=1;i<=100;i++)

{

if(i%7==0)

continue;

cout<<i<<endl;

}

5.多重循環(huán)

循環(huán)嵌套是指循環(huán)語(yǔ)句的循環(huán)體內(nèi)又包含另一個(gè)循環(huán)語(yǔ)句,即循環(huán)套循環(huán)。

【例2-18】

九九乘法表。

程序如下:

#include<iostream>

usingnamespacestd;

voidmain()

{intbcs,cs;

for(bcs=1;bcs<=9;bcs++) //bcs表示行號(hào)

{

for(cs=1;cs<=bcs;cs++) //cs表示列號(hào)

cout<<bcs<<'*'<<cs<<'='<<bcs*cs<<'';

cout<<endl;

}

}2.5.1動(dòng)態(tài)內(nèi)存(AboutDynamicStorageAllocation)

C++程序的內(nèi)存格局通常分為四個(gè)區(qū):全局變量、靜態(tài)數(shù)據(jù)、常量存放在全局?jǐn)?shù)據(jù)區(qū)(又稱為靜態(tài)存儲(chǔ)區(qū)),這部分內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,并在程序的整個(gè)運(yùn)行期間都存在;所有類成員函數(shù)和非成員函數(shù)代碼存放在代碼區(qū);為運(yùn)行函數(shù)而分配的局部變量、函數(shù)參數(shù)、返回?cái)?shù)據(jù)、返回地址等存放在棧區(qū),函數(shù)執(zhí)行開始時(shí)在棧上創(chuàng)建空間,執(zhí)行結(jié)束時(shí)這些存儲(chǔ)單元自動(dòng)被釋放,棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集中,效率很高,但內(nèi)存容量較為有限;剩余的空間都作為堆區(qū),在堆上進(jìn)行內(nèi)存分配又稱為動(dòng)態(tài)內(nèi)存分配。2.5動(dòng)態(tài)內(nèi)存分配(DynamicStorageAllocation)2.5.2new和delete運(yùn)算符(newanddeleteOperators)

1.new運(yùn)算符

new運(yùn)算符的功能是動(dòng)態(tài)分配內(nèi)存,其使用格式如下:

(類型名*)指針變量名=new類型名(初值列表);

例如:

int*pa;

pa=newint(2);使用new運(yùn)算符也可以申請(qǐng)一段連續(xù)的某種類型數(shù)據(jù)的存儲(chǔ)空間,創(chuàng)建該類型的數(shù)組,只是數(shù)組沒(méi)用名字,其首地址被存放在相同基類型的指針變量中,可以通過(guò)指針來(lái)訪問(wèn)該段連續(xù)的內(nèi)存。其使用格式如下:

(類型名*)指針變量名=new類型名[長(zhǎng)度];

例如:

float*pf;

pf=newfloat[10];

2.delete運(yùn)算符

delete運(yùn)算符的功能是釋放由new動(dòng)態(tài)分配的內(nèi)存空間,其使用格式如下:

delete指針變量名;

例如,上述用new得到的pa指向的內(nèi)存空間可以這樣來(lái)釋放:

deletepa;

如果delete釋放的是一段連續(xù)的存儲(chǔ)空間,則其使用格式如下:

delete[]指針變量名;

上述用new得到的pf指向的內(nèi)存空間釋放的語(yǔ)句如下:

delete[]pf;

【例2-19】new和delete運(yùn)算符的使用。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{

int*pi;float*pf;int*ps;

pi=newint(6);

pf=newfloat(5.893);

ps=newint[5];

for(inti=0;i<5;i++) ps[i]=i;

cout<<"*pi="<<*pi<<endl;

cout<<"*pf="<<*pf<<endl;

cout<<"*ps指向的數(shù)組元素依次為::"<<endl;

for(intj=0;j<5;j++)

cout<<ps[j]<<"";

cout<<endl;

deletepi;

deletepf;

delete[]ps;

return0;

}運(yùn)行結(jié)果:

*pi=6

*pf=5.893

*ps指向的數(shù)組元素依次為:

01234

注意:在使用new分配多個(gè)連續(xù)的存儲(chǔ)空間時(shí),分配成功得到的地址存放在基類型相同的指針變量中,該指針變量可以當(dāng)作數(shù)組名來(lái)使用下標(biāo)引用法對(duì)相應(yīng)存儲(chǔ)空間進(jìn)行存取。

1.變量未定義就直接使用。

調(diào)試器錯(cuò)誤信息:errorC2065:‘i’:undeclaredidentifier

C++語(yǔ)言中變量未經(jīng)聲明(或者說(shuō)定義),程序是無(wú)法通過(guò)編譯的。

2.在程序中使用中文標(biāo)示符,如將英文“;”錯(cuò)誤輸入成了“;”。

調(diào)試器錯(cuò)誤信息:errorC2018:unknowncharacter'0xa3'

在C++中,除程序注釋可以采用中文外,其余字符要求使用英文。2.6常見編程錯(cuò)誤(CommonProgrammingErrors)

3.定義的變量類型與使用不對(duì)應(yīng),如聲明為float,但實(shí)際給與了一個(gè)double的值,例如:

floatpi=3.412345245656245;

調(diào)試器錯(cuò)誤信息:warningC4305:'initializing':truncationfrom'constdouble'to'float'

4.變量在賦值之前就使用。例如:

inta,b,c;c=a+b;cin>>a>>b;

5.常量指針錯(cuò)誤。例如:

const

long

*p1

=

&40000;

//錯(cuò)誤

const

int

*ip3

=

&i;

i

=

10;

//沒(méi)問(wèn)題,約束的不是i的一般操作,而是通過(guò)ip3對(duì)i的操作

*ip3

=

10;

//錯(cuò)誤

6.常量賦值錯(cuò)誤。例如:

int

i

=

12;

const

int

ci

=

12;

int

*ip1

=

&12;

//錯(cuò)誤

12=

13;

//錯(cuò)誤

const

int

*ip2

=

&ci;

//沒(méi)問(wèn)題

ci

=

13;

//錯(cuò)誤7.編譯程序在進(jìn)行語(yǔ)法解析時(shí),取大優(yōu)先導(dǎo)致的錯(cuò)誤。

a+++++b; //錯(cuò)誤!取大優(yōu)先導(dǎo)致該語(yǔ)句解析成為"a+++++b"

a+++++b; //沒(méi)問(wèn)題

D:\ProgramFiles\MicrosoftVisualStudio\MyProjects\test\test.cpp(8):errorC2105:'++'needsl-value

ptr->*m;

//沒(méi)問(wèn)題

ptr->

*m;

//錯(cuò)誤list<vector<string>>

lovos;

//錯(cuò)誤!

在實(shí)例化語(yǔ)法里兩個(gè)相毗鄰的右半個(gè)尖括號(hào)被解釋

//成了一個(gè)右移位運(yùn)算符

list<vector<string>

>

lovos;

//正確

void

process(const

char*=0);

//錯(cuò)誤!這個(gè)聲明企圖在形式參數(shù)列表里使用運(yùn)算符*=

void

process(const

char

*processId

=

0);

//正確8.操作符結(jié)合率引起的錯(cuò)誤。例如:

int

a

=

3,

b

=2,

c

=

1;

//

...

if

(a

>

b

>

c)

//合法,但很有可能是錯(cuò)的,表達(dá)式“3>2>1”的結(jié)果是false

9.指向常量類型的指針不當(dāng)聲明引起的錯(cuò)誤。例如:

int

*

const

ptr2

=

&size;

//錯(cuò)誤字符集是構(gòu)成C++程序語(yǔ)句的最小元素,程序中除了字符串常量外,所有構(gòu)成程序的字母均取自字符集。C++的基本數(shù)據(jù)類型包括布爾型、字符型、整數(shù)型、實(shí)數(shù)型、空值型,分別用bool、char、int、float、void表示。其中,float類型對(duì)有些帶小數(shù)的實(shí)數(shù)只能近似表示。本章小結(jié)(ChapterSummary)各種運(yùn)算符種類繁多,且具有不同的優(yōu)先級(jí)與結(jié)合性,大致優(yōu)先順序?yàn)椋阂辉\(yùn)算優(yōu)先于二元運(yùn)算;二元運(yùn)算優(yōu)先于三元運(yùn)算;算術(shù)、移位、關(guān)系、按位、邏輯運(yùn)算的優(yōu)先級(jí)依次降低。復(fù)雜的運(yùn)算式要多使用括號(hào)以方便閱讀與理解。在表達(dá)式中,參加運(yùn)算的數(shù)據(jù)如果類型不同,則可以自動(dòng)轉(zhuǎn)換。

本章還講解了C++各種流程控制語(yǔ)句的用法,包括分支控制語(yǔ)句(if…else語(yǔ)句)、多分支控制語(yǔ)句(switch語(yǔ)句)和三種循環(huán)語(yǔ)句(for語(yǔ)句、while語(yǔ)句和do…while語(yǔ)句)。一、單項(xiàng)選擇題

1.C++程序的執(zhí)行總是從()開始的。

A.main函數(shù) B.第一行C.頭文件 D.函數(shù)注釋

2.下面常數(shù)中()不能作為常量。

A.?0xA5 B.?2.5e-2C.?3e2D.?0583習(xí)題2(Exercises2)

3.不屬于字符型常量的是()。

A.?'S' B.'\32' C.?'\n' D.?"L"

4.'\65'在內(nèi)存中占()個(gè)字節(jié),"\65"在內(nèi)存中占()個(gè)字節(jié)。

A.1,4 B.1,2 C.1,1 D.1,8

5.字符串“\\\”ABC\“\\”的長(zhǎng)度是()。

A.?3 B.?5 C.?7 D.?9

6.sizeof(double)的結(jié)果是()。

A.?8

B.?4 C.?2 D.出錯(cuò)

7.設(shè)x、y、z均為實(shí)型變量,代數(shù)式x/(yz)的正確寫法是()。

A.?x/y*z B.?x%y%z

C.

x%y*z D.

x/y/z

8.下列表達(dá)式中,()是非法的。已知:inta=5;floatb=5.5;

A.?a%3+b;

B.?b*b&&++a;

C.(a>b)+(int(b)%2); D.?---a+b

9.下列關(guān)于類型轉(zhuǎn)換的描述中,()是錯(cuò)誤的。

A.在不同類型操作數(shù)組成的表達(dá)式中,其表達(dá)式類型一定是最高類型double型

B.逗號(hào)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論