版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江師范大學(xué)《規(guī)范字與書法》2023-2024學(xué)年第一學(xué)期期末試卷
- 鄭州體育職業(yè)學(xué)院《視頻傳播實(shí)務(wù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 長(zhǎng)春師范大學(xué)《社會(huì)治理》2023-2024學(xué)年第一學(xué)期期末試卷
- 榆林職業(yè)技術(shù)學(xué)院《戶外拓展與定向運(yùn)動(dòng)》2023-2024學(xué)年第一學(xué)期期末試卷
- 食用菌栽培基質(zhì)廢棄物降解
- 碩士職場(chǎng)競(jìng)爭(zhēng)力
- 秋分節(jié)氣與糧食安全
- 農(nóng)業(yè)創(chuàng)新路演
- 學(xué)校文化建設(shè)上墻標(biāo)語(yǔ)
- 會(huì)計(jì)辭職報(bào)告范文
- 公司費(fèi)用預(yù)算表格模板(詳細(xì)版)
- 華為經(jīng)營(yíng)管理-華為市場(chǎng)營(yíng)銷體系(6版)
- 2023年中國(guó)育齡女性生殖健康研究報(bào)告
- 鋼結(jié)構(gòu)加工廠考察報(bào)告
- 發(fā)電機(jī)檢修作業(yè)指導(dǎo)書
- 薪酬與福利管理實(shí)務(wù)-習(xí)題答案 第五版
- 廢舊物資處置申請(qǐng)表
- GB/T 37234-2018文件鑒定通用規(guī)范
- GB/T 31888-2015中小學(xué)生校服
- 質(zhì)量檢查考核辦法
- 云南省普通初中學(xué)生成長(zhǎng)記錄-基本素質(zhì)發(fā)展初一-初三
評(píng)論
0/150
提交評(píng)論