《C++程序設(shè)計語言》課件第4章_第1頁
《C++程序設(shè)計語言》課件第4章_第2頁
《C++程序設(shè)計語言》課件第4章_第3頁
《C++程序設(shè)計語言》課件第4章_第4頁
《C++程序設(shè)計語言》課件第4章_第5頁
已閱讀5頁,還剩99頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章運算符與語句4.1C++運算符概述4.2C++語句小結(jié)練習題

4.1C++運算符概述

C語言是C++語言的子集,C++語言繼承了C語言語句簡潔、運算符豐富等優(yōu)良特性。在高級語言中,除了APL語言及當今流行的Java和C#語言外(Java和C#是從C++發(fā)展而來的),再沒有比C++(當然包括C)語言中的運算符更豐富的語言了。C++中的操作符不僅操作范圍廣,而且程序中的基本操作都可以用運算符實現(xiàn)。

根據(jù)參加運算對象的個數(shù)分類,C++語言中的運算符可分為

一元運算符(UnaryOperator),或稱“單目算符”,即參加運算對象的數(shù)目為一個;

二元運算符(BinaryOperator),或稱“雙目算符”,即參加運算對象的數(shù)目為兩個;

三元運算符(TernaryOperator),或稱“三目算符”,即參加運算對象的數(shù)目為三個。

根據(jù)運算符的功能劃分,C++中的運算符又分為

算術(shù)運算符和自增、自減運算符;

關(guān)系和邏輯運算符;

位運算符;

賦值運算符;

類型轉(zhuǎn)換符;

下標運算符([]);

三元條件運算符(?:);

逗號運算符;

指針運算符(&和*);

求字節(jié)運算符(sizeof);

取成員運算符(.?和?->);

函數(shù)調(diào)用運算符(?()?);

作用域解析運算符(::);

動態(tài)內(nèi)存分配與釋放運算符(new和delete);

類型轉(zhuǎn)換運算符。值得注意的是,C++中的某些運算符具有多態(tài)(Polymorphism)現(xiàn)象,即同一運算符在不同的上下文環(huán)境中具有不同的語義。如“-”運算符,既可以是一元負號,又可以是二元減;“&”既可以是位與運算符,又可以是取地址運算符。因此,在學習與使用C++運算符時,一定要注意它們的上下文環(huán)境,以明確其確切的含義。

本節(jié)只對C++中的一些基本運算符作簡要的介紹,因部分運算符與后續(xù)章節(jié)的內(nèi)容相關(guān)(如指針運算符?&?和?*?等),所以對這些運算符在此不作討論,留至后續(xù)章節(jié)中與其相關(guān)內(nèi)容一起講述。4.1.1算術(shù)運算符和自增、自減運算符

1.算術(shù)運算符

C++的算術(shù)運算符共有五種,它們是:

+ //一元正號或二元加

- //一元負號或二元減

* //二元乘法

/

//二元除法

% //二元整型運算符,求余或稱取模

上述運算符的使用方法及語義與數(shù)學中規(guī)定的一致。它們的優(yōu)先級是:一元?+、-?最高,其次是?*、/、%,最后是二元?+?和?-。值得注意的是,在運用算術(shù)運算符進行算術(shù)運算時,因C++允許基本類型的量可混合運算,因此,若二元算術(shù)操作符的兩個操作數(shù)類型不同,則其結(jié)果類型(也就是算術(shù)表達式的類型)取值集(存儲空間)較大者(此規(guī)則亦適用于其它的二元運算)。算術(shù)運算符的應(yīng)用見下例:程序運行結(jié)果:

result1=183.752

result2=7

2.自增、自減運算符

自增和自減(++/--)運算符用于直接表示整型變量的增1和減1操作,它使人們不必通過加/減再賦值的組合方式間接地表示這種增/減1操作。如++i的語義為i=i+1;--i的語義為i=i-1。這種整型變量的增?/?減1操作不僅簡潔,而且使得變量的求值快速而無副作用,即在變量的求增?/?減1過程中,不僅無需存加/減表達式(如i+1)值的臨時內(nèi)存單元,而且省去了賦值動作。

自增(++)和自減(--)運算符既可作為前綴運算符,亦可作為后綴運算符。如++i和i++,其語義均為使i自增1。

C++規(guī)定:++和--運算符只能用于整型變量、char型變量及在本書后續(xù)章節(jié)中要討論的指針類型變量,該運算符不能用于表達式。

++和--運算符對循環(huán)中的循環(huán)變量的自增、自減特別有用。例如:程序運行結(jié)果:

a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5,a[5]=6,a[6]=7,a[7]=8,a[8]=9,a[9]=10,

a[9]=10,a[8]=9,a[7]=8,a[6]=7,a[5]=6,a[4]=5,a[3]=4,a[2]=3,a[1]=2,a[0]=1,

注意:當++和--運算符單獨作用于變量時,其前綴++(--)與后綴++(--)的語義相同,均為使變量自增(減)1(即++i==i++,--i==i--)。但當++(--)和賦值“=”運算符相結(jié)合時,其前綴++(--)與后綴++(--)的語義不同。請看下面的代碼片斷:

inta=0;

intb=1;

intx,y;

x=a++; //a先賦值給x,然后自增1,故x=0,a=1

y=++b; //b先自增1,然后賦給y,故y=2,b=24.1.2關(guān)系和邏輯運算符

C++提供了六種關(guān)系運算符用于關(guān)系運算,它們是:

<、<=、>、>=、==、!=

上述關(guān)系運算符均為二元運算符,操作數(shù)為任意類型的表達式,運算結(jié)果為一邏輯值(true或false)。

上述關(guān)系運算符中,==、!=?運算符的優(yōu)先級同級且低于關(guān)系運算符的前四個運算符。關(guān)系運算符的優(yōu)先級低于算術(shù)運算符的優(yōu)先級。

C++的邏輯運算符有:

!(非)、&&(與)、||(或)

C++的邏輯運算符的語義和用法與數(shù)學中規(guī)定的一致,它們的優(yōu)先級:!最高,&&次之,||?最低。

!?的優(yōu)先級不僅高于?&&?和?||,而且高于算術(shù)運算符。邏輯運算符(除?!?外)低于關(guān)系運算符,其運算符的運算結(jié)果為一邏輯值(true或false)。

一般而言,編程中我們常常采用關(guān)系或邏輯運算符來表達某種判定條件的真假。

在進行關(guān)系和邏輯運算時,需注意以下兩點:

(1)數(shù)學中的條件表達式1≤x≤h,正確的C++表達式應(yīng)為

1<=x&&x<=h若寫成:1<=x<=h,則其語法在C++中是合法的,但其語義不對。C++在計算1<=x<=h(假定h=10)時,采用自左向右求值的順序,故當x>=1時,結(jié)果為true(轉(zhuǎn)換為1再參與后續(xù)的運算),因為1一定小于h,所以,條件表達式的結(jié)果為true。這種計算結(jié)果將大大偏離我們的期望。

(2)在C++中,&&?和?||?采用短路的方式進行計算,即:若?&&?的第一操作數(shù)的計算結(jié)果為false,&&?運算將停止第二操作數(shù)運算,并直接返回?&&?的結(jié)果false,因為false和任何值(true/false)相與的結(jié)果均為false。只有?&&?的第一操作數(shù)的結(jié)果為true時,它才進行第二操作數(shù)的計算,繼而進行&&運算。

||?運算與&&相反。當參加?||?運算的第一操作數(shù)為true時,||?停止第二操作數(shù)的計算,并直接返回?||?的結(jié)果true,因為true和任何值(true/false)相或的結(jié)果都是true。只有第一操作數(shù)為false時,||?運算才計算第二操作數(shù)的值,繼而進行?||?運算。

下面為一關(guān)系與邏輯運算符的簡單應(yīng)用實例:

#include<cstring>

//C庫字符串函數(shù)

#include<cstddef>

//引用系統(tǒng)的無符號整數(shù)類型size_t定義

usingnamespacestd;

//程序功能:打印輸出字符串中的數(shù)字0~9

intmain()

{4.1.3位運算符

C++提供了六種按位進行的邏輯運算符(以下簡稱位運算符),它們分別是:

&(按位與);

|?(按位或);

^(按位異或);

~?(按位取反);

<<?(左移);

>>?(右移)。

位運算符的優(yōu)先級從高到低的次序是:~?最高,其次是?&、|、^,最后是?<<?和?>>?!?lt;<”運算的語義是將第一操作數(shù)向左移動第二操作數(shù)所指定的位數(shù),右邊空出位補0;“>>”運算的語義是將第一操作數(shù)向右移第二操作數(shù)所指定的位數(shù),填補左邊的空出位的方法與具體的實現(xiàn)相關(guān)。

C++的位運算符均為二元運算符。參加位運算的操作數(shù)類型必須為整型或枚舉型,即應(yīng)為bool、char、short、int、long的無符號形式或enum。

C++的位運算可實現(xiàn)“直接與硬件通信”的功能。位運算的典型應(yīng)用是實現(xiàn)一個較小的位集合概念(位向量)。此時,無符號整數(shù)的每一位表示集合中的一個元素,位集合元素的個數(shù)為操作數(shù)的二進制位數(shù)的個數(shù)。下面是取自系統(tǒng)輸出流ostream的某個實現(xiàn)的代碼片斷,以展示位運算的典型應(yīng)用。

//用枚舉類型定義二進制流在輸出時的四種狀態(tài)

enumios_base::iostate{goodbit=0,eofbit=1,failbit=2,badbit=4};

//流輸出時檢測它的狀態(tài)

state=goodbit;

//...

if(state&(badbit|failbit))//流有問題,進行處理

//...4.1.4內(nèi)存申請與釋放運算符new和delete

C++中的new、new[]、delete和delete[]操作符用于動態(tài)地在堆中申請/釋放內(nèi)存。操作符new分配一個內(nèi)存單元(某一特定類型),new[]用于分配一批內(nèi)存單元;與之相應(yīng),delete釋放已動態(tài)分配的一個內(nèi)存單元,delete[]釋放已動態(tài)分配的一批內(nèi)存單元。

new、new[]、delete和delete[]的功能與C語言標準庫函數(shù)malloc、calloc和free類似,但new、new[]、delete和delete[]是C++中內(nèi)置的操作符,而非庫函數(shù);另外,new、new[]、delete和delete[]在使用上比malloc、calloc和free更方便,因為new和new[]在動態(tài)分配內(nèi)存時無須用sizeof運算符計算所需分配類型的存儲量大小,它自動計算某類型的存儲量并予以分配。

new、new[]、delete和delete[]的語法及語義示例如下:

newint //在堆中動態(tài)分配一個整型量的空間

newint[10] //在堆中動態(tài)分配10個整型量的空間

new和new[]的操作結(jié)果是返回所分配內(nèi)存空間的首地址,所以這兩個操作符的正確使用方法是:

int*int_ptr1=newint; //int_ptr1中存放動態(tài)分配的內(nèi)存首地址

int*int_ptr2=newint[10]; //int_ptr2中存放動態(tài)分配的一批內(nèi)存的首地址若要釋放已動態(tài)申請的內(nèi)存空間,可進行如下操作:

deleteint_ptr1;

delete[]int_ptr2; //注意[]不可省,否則只釋放申

請的第一個單元內(nèi)存

應(yīng)用中,我們還可對new、new[]、delete和delete[]操作符進行重載(Overloading,即重新定義其語義)。關(guān)于new、new[]、delete和delete[]的重載問題及具體的應(yīng)用實例詳見本書第二部分第10章中的內(nèi)容。4.1.5賦值運算符

C++的賦值運算符的語法及語義為

變量=表達式//計算表達式的值,并將其值賦給第一(左)操作數(shù)

“=”是二元運算符,采用右結(jié)合律(即計算自右向左進行)。C++規(guī)定:參加賦值運算的兩個操作數(shù)的類型必須是相容的。基本類型之間是彼此相容的類型,子類和其父類是相容的類型(類的概念詳見第二部分的內(nèi)容)。完全不同的兩個類型的量不能進行賦值運算。

值得注意的是:

(1)?C++在作賦值運算時,會自動地進行隱式的類型轉(zhuǎn)換,即第二操作數(shù)表達式的值在賦值時會自動進行類型轉(zhuǎn)換,其值的類型自動轉(zhuǎn)換成第一操作數(shù)的類型后再進行賦值。故在應(yīng)用中,若將一個浮點量賦給一個整型量,系統(tǒng)會自動舍棄浮點數(shù)的小數(shù)位,僅取其整數(shù)部分進行賦值,這常常導致計算精度的損失。

(2)賦值運算符可和C++中的大部分二元運算符(如+、-、*、/、%、&、|、^、<<、>>等)組合而形成復(fù)合賦值運算符,如+=、<<=等。假定我們用@表示上述的C++二元運算符,則x@=y(y為表達式)的語義為x=x@(y)。例:

x+=y+2等價于x=x+(y+2)

(3)注意賦值運算符“=”和關(guān)系運算符“==”的區(qū)別。應(yīng)用中,程序員常常會將關(guān)系運算符“==”誤寫成賦值運算符“=”,結(jié)果導致災(zāi)難性的后果。假設(shè)應(yīng)用中我們需要判定a是否等于b,若誤寫為

if(a=b)

假定b非零,無論a是否等于b,則判定結(jié)果將永為true。因為一個非零的b賦給a后,使得a非零,故結(jié)果為true。4.1.6類型轉(zhuǎn)換運算符

C++提供了四種用于類型轉(zhuǎn)換的操作符,它們是:

static_cast;

const_cast;

dynamic_cast;

reinterpret_cast。

static_cast是最常用的一種類型轉(zhuǎn)換操作符,它用于將一種類型的數(shù)據(jù)轉(zhuǎn)換成另一種類型的數(shù)據(jù),并且其類型轉(zhuǎn)換是在編譯期進行的。例:程序運行結(jié)果:

foundvalue=4

reinterpret_cast用于將一種類型的指針轉(zhuǎn)換成另一種類型的指針。例:

doubled=3.1.4159;

char*p=reinterpret_cast<char*>(&d); //將&d的類型double*轉(zhuǎn)換為char*

應(yīng)用中reinterpret_cast操作應(yīng)慎用。一是因為它的實現(xiàn)與具體的平臺相關(guān),二是因為指針類型的相互轉(zhuǎn)換極易導致程序發(fā)生錯誤。只有對void*類型的指針進行轉(zhuǎn)換時,此操作符才值得一用。

dynamic_cast用于在類的繼承層次中動態(tài)地進行類型轉(zhuǎn)換,因它的語法和語義與類、類的繼承等知識相關(guān),所以我們將此內(nèi)容留待本書第二部分再作敘述。4.1.7C++運算符概覽及其優(yōu)先級次序

下面,我們對C++的運算符作一概述,C++的所有運算符的語法與語義見表4.1所示。表中同一欄中運算符的優(yōu)先級相同,各運算符的優(yōu)先級自高而低向下排序。由上表可看出,C++運算符異常豐富,隨之而來的是運算符的優(yōu)先級亦變得復(fù)雜、難記。計算時,不了解運算符的優(yōu)先級,容易導致錯誤的計算結(jié)果。那么如何才能不需要記憶這些繁雜的運算符優(yōu)先級,又能保證其計算結(jié)果的正確性及代碼的可讀性呢?有效的做法是多用括號運算符來明確地表示運算的優(yōu)先次序。

4.2C++?語句

C++語句按功能共分為如下幾類:

表達式語句和空語句;

注釋語句;

復(fù)合語句;

選擇語句,包括if語句和switch語句;

循環(huán)語句,包括while語句、do-while語句和for語句;

帶標號語句;

跳轉(zhuǎn)語句,包括goto語句、continue語句、break語句和return語句。下面逐一闡明以上語句的語法、語義,同時列舉一些應(yīng)用實例以說明各語句的基本用法,并從程序流程控制的觀點來討論程序的結(jié)構(gòu)。4.2.1表達式語句和空語句

各類表達式后加分號即構(gòu)成了表達式語句。因為在C++中,賦值運算符“=”為操作符,所以,賦值語句亦歸為此類。例如:

i++;

y=12;

等都是表達式語句。

僅由分號構(gòu)成的語句為空語句??照Z句有時僅出于語法上的需要。當遇到空語句時,機器實際上并不執(zhí)行任何動作。4.2.2注釋語句及意義

C++中有兩種形式的注釋語句。

一種是從C語言繼承下來的單/多行注釋語句,它們以?/*?開頭,以?*/?結(jié)尾,在?/*?和?*/之間的一切(文字、數(shù)字、符號等)均視為該注釋語句的內(nèi)容。上述章節(jié)中我們已從多處見到了這類注釋語句。

另一種是C++從BCPL語言中引入的單行注釋。它們以?//?開頭,注釋的內(nèi)容可至語句行的末尾。

C++編譯器在進行編譯時會忽略掉程序中的注釋,編譯器將每一個注釋語句處理成一個空格。因此,應(yīng)明確:寫注釋的目的不是為了機器,而是為了增強程序的可讀性和可理解性。

編程時我們應(yīng)養(yǎng)成良好的編程習慣。一是應(yīng)采用逐層縮進的方式來排版代碼,縮進代表了一個程序員思維能力的層次化水平(不要把這僅看成是程序的美化工作),提倡每一層次雙空格或以一個tab縮進;二是在程序中,若語言本身不能明確表達其語義,就一定要寫注釋。注釋代表了一個程序員對程序的認識程度,對別人(包括對今后的自己)的尊重。因此,一定要有注釋;一定要寫含義明確的注釋;一定要隨時修改已經(jīng)不正確的注釋。程序中沒有注釋不行,但糟糕的注釋(多余的、有歧義的或根本就是錯誤的注釋)還不如沒有注釋!

C++的發(fā)明者BjarneStrustrup博士建議我們:

(1)為每一個源文件寫一個注釋,一般性地陳述源文件中有哪些聲明、對有關(guān)手冊的引用、為維護提供一般性的提示,等等。

(2)為每個類、模板和名字空間寫一個注釋。

(3)為每一個非平凡函數(shù)寫一個注釋,陳述其用途、所用的算法(除非算法非常明顯),以及可能有的關(guān)于它對于環(huán)境所做的假設(shè)。

(4)為每一個全局變量、名字空間和常量寫一個注釋。

(5)在非明顯的和/或不可移植的代碼處寫一些注釋。

在本書的所有示例程序中,都努力書寫具有良好風格與注釋的代碼,以作為示范,望讀者細心體會、學習。4.2.3復(fù)合語句

將若干條語句用一對花括號括起來,就構(gòu)成了復(fù)合語句,有時亦稱其為“分程序”或“塊”。

復(fù)合語句語法上等同于一條語句。其中可包含任意的C++語句。在復(fù)合語句中定義的變量,其作用域與生存期為定義于它的塊(static變量例外)。下面是一復(fù)合語句示例:

//若a<b,則交換a,b,之后輸出

#include<iostream>

usingnamespacestd;

intmain()

{4.2.4選擇判斷語句

C++中實現(xiàn)選擇結(jié)構(gòu)的語句共分兩類,它們是if語句和switch語句。其中,if語句又分為兩種形式,即簡單的if語句和能實現(xiàn)多分支結(jié)構(gòu)的if-else語句。

1.if語句

if語句有兩種形式,即if語句和if-else語句。

if語句的語法為

if(表達式)語句;

語義:若表達式(可為任意表達式)的值為true,則執(zhí)行語句(可為簡單語句或復(fù)合語句);否則,執(zhí)行if語句后的下一條語句。實現(xiàn)多分支結(jié)構(gòu)的if-else語句的語法為

if(表達式)

語句1;

else

語句2;

語義:若表達式的值為true,則執(zhí)行語句1,否則執(zhí)行語句2。表達式與語句的語法要求同上。

if語句及if-else語句的處理流程如圖4.1和圖4.2所示。圖4.1if語句處理流程圖4.2if-else語句處理流程下面的程序展示了if語句的基本用法。

例1用戶從鍵盤上輸入任意一個四則運算符,即+、-、*、/中的任意一個字符,屏幕顯示對應(yīng)的英文單詞plus、minus、multiply、divide。若輸入其它字符,屏幕將顯示stop!

程序如下:

if語句是編程時進行分支選擇的一種有效工具。一條if語句可實現(xiàn)二分支的選擇,多個if語句的嵌套可實現(xiàn)多個不同層次上的分支選擇(如例1所示)。

在利用多個if語句的嵌套實現(xiàn)多分支的選擇時,要注意:一般不要使if語句的嵌套層次過深,這樣會使代碼的可讀性大大下降;注意嵌套中else與if的配對問題,切記else總是和它最近的一個if語句相配對!?書寫嵌套的if語句時應(yīng)采用適當?shù)目s進形式以增強代碼的可讀性和可理解性。

例2輸入一個x值,計算y的值,y滿足下述條件:值得一提的是,C++?繼承了C語言中的一個三元條件運算符??:(C++中唯一的一個三元運算符)。當if-else語句中語句1和語句2為非復(fù)合語句時,三元算符便可模擬一條if-else語句,并且其表現(xiàn)形式更為簡潔。

三元條件操作符的語法為

表達式1??表達式2:表達式3

其語義為:計算表達式1的值,若為true,則整個表達式的值等于表達式2的值,否則,等于表達式3的值。

例如:語句x=a<b?a:b;?等價于

if(a<b)x=a;

elsex=b;

2.switch語句

switch語句用于實現(xiàn)同一層次的多分支選擇。其語法形式如下:

switch(表達式)

{

case常量1:語句1

case常量2:語句2

default:語句

}

在switch語句中,要求表達式的類型為整型(字符類型、整型、枚舉)和具有偏序關(guān)系的類型(如布爾類型)。

switch語句的語義是:計算表達式的值,將其值與各case的常量進行比較,若相等,則執(zhí)行常量后相應(yīng)的語句;若與各常量都不相等,則執(zhí)行default語句。語法中,default語句為可選項。

注意:switch語句中多個case可以復(fù)選,但每個case不是互斥的,當執(zhí)行完某一個case后的語句時,須用break語句或return語句跳出switch語句,否則在執(zhí)行完相應(yīng)的case后的語句后將繼續(xù)執(zhí)行其后case中的語句。雖然從語法的角度講switch語句中的default不是必需的,但我們應(yīng)養(yǎng)成書寫default語句的習慣。default語句表征著程序在遇到一種不可預(yù)見的情況時,應(yīng)對該種情況所進行的一種默認處理。這種良好的編程習慣對于書寫真正的應(yīng)用/系統(tǒng)程序是十分必要的。否則,當我們用switch語句實現(xiàn)分情況處理時,無default意味著程序在執(zhí)行中遇到不可預(yù)見的情況時不去處理,這極可能導致災(zāi)難性的后果。

當然,我們亦可以用一組嵌套的if語句實現(xiàn)同一層次的多分支選擇,但用switch語句實現(xiàn)將使代碼更清晰,更易于理解與閱讀。例如下面嵌套的if語句:下例展示switch語句的基本用法。

例3對鍵盤輸入的字符進行分類統(tǒng)計。對于數(shù)字(0~9),分類統(tǒng)計其出現(xiàn)的次數(shù);對空白符、換行符、橫向制表符統(tǒng)歸為空白字符類進行統(tǒng)計計數(shù);對其它字符,納入另一類進行統(tǒng)計計數(shù)。

程序如下:

#include<iostream>

usingnamespacestd;

intmain()

{4.2.5循環(huán)語句

C++為實現(xiàn)循環(huán)迭代提供了三種語句,它們是:

while語句;

do-while語句;

for語句。

下面逐一進行介紹。

1.while語句

語句形式為

while(表達式)語句S

其中,表達式可為任意類型;語句既可為簡單語句,亦可為復(fù)合語句。

while語句的處理流程如圖4.3所示。圖4.3while語句流程圖

while語句常用于兩種情況:一是用于循環(huán)迭代次數(shù)不詳(當然這只是通常的情況),根據(jù)給定條件進行循環(huán)迭代的情況;二是對循環(huán)變量的更新自然地出現(xiàn)在循環(huán)體中時。例如:

while(cin>>ch)//...

就屬于上述第一種用法。

下面的程序展示了while語句的基本用法。

例4提示用戶對從屏幕上輸入的內(nèi)容是否進行了錯誤處理,允許用戶試3次。

#include<iostream>

usingnamespacestd;

voiderror(); //錯誤處理函數(shù)聲明

2.do-while語句

do-while語句的形式為

do循環(huán)體語句while(表達式);

do-while語句的語義是:首先執(zhí)行循環(huán)體語句,再判斷表達式的值是否為true,若是,則進入下一次循環(huán),否則,結(jié)束循環(huán)。

do-while語句的處理流程如圖4.4所示。

注意:do-while語句不管循環(huán)條件是否滿足,它至少執(zhí)行一次循環(huán)體。由于歷史的原因,這條語句從C直接繼承了下來,建議編程時一般不要使用它。大量的實踐經(jīng)驗表明,do-while語句是錯誤與混亂的一個根源,緣于它在循環(huán)條件判斷之前總要執(zhí)行循環(huán)體一次。它完全可被while/for語句所取代。圖4.4do-while語句的處理流程

3.for語句

for語句的一般形式為

for(表達式E1;表達式E2;表達式E3)循環(huán)體語句S

for語句是最靈活的一種循環(huán)語句,語法不限定E1和E2的類型,E3一般限定為整型、枚舉和浮點類型。E1、E2和E3三部分從語法角度上講任意一部分都可省略(但其中的分隔符(分號)不能省略,例如,for(;;)等價于while(true))。編程時,我們最好在有明確的循環(huán)次數(shù)、循環(huán)條件、循環(huán)變量的遞增量的情況下使用for語句,并使用如下的形式以清晰地表達其循環(huán)語義:

E1—循環(huán)的初始條件;圖4.5

for語句的循環(huán)控制結(jié)構(gòu)

E2—循環(huán)終止的條件;

E3—循環(huán)變量的遞增(遞減)。

for語句的處理流程如圖4.5所示。

下面程序展示了for語句的基本用法。

例5假設(shè)某用戶在銀行存了1000元人民幣,年利率為2.25%。設(shè)用戶每年的利息均保留在賬號中,打印輸出用戶賬號中共計10年的每年的存款余額。用戶每年的存款余額按如下公式計算:

amount=p*(1+r)n其中:p——存款本金;

r——存款年利率;

n——存款年數(shù);

amount—每年存款的本息和。

程序如下:

#include<iostream>

#include<iomanip>

#include<cmath>

usingnamespacestd;

intmain()

{

4.while與for語句的比較

從語義上講,while和for可等價互換。例如,for語句與下述的while語句等價:

表達式E1;

while(表達式E2)

{

循環(huán)體語句S

表達式E3;

}在程序中我們常常見到的while(1)(永遠循環(huán))就與for(;;)是等價的。在實現(xiàn)一個循環(huán)時,如果它不是簡單的“已知循環(huán)次數(shù)、循環(huán)檢測條件、更新循環(huán)變量”這種類型,最好還是采用while循環(huán)結(jié)構(gòu)。一般而言,while語句更易于實現(xiàn)較為復(fù)雜的循環(huán)情況。

例6一籃雞蛋,不超過400個,若每次拿2個(或每次拿3、4、5、6個),則籃里總剩下一個雞蛋,若每次拿7個,則剛好拿完,問籃里一共有多少個雞蛋?題意分析:這個問題和古代“韓信點兵”的問題類似。根據(jù)題意,我們可首先推斷出雞蛋的總數(shù)目必為奇數(shù),故設(shè)雞蛋的總數(shù)n的初值為3,然后用3求余,若余數(shù)不為1則循環(huán)加2,直至余數(shù)為1時停止;再用4求余,若余數(shù)非1,則循環(huán)加6,直至余數(shù)為1時停止;再用5除,若余數(shù)不為1,則循環(huán)加12,直至余數(shù)為1時停止;再用6求余,若余數(shù)非1,則循環(huán)加60,直至余數(shù)為1時停止,最后用7求余,若余數(shù)不為零,就循環(huán)加60,直至余數(shù)為0,此時n的值就是所求的雞蛋總數(shù)。程序如下:程序運行結(jié)果:

Thereare301eggs.

當然,上述問題我們亦可用for語句實現(xiàn),但確實有些費勁!讀者不妨一試。一個好的程序員,應(yīng)能在恰當?shù)臅r候,選擇適當?shù)恼Z句以實現(xiàn)自己的編程思想。希望大家在今后的學習與實踐中能不斷地總結(jié)、領(lǐng)悟,以提高自己的編程能力。4.2.6跳轉(zhuǎn)語句

C++提供了四種跳轉(zhuǎn)語句以供程序員在控制結(jié)構(gòu)中進行跳轉(zhuǎn)。它們是:

goto語句;

continue語句;

break語句;

return語句。

下面我們簡要闡述其語法與語義。

1.goto語句

goto語句的形式為

goto標號語句;

其中,標號語句的形式為:標識符:語句;

goto語句的語義是:跳轉(zhuǎn)到標號語句處。若它用在循環(huán)中,可一下跳出多重循環(huán),但goto語句的跳轉(zhuǎn)區(qū)域只能在一個函數(shù)內(nèi),即它只能跳轉(zhuǎn)到本函數(shù)的某個標號語句處。

goto語句可謂“臭名昭著”,因為它破壞程序的結(jié)構(gòu)性和可讀性。早在20世紀60年代,人們已發(fā)現(xiàn)大多數(shù)的軟件開發(fā)項目的困難與失敗均由goto的使用不當造成。軟件工程專家Bohm和Jacopini通過研究表明:任何包含goto語句的程序總可以用不帶goto語句的辦法寫出來,并指出所有的程序都可以

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論