武漢大學(xué)C++完整講義(李春葆)_第1頁
武漢大學(xué)C++完整講義(李春葆)_第2頁
武漢大學(xué)C++完整講義(李春葆)_第3頁
武漢大學(xué)C++完整講義(李春葆)_第4頁
武漢大學(xué)C++完整講義(李春葆)_第5頁
已閱讀5頁,還剩689頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

課程:面向?qū)ο蟮某绦蛟O(shè)計(jì)目前支持面向?qū)ο蟪绦蛟O(shè)計(jì)的主要環(huán)境:

?C++?Java教材

C++程序設(shè)計(jì),清華大學(xué)出版社,劉加海等,2009年C++程序設(shè)計(jì),清華大學(xué)出版社,李春葆等,2005年上機(jī)環(huán)境:VisualC++6.0第1章C++概述1.1C++的發(fā)展歷史

C++源于C語言。1972年至1973年期間,D.M.Ritchie首創(chuàng)了一種新的程序設(shè)計(jì)語言,取名為C語言。設(shè)計(jì)C語言的最初目的是編寫操作系統(tǒng)。由于其簡(jiǎn)單、靈活的特點(diǎn),C語言很快就被用于編寫各種不同類型的程序,從而成為世界上最流行的語言之一。C語言是面向過程的語言->C++是面向?qū)ο蟮恼Z言,稱為“帶類的C”,1993年正式取名為C++。C++改進(jìn)了C的不足之處,支持面向?qū)ο蟮某绦蛟O(shè)計(jì),在改進(jìn)的同時(shí)保持了C的簡(jiǎn)潔性和高效性。

C++編譯系統(tǒng):Microsoft公司的VisualC++6.0、Borland公司的BorlandC++5.02等。1.2程序設(shè)計(jì)語言和程序設(shè)計(jì)方法1.2.1程序和程序設(shè)計(jì)語言計(jì)算機(jī)程序是對(duì)計(jì)算機(jī)處理對(duì)象和計(jì)算規(guī)則的描述。程序設(shè)計(jì)語言是用來描述計(jì)算機(jī)事務(wù)處理過程、便于計(jì)算機(jī)執(zhí)行的規(guī)范化語言。無論自然語言還是計(jì)算機(jī)語言,其基礎(chǔ)是一組記號(hào)和規(guī)則,根據(jù)規(guī)則由記號(hào)構(gòu)成記號(hào)串的總體就是語言。我們知道,人類自然語言(如漢語)是人們交流和表達(dá)思想的工具。那么,人與計(jì)算機(jī)如何“交流”呢?為此,就產(chǎn)生了計(jì)算機(jī)語言,其功能是人用計(jì)算機(jī)語言編寫一系列的動(dòng)作,計(jì)算機(jī)能夠“理解”這些動(dòng)作,按照指定的動(dòng)作去執(zhí)行。正是這種相同點(diǎn),所以計(jì)算機(jī)語言和自然語言都叫作“語言”。

自然語言由于其歷史性和文化性,除了其語法外,還包含復(fù)雜的語義和語境,所以,人們也能理解很多不完全符合語法的語句。但計(jì)算機(jī)語言是人發(fā)明的,它主要是用語法來表達(dá)人的思想,因而在編寫程序時(shí)要嚴(yán)格遵守語法規(guī)則。如同人類有很多自然語言一樣,計(jì)算機(jī)語言也有很多種。按照計(jì)算機(jī)歷史的發(fā)展有如下幾類:

機(jī)器語言它是面向機(jī)器的,是特定計(jì)算機(jī)系統(tǒng)所固有的語言。用機(jī)器語言進(jìn)行程序設(shè)計(jì),需要對(duì)機(jī)器結(jié)構(gòu)有較多的了解。用機(jī)器語言編寫的程序可讀性很差,程序難以修改和維護(hù)。

匯編語言為了提高程序設(shè)計(jì)效率,人們考慮用有助記憶的符號(hào)來表示機(jī)器指令中操作碼和運(yùn)算數(shù),例如用ADD表示加法,SUB表示減法等。相對(duì)機(jī)器語言來看,用匯編語言編寫程序的難度有所降低,程序的可讀性,有所提高,但仍與人類的思維相差甚遠(yuǎn)。高級(jí)語言匯編語言和計(jì)算機(jī)的機(jī)器語言十分接近,它的書寫格式在很大程度上取決于特定計(jì)算機(jī)的機(jī)器指令,這對(duì)于人們抽象思維和交流十分不便。高級(jí)語言指的是像Fortran、C、Pascal和Basic等與具體機(jī)器無關(guān)的語言,這樣程序設(shè)計(jì)者不需要了解機(jī)器的內(nèi)部結(jié)構(gòu),只要按照計(jì)算機(jī)語言的語法編寫程序即可。1.2.2結(jié)構(gòu)化程序設(shè)計(jì)出現(xiàn)高級(jí)語言之后,如何用它來編寫較大的程序呢?人們把程序看成是處理數(shù)據(jù)的一系列過程。過程或函數(shù)定義為一個(gè)接一個(gè)順序執(zhí)行的一組指令。數(shù)據(jù)與程序分開存儲(chǔ),程序設(shè)計(jì)的主要技巧在于追蹤哪些函數(shù)和調(diào)用哪些函數(shù),哪些數(shù)據(jù)發(fā)生了變化。為解決其中可能存在的問題,結(jié)構(gòu)化程序設(shè)計(jì)應(yīng)運(yùn)而生。C程序由函數(shù)組成,從組織形式上看,函數(shù)亦稱為模塊,每個(gè)模塊實(shí)現(xiàn)一個(gè)單一的功能,這稱為模塊化程序設(shè)計(jì)。模塊化程序設(shè)計(jì)的思想是,按照自頂向下的原則,把問題逐層分解。先從總體出發(fā),把問題分成若干個(gè)大塊,每一大塊代表一個(gè)大任務(wù);在此基礎(chǔ)上再對(duì)每個(gè)大塊細(xì)化,把大任務(wù)變成若干個(gè)小任務(wù)。這一過程叫做逐步求精,直到每個(gè)小任務(wù)都能用基本結(jié)構(gòu)(順序、分支和循環(huán)3種結(jié)構(gòu)之一)表示為止。在劃分模塊的過程中,應(yīng)保證模塊的單入口單出口、完整性和獨(dú)立性,這種方法稱為結(jié)構(gòu)化程序設(shè)計(jì)。

結(jié)構(gòu)化程序設(shè)計(jì)仍然存在諸多問題:

生產(chǎn)率低下軟件代碼重用程度低軟件仍然很難維護(hù)針對(duì)結(jié)構(gòu)化程序設(shè)計(jì)的缺點(diǎn),人們提出了面向?qū)ο蟮某绦蛟O(shè)計(jì)方法。1.2.3面向?qū)ο蟮某绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)的本質(zhì)是把數(shù)據(jù)和處理數(shù)據(jù)的過程當(dāng)成一個(gè)整體即對(duì)象。一般認(rèn)為,面向?qū)ο蟪绦蛘Z言至少包含下面一些概念:

對(duì)象對(duì)象是人們要進(jìn)行研究的任何實(shí)際存在的事物,它具有狀態(tài)(用數(shù)據(jù)來描述)和操作(用來改變對(duì)象的狀態(tài))。面向?qū)ο笳Z言把狀態(tài)和操作封裝于對(duì)象體之中,并提供一種訪問機(jī)制,使對(duì)象的“私有數(shù)據(jù)”僅能由這個(gè)對(duì)象的操作來執(zhí)行。用戶只能通過向允許公開的操作提出要求(消息),才能查詢和修改對(duì)象的狀態(tài)。這樣,對(duì)象狀態(tài)的具體表示和操作的具體實(shí)現(xiàn)都是隱蔽的。

類把眾多事物歸納、劃分成一些類,把具有共性的事物劃分為一類,得出一個(gè)抽象的概念,是人類認(rèn)識(shí)世界經(jīng)常采用的思維方法。類是面向?qū)ο笳Z言必需提供的用戶定義的數(shù)據(jù)類型,它將具有相同狀態(tài)、操作和訪問機(jī)制的多個(gè)對(duì)象抽象成為一個(gè)對(duì)象類。在定義了類以后,屬于這種類的一個(gè)對(duì)象叫作類實(shí)例或類對(duì)象。一個(gè)類的定義應(yīng)包括類名、類的說明和類的實(shí)現(xiàn)。

繼承繼承是面向?qū)ο笳Z言的另一個(gè)必備要素。類與類之間可以組成繼承層次,一個(gè)類的定義(稱為子類)可以定義在另一個(gè)已定義類(稱為父類)的基礎(chǔ)上。子類可以繼承父類中的屬性和操作,也可以定義自已的屬性和操作,從而使內(nèi)部表示上有差異的對(duì)象可以共享與它們結(jié)構(gòu)有共同部分的有關(guān)操作,達(dá)到代碼重用的目的。面向?qū)ο蟪绦蛟O(shè)計(jì)的主要優(yōu)點(diǎn)是:

與人類習(xí)慣的思維方式一致結(jié)構(gòu)化程序設(shè)計(jì)是面向過程的,以算法為核心,把數(shù)據(jù)和過程作為相互獨(dú)立的部分。面向?qū)ο蟪绦蛟O(shè)計(jì)以對(duì)象為中心,對(duì)象是一個(gè)統(tǒng)一體,它是由描述內(nèi)部狀態(tài)表示靜態(tài)屬性的數(shù)據(jù)以及可以對(duì)這些數(shù)據(jù)施加的操作封裝在一起所構(gòu)成的。面向?qū)ο笤O(shè)計(jì)方法是對(duì)問題領(lǐng)域進(jìn)行自然分解,確定需要使用的對(duì)象和類,建立適當(dāng)?shù)念惖燃?jí),在對(duì)象之間傳遞消息實(shí)現(xiàn)必要的聯(lián)系,從而按照人們習(xí)慣的思維方式建立起問題域的模型,模擬客觀世界。

可重用性好面向?qū)ο蟮能浖夹g(shù)在利用可重用的軟件成分構(gòu)造新的軟件系統(tǒng)時(shí)有很大的靈活性。有兩種方法可以重復(fù)使用一個(gè)對(duì)象類:一種方法是創(chuàng)建該類的實(shí)例,從而直接使用它;另一種方法是從它派生出一個(gè)滿足當(dāng)前需要的新類。繼承性機(jī)制使得子類不僅可以重用其父類的數(shù)據(jù)結(jié)構(gòu)和程序代碼,而且可以在父類代碼的基礎(chǔ)上方便地修改和擴(kuò)充,這種修改并不影響對(duì)原有類的使用。人們可以像使用集成電路(IC)構(gòu)造計(jì)算機(jī)硬件那樣,比較方便地重用對(duì)象類來構(gòu)造軟件系統(tǒng)。

可維護(hù)性好類是理想的模塊機(jī)制,它的獨(dú)立性好,修改一個(gè)類通常很少會(huì)牽扯到其他類。如果僅修改一個(gè)類的內(nèi)部實(shí)現(xiàn)部分(私有數(shù)據(jù)成員或成員函數(shù)的算法),而不修改該類的對(duì)外接口,則可以完全不影響軟件的其他部分。面向?qū)ο筌浖夹g(shù)特有的繼承機(jī)制,使得對(duì)軟件的修改和擴(kuò)充比較容易實(shí)現(xiàn),通常只要從已有類派生出一些新類,無須修改軟件原有成分。面向?qū)ο筌浖夹g(shù)的多態(tài)性機(jī)制,使得擴(kuò)充軟件功能時(shí)對(duì)原有代碼所需作的修改進(jìn)一步減少,需要增加的新代碼也比較少。所以,面向?qū)ο蠓椒ㄔO(shè)計(jì)的程序具有很好的可維護(hù)性。1.3C++語言的特點(diǎn)

C++語言的主要特點(diǎn)在于它支持面向?qū)ο蟪绦蛟O(shè)計(jì)。下面說明它和面向?qū)ο笥嘘P(guān)的一些特征。

1.類和數(shù)據(jù)封裝

2.構(gòu)造函數(shù)和析構(gòu)函數(shù)

3.訪問限制符和信息隱蔽性

4.對(duì)象和消息

5.友元

6.運(yùn)算符重載和函數(shù)重載

7.繼承和派生類

8.虛函數(shù)1.4C++程序開發(fā)過程

C++程序開發(fā)過程與其他高級(jí)語言源程序開發(fā)過程的原理是一樣的,一般,都要經(jīng)過編輯、編譯和執(zhí)行三個(gè)步驟。

編輯源程序:生成文本文件(file.cpp)

編譯:生成一個(gè)目標(biāo)文件(file.obj)

連接:生成一個(gè)可執(zhí)行文件(file.exe)1.5C++程序結(jié)構(gòu)1.5.1簡(jiǎn)單的C++程序我們用一個(gè)簡(jiǎn)單的程序例子來分析C++的程序構(gòu)成。以下代碼是一個(gè)完整的可以執(zhí)行的C++程序:/*-----------------------------------------

文件名:ch1.cpp------------------------------------------*/#include<iostream.h>#include<math.h>voidmain(){ inti,j,k; //說明變量

i=2;j=8; //變量賦值

k=pow(i,j); cout<<i<<"的"<<j<<"次方="<<k<<endl;}1.5.2C++程序的組成一個(gè)C++程序由以下基本部分組成:

1.預(yù)處理命令

2.輸入和輸出

3.函數(shù)

4.語句語句是組成程序的基本單元。函數(shù)是由若干條語句組成的。但是,空函數(shù)是沒有語句的。語句由單詞組成,單詞間用空格符分隔,C++程序中的語句又是以分號(hào)結(jié)束。一條語句結(jié)束時(shí)要用分號(hào),沒有結(jié)束時(shí)不要用分號(hào)。

在C++語句中,表達(dá)式語句最多。表達(dá)式語句由一個(gè)表達(dá)式后面加上分號(hào)組成。任何一個(gè)表達(dá)式加上分號(hào)都可以組成一條語句。只有分號(hào)而沒有表達(dá)式的語句為空語句。語句除了有表達(dá)式語句和空語句之外,還有復(fù)合語句、分支語句、循環(huán)語句和轉(zhuǎn)向語句等若干類。

5.變量多數(shù)程序都需要說明和使用變量。變量的類型很多,這充分體現(xiàn)了C++數(shù)據(jù)類型豐富的特點(diǎn)。1.5.3C++語言的風(fēng)格C++語言的風(fēng)格概括如下:

C++語言嚴(yán)格區(qū)分大小寫英文字母。

C++語言用“;”作為語句分隔符。

C++語言中大括號(hào)“{”和“}”用于標(biāo)識(shí)一個(gè)語句組,即構(gòu)成一個(gè)復(fù)合語句,因此必須配對(duì)使用。

C++程序書寫格式自由,一行內(nèi)可以寫幾個(gè)語句,一個(gè)語句可以寫在幾行上??梢允褂?/或/*...*/對(duì)C++程序中的任何部分作注釋。一行一般寫一條語句。短語句可以一行寫多個(gè)。長(zhǎng)語句可以一條寫多行。第2章C++數(shù)據(jù)類型程序用于處理數(shù)據(jù),而數(shù)據(jù)是以變量或常量的形式存儲(chǔ),每個(gè)變量或常量都有數(shù)據(jù)類型。數(shù)據(jù)類型是最基本的元素。確定了數(shù)據(jù)類型,才能確定變量的空間大小和其上的操作。

C++提供了豐富的數(shù)據(jù)類型,歸納起來,分為基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型。數(shù)據(jù)類型與操作是不可分割的,而操作是通過運(yùn)算符實(shí)現(xiàn)的,例如:

intb=3,c=4;

a=b+c;//a、b和c是整型變量,進(jìn)行加法操作2.1基本數(shù)據(jù)類型基本數(shù)據(jù)類型有5種:

?整型(int)

?單精度浮點(diǎn)型(float)

?字符型(char)

?

雙精度浮點(diǎn)型(double)

?無值型(void)

名稱字節(jié)數(shù)int4shortint2longint4unsignedint4unsignedshortint2unsignedlongint4char1unsignedchar1float4double8longdouble10表2.1系統(tǒng)數(shù)據(jù)類型的數(shù)據(jù)占用的字節(jié)數(shù)

2.2常量和變量2.2.1常量常量是在程序中不能改變的量。C++支持4種類型的常量:浮點(diǎn)型、整型、字符型和枚舉型。

1.整型常量整型數(shù)據(jù)表示通常意義上的整數(shù),如34,-4,0,1234。整型量在C++中用int定義。整型常量可以用十進(jìn)制、八進(jìn)制或十六進(jìn)制表示,例如整數(shù)20可以表示為:

20 //十進(jìn)制

024 //八進(jìn)制數(shù)以0開頭

0x14 //十六進(jìn)制數(shù)以0x開頭

整型常量可以后跟字母l或L表示long型(長(zhǎng)整數(shù)),也可以跟u或U表示unsigned整數(shù)(無符號(hào)整數(shù)),如以下數(shù)是合法的:

135u //無符號(hào)整數(shù)

8846UL //無符號(hào)長(zhǎng)整數(shù)

5L //長(zhǎng)整數(shù)

10lu //無符號(hào)長(zhǎng)整數(shù)2.浮點(diǎn)數(shù)常量

浮點(diǎn)數(shù)也和數(shù)學(xué)意義的浮點(diǎn)數(shù)類似。浮點(diǎn)數(shù)分為整數(shù)部分和小數(shù)部分。一個(gè)浮點(diǎn)數(shù)常量可以用科學(xué)記數(shù)法和通常的十進(jìn)制數(shù)表示法表示??茖W(xué)記數(shù)法格式:

[d][.d][[E|e][+|-]d]

其中,d是一位或多位十進(jìn)制數(shù)字(0~9)。E(也可用e)是指數(shù)符號(hào)。小數(shù)點(diǎn)之前的是整數(shù)部分,小數(shù)點(diǎn)之后是尾數(shù)部分,它們是可省略的。小數(shù)點(diǎn)在沒有尾數(shù)時(shí)可省略。浮點(diǎn)常量可用字母F或f標(biāo)志。如以下數(shù)是合法的:

3.14159F0.121.0E-32.f

以下數(shù)是不合法的:

E+2.51.25F-23.字符常量與字符串常量

C++中的字符常量常用單引號(hào)括起,如‘3’、‘b’和‘’分別表示字符3、字符b和空白字符。在內(nèi)存中,字符數(shù)據(jù)以ASCII碼存儲(chǔ),如字符'a'的ASCII碼為97,字符'*'的ASCII碼為42。有些字符是可以顯示的,如字母、數(shù)字和一些符號(hào)'!'、'@'、'#'、'+'、'/'等,而有些字符不可顯示,如ASCII碼為8的字符表示退格(backspace),ASCII碼為13的字符表示回車等。

當(dāng)0個(gè)或多個(gè)字符由雙引號(hào)"…"括起時(shí),就組成字符串常量。以下是字符串常量的例子:

"" //空串

"abcd" //一般字符串

"a\n\rb" //帶特殊符號(hào)的字符串

字符串常量實(shí)際上是一個(gè)字符數(shù)組,組成數(shù)組的字符除顯式給出的外,還包括字符結(jié)尾處標(biāo)識(shí)字符串結(jié)束的符號(hào)‘\0’,所以字符串“abc”實(shí)際上包含4個(gè)字符:‘a(chǎn)’、‘b’、'c'和'\0'。2.2.2變量變量就是值可變的量。每個(gè)變量由一個(gè)變量名惟一標(biāo)識(shí),同時(shí),每個(gè)變量又具有一個(gè)特定的數(shù)據(jù)類型。類型標(biāo)志著這個(gè)變量將來的用法以及它將保存哪種類型的數(shù)據(jù)值。

1.命名變量名變量名要遵守以下規(guī)則:(1)不能是C++保留字。C++的保留字如表2.3所列。(2)第一個(gè)字符必須是字母或下劃線。中間不能有空格。(3)變量名中除了使用26個(gè)英文大小寫字母和數(shù)字外,只能使用下劃線。(4)一般不要超過31個(gè)字符。(5)變量名不要與C++中的庫函數(shù)名、類名和對(duì)象名相同。例如,以下都是有效的變量名:

i1,count,_fnum,str_1

以下不是有效的變量名:

1abc,a-b,abc【例】下列變量名中合法的是

。

A.B.C.Tom B.3a6bC._6a7b D.$ABC

答:選項(xiàng)A中出現(xiàn)“.”字符錯(cuò)誤;選項(xiàng)B中以數(shù)字開頭錯(cuò)誤;選項(xiàng)D中出現(xiàn)“$”字符錯(cuò)誤;本題答案為:C。2.變量定義和說明

C++中,變量使用之前一定要定義或說明,變量定義的格式一般為:

[修飾符]類型變量名;//注釋其中,類型指出變量所存放的數(shù)據(jù)的類型;變量名是任意合法的變量名;注釋指明該變量的含義和用途;修飾符進(jìn)一步描述了變量的使用方式。修飾符和注釋是任選的,可以沒有。“說明”和“定義”之間是有區(qū)別的,兩者的語法格式類似?!罢f明”是向計(jì)算機(jī)介紹名字,它說“這個(gè)名字是什么意思”。而“定義”則為這個(gè)名字分配存儲(chǔ)空間。無論涉及到變量時(shí)還是函數(shù)時(shí)含義都一樣。無論在哪種情況下,編譯器都在“定義”處分配存儲(chǔ)空間。對(duì)于變量,編譯器確定這個(gè)變量占多少存儲(chǔ)單元,并在內(nèi)存中產(chǎn)生存放它們的空間。對(duì)于函數(shù),編譯器產(chǎn)生代碼,并為之分配存儲(chǔ)空間。3.變量初始化在定義變量時(shí)可以給變量賦一個(gè)初值,初值可以是一個(gè)表達(dá)式,但該表達(dá)式必須在編譯時(shí)就能計(jì)算出值來。系統(tǒng)自動(dòng)計(jì)算得到一個(gè)值后,賦給該變量。下面是一些變量初始化的例子:

constdoublePI=3.14159;inti=10;floata=1.4;b=a*5;2.3運(yùn)算符和表達(dá)式在程序中,表達(dá)式是計(jì)算求值的基本單位,它是由運(yùn)算符和運(yùn)算數(shù)組成的式子。運(yùn)算符是表示進(jìn)行某種運(yùn)算的符號(hào),C++規(guī)定了很多有特定功能的運(yùn)算符,如“+”表示加減運(yùn)算。運(yùn)算數(shù)包含常量、變量和函數(shù)等。運(yùn)算符與運(yùn)算數(shù)有關(guān),如:

5.0/2=2.55/2=2 //整除

2.3.1算術(shù)運(yùn)算符

C++定義了5種簡(jiǎn)單的操作,即加(+)、減(-)、乘(*)、除(/)和取模(%),其中乘(*)、除(/)和取模(%)優(yōu)先于加(+)減(-)。括號(hào)用來表示一組項(xiàng)的計(jì)算,計(jì)算時(shí),先計(jì)算括號(hào)內(nèi)表達(dá)式的值,再將計(jì)算結(jié)果與括號(hào)外的數(shù)一起計(jì)算,如:

4*(1+2)=4*3=12//先計(jì)算1+2的結(jié)果取模運(yùn)算符(%)用于計(jì)算兩整數(shù)相除后得到的余數(shù),如:

22%7//結(jié)果為1

注意:%只能用于整數(shù)相除,不能對(duì)浮點(diǎn)數(shù)操作。2.3.2賦值運(yùn)算符賦值運(yùn)算符“=”將其右側(cè)的表達(dá)式求出結(jié)果,賦給其左側(cè)的變量。例如:

inti;i=4*(1+2);//i的值變?yōu)?2

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

inti=2.8*4;//結(jié)果為11,而不是11.2

賦值運(yùn)算符的結(jié)合性是從右至左的,因此,C++程序中可以出現(xiàn)連續(xù)賦值的情況。另外,還有一類復(fù)合運(yùn)算符:a+=b 等價(jià)于 a=a+ba-=b 等價(jià)于 a=a-ba*=b 等價(jià)于 a=a*ba/=b 等價(jià)于 a=a/ba%=b 等價(jià)于 a=a%ba<<=b 等價(jià)于 a=a<<ba>>=b 等價(jià)于 a=a>>ba&=b 等價(jià)于 a=a&ba^=b 等價(jià)于 a=a^ba|=b 等價(jià)于 a=a|b

使用賦值運(yùn)算符需要注意的是,運(yùn)算符左邊必須是一個(gè)左值(lvalue),即它必須代表一個(gè)有效的內(nèi)存地址,必須能給它賦值。常量不能作為左值,一般的表達(dá)式如a+b*c也不能作為左值,因?yàn)樗淮硪粋€(gè)值,不代表一個(gè)內(nèi)存地址。例如,以下語句錯(cuò)誤:

a+b=a;【例】若變量a是int類型,并執(zhí)行了語句:a='A'+1.6;,則正確的敘述是

。

A.a的值是字符C B.a的值是浮點(diǎn)型

C.不允許字符型和浮點(diǎn)型相加

D.a的值是字符'A'的ASCII值加上1。答:a='A'+1.6中1.6轉(zhuǎn)換為int數(shù)即1。本題答案為:D?!纠恳韵鲁绦虻妮敵鼋Y(jié)果是

#include<stdio.h>main(){inta=3;printf("%d\n",(a+a-=a*a));}A.–6 B.12C.出錯(cuò) D.-12

答:a+a-=a*a計(jì)算錯(cuò)誤,該表達(dá)式中,*運(yùn)算符優(yōu)先級(jí)最高,先執(zhí)行a*a返回9,+運(yùn)算符次之,執(zhí)行a+a得到6,再執(zhí)行6-=9,賦值運(yùn)算符右邊是常量,出現(xiàn)錯(cuò)誤。本題答案為:C。2.3.3等值、關(guān)系和邏輯運(yùn)算符等值、關(guān)系和邏輯運(yùn)算符的運(yùn)算結(jié)果為true(真)或false(假),分別用值非0(true)或0(false)表示。C++中的關(guān)系和邏輯運(yùn)算符如下:

!(邏輯反),<(小于),

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

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

!=(不等于),&&(邏輯與),

||(邏輯或)【例】設(shè)intx=1,y=2;表達(dá)式(!x||y--)的值是

。

A.0 B.1C.2 D.-1

答:先計(jì)算!x返回0,再計(jì)算y--返回1,兩者進(jìn)行邏輯或運(yùn)算,返回1。本題答案為:B?!纠恳延卸x:intx=3,y=4,z=5,則表達(dá)式!(x+y)+z-1&&y+z/2的值是

。

A.6 B.0C.2 D.1

答:(x+y)返回7,!(x+y)返回0,!(x+y)+z-1=4即為邏輯真(1),y+z/2=6即為邏輯真(1),兩者執(zhí)行邏輯與運(yùn)算返回1。本題答案為:D。2.3.4自增、自減運(yùn)算符自增(++)、自減(--)運(yùn)算符為變量的增1和減1提供了緊湊格式:

a++ 等價(jià)于a=a+1a-- 等價(jià)于a=a-1

需要說明的是,自增、自減符號(hào)既可位于變量的前面,也可位于變量的后面。在單獨(dú)作為一個(gè)表達(dá)式時(shí),++a和a++效果一樣,都是將變量a自增1。若作為一個(gè)復(fù)雜表達(dá)式的一部分,前綴++表示先將其后面的變量值增1,然后將增1后的變量參與表達(dá)式運(yùn)算,而后綴++表示將其前面的變量先參與表達(dá)式運(yùn)算,然后變量本身增1。例如,若a=1,b=2,則(a++)+b的結(jié)果為3,而(++a)+b的結(jié)果為4。自減運(yùn)算符含義類似?!纠緾語言中,關(guān)于自增和自減運(yùn)算符使用正確的是

。

A.10++ B.(x+y)--C.d+++d+++d++ D.++(a-b)

答:++不能作用于常量和表達(dá)式。本題答案為:C?!纠恳阎篿nti=6,j;則語句j=(++i)+(i++)后的j值是

。

A.4 B.14C.13 D.15

答:先執(zhí)行++i返回7(i=7),再執(zhí)行i++返回7(i=8),所以j=7+7=14。本題答案為:B。2.3.5條件運(yùn)算符條件運(yùn)算符是C++中惟一具有3個(gè)操作數(shù)的運(yùn)算符,其格式如下:表達(dá)式1?表達(dá)式2:表達(dá)式3

它的運(yùn)算方式為:先計(jì)算表達(dá)式1的值,如果其值為非零(真),則表達(dá)式2的值就是整個(gè)表達(dá)式的最終結(jié)果;否則表達(dá)式3的值就是整個(gè)表達(dá)式的值?!纠咳魒=1,x=2,y=3,z=4,則條件表達(dá)式w>x?w:y<z?y:z的結(jié)果是

。

A.4 B.3C.2 D.1

答:由于w>x為假,返回表達(dá)式y(tǒng)<z?y:z,又由于y<z為真,返回y的值即3。本題答案為:B?!纠咳艚o定條件表達(dá)式(M)?(a++):(a--),則其中表達(dá)式(M)

。

A.和(M==0)等價(jià) B.和(M==1)等價(jià)

C.和(M!=0)等價(jià) D.和(M!=1)等價(jià)答:(M)條件表達(dá)式的結(jié)果是一個(gè)邏輯值,表示M是否為真,它與M!=0等價(jià),因?yàn)镸為真時(shí),M!=0亦為真,M為假時(shí),M!=0亦為假。所以本題答案為C。2.3.6位運(yùn)算符位(bit)是計(jì)算機(jī)中表示信息的最小單位,一般用0和1表示。一個(gè)字符在計(jì)算機(jī)中用8個(gè)位表示,8個(gè)位組成一個(gè)字節(jié)。需要將我們通常所習(xí)慣的十進(jìn)制數(shù)表示為二進(jìn)制、八進(jìn)制或十六進(jìn)制數(shù)來理解對(duì)位的操作。位運(yùn)算符的運(yùn)算對(duì)象必須為整數(shù),C++中所有的位運(yùn)算符如下:

~(按位求反),<<(左移),

>>(右移),&(按位與),

^(按位異或),|(按位或)【例】將短整型變量a的低8位全變?yōu)?,高8位保留原狀,應(yīng)進(jìn)行的運(yùn)算是

。答:將a與[0000000011111111]2即[377]8進(jìn)行按位或即可。本題答案為:a=a|0377。

a:xxxxxxxxyyyyyyyy|0000000011111111xxxxxxxx11111111【例】使短整型變量a的低4位翻轉(zhuǎn)(即0變?yōu)?,1變?yōu)?),應(yīng)進(jìn)行的運(yùn)算是

。答:將a與[0000000000001111]2即[17]8進(jìn)行按位異或即可。本題答案為:a=a^017。

a:xxxxxxxxxxxxyyyy^0000000000001111xxxxxxxxxxxxzzzz2.3.7sizeof運(yùn)算符

sizeof運(yùn)算符返回其后的表達(dá)式或類型標(biāo)識(shí)符所表示的數(shù)在內(nèi)存中所占字節(jié)的多少,它有兩種形式:

?

sizeof(類型標(biāo)識(shí)符);?

sizeof表達(dá)式;sizeof可以接受的類型標(biāo)識(shí)符很多,如sizeof(int),sizeof(float),sizeof(int*),sizeof(int&),sizeof(int[3])等。對(duì)表達(dá)式施加sizeof運(yùn)算符時(shí),返回的是表達(dá)式運(yùn)算結(jié)果的數(shù)據(jù)類型所占據(jù)的內(nèi)存空間?!纠咳粲衒loatx;則sizeof(x)和sizeof(float)兩種描述

A.都正確 B.都錯(cuò)誤

C.前者正確 D.后者正確答:本題答案為:A。2.3.8運(yùn)算符優(yōu)先級(jí)運(yùn)算符優(yōu)先級(jí)決定了在表達(dá)式中各個(gè)運(yùn)算符執(zhí)行的先后順序。高優(yōu)先級(jí)運(yùn)算符先于低優(yōu)先級(jí)運(yùn)算符進(jìn)行運(yùn)算。如根據(jù)先乘除后加減的原則,表達(dá)式“a+b*c”會(huì)先計(jì)算b*c,得到的結(jié)果再和a相加。在優(yōu)先級(jí)相同的情形下,則按從左到右的順序進(jìn)行運(yùn)算。當(dāng)表達(dá)式中出現(xiàn)了括號(hào)時(shí),會(huì)改變優(yōu)先級(jí)。先計(jì)算括號(hào)中的子表達(dá)式值,再計(jì)算整個(gè)表達(dá)式的值。教材中列出了C++的所有運(yùn)算符集,依優(yōu)先級(jí)從高到低排列。【例】若有定義intnum=7,sum=7;則計(jì)算表達(dá)式sum=num++,sum++,++num后sum的值為

。

A.7 B.8C.9 D.10

答:“sum=num++,sum++,++num”是一個(gè)逗號(hào)表達(dá)式,由于逗號(hào)運(yùn)算符的優(yōu)先級(jí)最低,從左向右執(zhí)行sum=num++、sum++、++num。本題答案為:B?!纠恳阎猧ntx=6;則執(zhí)行x+=x-=x*x語句后,x的值是

。

A.36 B.-60C.60 D.-24

答:先計(jì)算x*x=36(x=6),再計(jì)算x-=36,即x=x-36=-30,x-=x*x表達(dá)式返回x值即-30,最后計(jì)算x+=-30,即x=x+(-30)=-60。本題答案為:B。2.3.9表達(dá)式可以將表達(dá)式理解為用于計(jì)算的公式,它由運(yùn)算符、運(yùn)算數(shù)和括號(hào)組成。最簡(jiǎn)單的表達(dá)式只有一個(gè)常量或變量,當(dāng)表達(dá)式中有兩個(gè)或多個(gè)運(yùn)算符時(shí),表達(dá)式稱為復(fù)雜表達(dá)式,其中運(yùn)算符執(zhí)行的先后順序由它們的優(yōu)先級(jí)和結(jié)合性決定。執(zhí)行表達(dá)式所規(guī)定的運(yùn)算,所得到的結(jié)果值便是表達(dá)式的值。(1)算術(shù)表達(dá)式由算術(shù)運(yùn)算符和位操作運(yùn)算符組成的表達(dá)式,其表達(dá)式的值是一個(gè)數(shù)值,表達(dá)式的類型由運(yùn)算符和運(yùn)算數(shù)確定。

(2)邏輯表達(dá)式由邏輯運(yùn)算符組成的表達(dá)式。其表達(dá)式值類型為邏輯型,一般地,真用1表示,假用0表示。例如,已知intn=2,!n&&5就是一個(gè)邏輯表達(dá)式。(3)關(guān)系表達(dá)式由關(guān)系運(yùn)算符組成的表達(dá)式。其表達(dá)式的值的類型為邏輯型,一般地,真用1表示,假用0表示。例如,已知intn=2,n>=5就是一個(gè)關(guān)系表達(dá)式。

(4)賦值表達(dá)式由賦值運(yùn)算符組成的表達(dá)式。例如,已知intn=2,n+=10就是一個(gè)賦值表達(dá)式。(5)條件表達(dá)式由三目運(yùn)算符組成的表達(dá)式。條件表達(dá)式的值取決于?號(hào)前面的表達(dá)式,該表達(dá)式的值為非零時(shí),整個(gè)表達(dá)式的值為:號(hào)前面表達(dá)式的值,否則為:號(hào)后面表達(dá)式的值。條件表達(dá)式的類型是:號(hào)前和后兩個(gè)表達(dá)式中類型高的一個(gè)表達(dá)式的類型。例如,已知intn=2,n>5?n++:n--就是一個(gè)條件表達(dá)式。(6)逗號(hào)表達(dá)式用逗號(hào)將若干個(gè)表達(dá)式連起來組成的表達(dá)式。該表達(dá)式的值是組成逗號(hào)表達(dá)式的若干個(gè)表達(dá)式中最后一個(gè)表達(dá)式的值,類型也是最后一個(gè)表達(dá)式的類型。逗號(hào)表達(dá)式計(jì)算值的順序是從左至右逐個(gè)表達(dá)式分別計(jì)算。例如,已知intn=2,那么n+=3,n=15,n-=10就是一個(gè)逗號(hào)表達(dá)式,該表達(dá)式的值為5。【例】若變量已正確定義并賦值,為合法的表達(dá)式的是

A.a=a+1; B.a=7+b+c,a++C.int(12.5%2) D.a=a+1=c+b

答:選項(xiàng)A以分號(hào)結(jié)束,不是表達(dá)式;選項(xiàng)B是一個(gè)逗號(hào)表達(dá)式,先將7+b+c賦給a,然后使a增1;選項(xiàng)C中運(yùn)算符%只能作用于整數(shù),不是表達(dá)式;選項(xiàng)D中a+1=c+b不是合法的表達(dá)式。本題答案為:B。【例】設(shè)x、y、t均為int型變量,則執(zhí)行語句:x=y=3;t=++x||++y后,y的值為

。

A.不定值 B.4C.3 D.1

答:在語句t=++x||++y中,++x返回4不為假,故不會(huì)執(zhí)行++y。本題答案為:C。2.3.10數(shù)據(jù)類型轉(zhuǎn)換

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

1.隱式類型轉(zhuǎn)換隱式類型轉(zhuǎn)換是由編譯器自動(dòng)完成的類型轉(zhuǎn)換。當(dāng)編譯器遇到不同類型的數(shù)據(jù)參與同一運(yùn)算時(shí),會(huì)自動(dòng)將它們轉(zhuǎn)換為相同類型后再進(jìn)行運(yùn)算,賦值時(shí)會(huì)把所賦值的類型轉(zhuǎn)換為與被賦值變量類型一樣。隱式類型轉(zhuǎn)換按從低到高的順序進(jìn)行,如圖2.1所示。圖2.1數(shù)據(jù)類型轉(zhuǎn)換的順序2.顯式類型轉(zhuǎn)換顯式類型轉(zhuǎn)換是由程序員顯式指出的類型轉(zhuǎn)換,轉(zhuǎn)換形式有兩種:

?

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

?(類型名)表達(dá)式其中,“類型名”是任何合法的C++數(shù)據(jù)類型,例如float、int等。其功能是通過“類型名”顯式地將“表達(dá)式”值轉(zhuǎn)換成相應(yīng)數(shù)據(jù)類型的值。【例】若有定義:

inta=2,b=3;floatx=3.5,y=2.5;

則下面表達(dá)式的值為____。

(float)(a+b)/2+(int)x%(int)y

答:本題答案為:3.500000。2.4復(fù)合數(shù)據(jù)類型復(fù)合數(shù)據(jù)類型包括枚舉(enum)、結(jié)構(gòu)體(struct)、共用體(unoin)、位域和用戶自定義類型等,此外還有由基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型引申而來的數(shù)據(jù)類型,包括數(shù)組、指針、引用等。2.4.1枚舉類型枚舉類型定義了一些整型符號(hào)常量的集合,其格式如下:

enum類型名{標(biāo)識(shí)符1,標(biāo)識(shí)符2,…,標(biāo)識(shí)符n};

其中,“標(biāo)識(shí)符1”至“標(biāo)識(shí)符n”表示一些整型符號(hào)常量,它們默認(rèn)由系統(tǒng)賦予整數(shù)值:“標(biāo)識(shí)符1”的值為0,“標(biāo)識(shí)符2”的值為1,……,“標(biāo)識(shí)符n”的值為n-1,序列中每個(gè)標(biāo)識(shí)符的值比前一個(gè)標(biāo)識(shí)符大1。例如:

enumBoolean{No,Yes};//No等于0,Yes等于1

程序員也可以自己定義標(biāo)識(shí)符的值,定義方式是直接在定義語句的標(biāo)識(shí)符后賦值。那些沒有顯式賦值的枚舉值還是比前一個(gè)標(biāo)識(shí)符值大1,例如:

enumColor{Red=-2,Yellow,Green=2,Blue};

這樣有:Red=-2,Yellow=-1,Green=2,Blue=3。枚舉集合前加上的標(biāo)識(shí)符可以代表這一枚舉類型,用于變量定義。例如:

enumDay{Mon,Tue,Wed,Thu,Fri,Sat,Sun}; enumDaytoday,tomorrow;//定義2個(gè)枚舉變量則有:

today=Mon; //合法,today值為0tomorrow=today; //合法,tomorrow值為0intn=today; //合法,n值為0tomorrow=3; //不合法,不能直接賦整數(shù)值【例】設(shè)有如下枚舉類型定義:

enumlanguage{Basic=3,Assembly,Ada=100,COBOL,Fortran};枚舉量Fortran的值為

A.4 B.7C.102 D.103

答:在枚舉常量Ada指定值為100,所以COBOL的值應(yīng)為101,F(xiàn)ortran的值應(yīng)為102。本題答案為:C。2.4.2結(jié)構(gòu)體在C++中可用結(jié)構(gòu)體將不同類型的數(shù)據(jù)構(gòu)成一個(gè)整體,成為一個(gè)新的數(shù)據(jù)類型,稱為結(jié)構(gòu)體類型。結(jié)構(gòu)體類型由各個(gè)成員構(gòu)成,有時(shí)也將這些成員稱為數(shù)據(jù)域,簡(jiǎn)稱為域。結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的說明格式如下:

struct[結(jié)構(gòu)體名]

//結(jié)構(gòu)體類型說明

{成員類型成員1;...

成員類型成員n;}[結(jié)構(gòu)體變量名] //結(jié)構(gòu)體變量定義其中,“結(jié)構(gòu)體名”和“結(jié)構(gòu)體變量名”都可以省略。省略前者表示說明了一個(gè)無名結(jié)構(gòu)體類型和定義了具有該類型的變量,省略后者表示僅僅說明了一個(gè)結(jié)構(gòu)體類型。

例如,說明一個(gè)具有姓名和年齡的結(jié)構(gòu)體類型person的語句如下:

structperson {charname[10]; intage; };

上面只是說明了一個(gè)名稱為person的結(jié)構(gòu)體類型,但沒有定義具有該結(jié)構(gòu)體類型的變量,我們可以像使用系統(tǒng)預(yù)定義數(shù)據(jù)類型一樣定義結(jié)構(gòu)體類型變量:

structpersonjohn;//定義一個(gè)person型變量john

以上兩個(gè)語句可以合在一起:

structperson {charname[10]; intage; }john;【例】有如下定義:

structdate{intyear;intmonth;intday;};structworklist{charname[20];charsex;structdatebirthday;}person;

對(duì)結(jié)構(gòu)體變量person的出生年份進(jìn)行賦值時(shí),下面正確的賦值語句是

A.year=1958 B.birthday.year=1958C.person.birthday.year=1958D.person.year=1958

答:結(jié)構(gòu)體變量person的birthday又是一個(gè)結(jié)構(gòu)體變量,對(duì)其year的引用應(yīng)是person.birthday.year。本題答案為:C。2.4.3共用體共用體的定義形式和用法類似于結(jié)構(gòu)體,但結(jié)構(gòu)體中的每個(gè)成員在內(nèi)存中占有獨(dú)立的存儲(chǔ)位置,而共用體的各個(gè)成員共享一塊內(nèi)存,所以,在任意時(shí)刻只能有一種數(shù)據(jù)類型的變量是活躍的。共用體類型和共用體變量的說明格式如下:

union共用體名 //共用體類型說明

{成員類型成員1;...

成員類型成員n;}[共用體變量名]; //共用體變量定義其中,“共用體名”和“共用體變量名”都可以省略。省略前者表示說明了一個(gè)無名共用體類型和定義了具有該類型的共用體變量,省略后者表示僅僅說明了一個(gè)共用體類型。【例】以下程序的輸出結(jié)果是

。

#include<stdio.h>unionmyun{ struct {intx,y,z; }u; intk;}a;main(){ a.u.x=4;a.u.y=5;a.u.z=6; a.k=0; printf("%d\n",a.u.x);}

A.4 B.5C.6 D.0

答:變量a是一個(gè)共用體,執(zhí)行a.k=0語句后覆蓋前面的結(jié)果。本題答案為:D。2.4.4位域位域是一種緊縮結(jié)構(gòu)體類型,允許我們用更少的空間存放所需要的數(shù)據(jù)。例如,下面的結(jié)構(gòu)體類型在32位機(jī)器上將占用16個(gè)字節(jié):

structstatus {unsignedintgood; //只取0或1 unsignedintfail; //只取0或1 unsignedintbad; //只取0或1 intval; //取-100~100 };

其中成員good、fail和bad實(shí)際上都只有0和1兩個(gè)值,完全可以用一個(gè)位(bit)來表示。值val取值范圍為-100至100,也可用一個(gè)完整的整數(shù)來記錄。可以用位域來重新說明這個(gè)結(jié)構(gòu)體類型,它只占用4個(gè)字節(jié)(至少4個(gè)字節(jié)或4的整數(shù)倍)。【例】以下程序的運(yùn)行結(jié)果是

。

#include<stdio.h>main(){structst{unsigneda:10;unsignedb:12;unsignedc:2;}x;printf("%d\n",sizeof(x));}A.2 B.3C.24 D.不能通過編譯答:位段結(jié)構(gòu)體變量a的總長(zhǎng)度為24個(gè)位,即3個(gè)字節(jié)。本題答案為B。2.4.5用typedef定義自己的變量類型在C++中可以利用typedef定義自己的變量類型,其格式如下:

typedef類型說明;

其中,“類型說明”類似于變量說明,只是變量名用類型名代替了,實(shí)際上,這等于定義了一個(gè)同義詞,這種方式與創(chuàng)建一個(gè)新的類型是不同的。例如:

typedefintwidth;//定義了新類型width,它實(shí)際上是整型

typedefcharstring[10]; //定義了新類型string,它是一個(gè)字符數(shù)組使用自定義類型和使用系統(tǒng)預(yù)定義的類型一樣:

widthn; //等價(jià)于intn;stringname; //等價(jià)于charname[10];使用用戶定義類型,應(yīng)注意以下幾點(diǎn):

?

使用typedef只能定義各種用戶定義類型名,而不能用于定義變量。

?

用戶定義類型相當(dāng)于原類型的別名。例如:

typedefchar*NAME;NAMEp;等價(jià)于:

char*p;

?

typedef并不是作簡(jiǎn)單的字符串替換,與#define的作用不同。

?

typedef定義類型名可嵌套進(jìn)行。

?利用typedef定義類型名有利于程序的移植,并增加程序的可讀性。typedef定義類型步驟:按定義變量方法先寫出定義體如inti;將變量名換成新類型名如intINTEGER;最前面加typedef如typedefintINTEGER;用新類型名定義變量如INTEGERi,j;再如:定義數(shù)組類型

inta[100];intARRAY[100];typedefintARRAY[100];ARRAYa,b,c;【例】若要說明一個(gè)類型名STP,使得定義語句STPs等價(jià)于char *s,以下選項(xiàng)中正確的是

。

A.typedefSTPchar*s; B.typedef*charSTP;C.typedefSTP*char; D.typedefchar*STP;

答:選項(xiàng)A、B和C有語法錯(cuò)誤。本題答案為:D。作業(yè)練習(xí)題22.3、2.4、2.5、2.6

第3章控制語句

算法的基本控制結(jié)構(gòu)有三種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。為此,C++中提供了這三種控制語句,即順序控制語句、選擇控制語句和循環(huán)控制語句。3.1順序控制語句所謂順序結(jié)構(gòu),就是按照語句的順序一條一條地執(zhí)行。順序控制語句是一類簡(jiǎn)單的語句,包括表達(dá)式語句、空語句和輸入輸出語句等。表達(dá)式語句是任何一個(gè)表達(dá)式加上一個(gè)分號(hào)。在C++程序中,有許多表達(dá)式語句。例如,以下都是表達(dá)式語句:

a=1+n*2;x=3,y=10,c=1;a>b?a++:b++;

空語句是指只有一個(gè)分號(hào)的語句(“;”)??梢姡照Z句是一種不做任何操作的語句。該語句用在一些需要一條語句,但又不做任何操作的地方。3.1.1輸出

C++定義了運(yùn)算符“<<”的iostream類,而“<<”就是用于處理內(nèi)部類型的輸出。使用cout輸出流可在屏幕上顯示字符和數(shù)字。C++提供了一些操縱符,可以直接嵌入到輸入/輸出語句中來實(shí)現(xiàn)I/O格式控制。注意:在使用setprecision和setw操縱符時(shí)要在程序開頭包含iomanip.h。表3.1列出了幾個(gè)常用的I/O流類庫操縱符。操縱符名含義dec數(shù)值數(shù)據(jù)采用十進(jìn)制表示hex數(shù)值數(shù)據(jù)采用十六進(jìn)制表示oct數(shù)值數(shù)據(jù)采用八進(jìn)制表示ws提取空白符endl插入換行符,并刷新流ends插入空字符setprecision(int)設(shè)置浮點(diǎn)數(shù)的小數(shù)位數(shù)(包括小數(shù)點(diǎn))setw(int)設(shè)置域?qū)挶?.1常用的I/O流類庫操縱符1.顯示常數(shù)使用cout可以顯示字符串和數(shù)字,并可顯示多個(gè)值。

【例】分析以下程序的執(zhí)行結(jié)果。

#include<iostream.h>voidmain(){cout<<1.2345678<<endl;cout<<1<<2<<3<<4<<"\n";cout<<"VisualC++"<<6.0<<endl;}1.23457//只顯示6個(gè)有效數(shù)字1234VisualC++62.八進(jìn)制和十六進(jìn)制數(shù)的輸出在某些情況下,程序需要以八進(jìn)制或十六進(jìn)制數(shù)的形式輸出。C++提供了簡(jiǎn)單的實(shí)現(xiàn)方法:只要在輸出流中輸出操縱符dec(十進(jìn)制)、oct(八進(jìn)制)或hex(十六進(jìn)制)即可。

注意:一旦使用了進(jìn)制操縱符,該操縱符的作用域一直連續(xù)到程序結(jié)束,或者遇到另一個(gè)進(jìn)制操縱符?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>voidmain(){intn=100;cout<<"十進(jìn)制:"<<dec<<n<<endl;cout<<"八進(jìn)制:"<<oct<<n<<endl;cout<<"十六進(jìn)制:"<<hex<<n<<endl;}

十進(jìn)制:100

八進(jìn)制:144

十六進(jìn)制:643.控制輸出寬度

C++提供的setw操縱符可以指定每個(gè)數(shù)值占用的寬度,即這個(gè)字符占用的最小字符長(zhǎng)度。當(dāng)用setw設(shè)置的寬度小于實(shí)際寬度時(shí),該設(shè)置無效。

注意:setw操縱符只對(duì)緊跟著它的數(shù)值有效。如果要為多個(gè)數(shù)值設(shè)定寬度,必須多次使用setw操縱符。【例】分析以下程序的執(zhí)行結(jié)果。#include<iostream.h>#include<iomanip.h>voidmain(){doublef=123.45;cout<<setw(10)<<1234567890<<endl;cout<<setw(10)<<f<<endl;cout<<setw(8)<<f<<endl;cout<<setw(6)<<f<<endl;cout<<setw(4)<<f<<endl;}執(zhí)行結(jié)果:4.控制輸出精度

C++提供的setprecision操縱符可以設(shè)置顯示數(shù)值的精度。

注意:一旦使用了setprecision操縱符,該操縱符的作用域一直連續(xù)到程序結(jié)束,或者遇到另一個(gè)setprecision操縱符?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>#include<iomanip.h>voidmain(){doubled=123.456789;cout<<d<<endl;cout<<setprecision(7)<<d<<endl;cout<<setprecision(8)<<d<<endl;cout<<setprecision(9)<<d<<endl;}123.457123.4568123.45679123.4567893.1.2輸入

C++提供了輸入流cin,可以利用輸入流cin讀取鍵盤輸入的字符和數(shù)字,并把它賦給指定的變量。從鍵盤上輸入的數(shù)據(jù)通過cin接收,再由提取運(yùn)算符“>>”送到程序指定的變量中。因此,用戶輸入數(shù)據(jù)時(shí)要避免輸入的數(shù)據(jù)超出指定變量的值域?!纠糠治鲆韵鲁绦虻膱?zhí)行結(jié)果。#include<iostream.h>voidmain(){inti,j;cout<<"ij=";cin>>i>>j;cout<<i<<"+"<<j<<"="<<i+j<<endl;}ij=1245<Enter>12+45=573.2選擇控制語句

C++中的選擇控制語句有if語句、if...else語句、if...elseif語句和switch語句。3.2.1if語句

if語句用于在程序中有條件地執(zhí)行某一語句序列,它有如下兩種基本語法格式:

if(條件表達(dá)式)語句; if(條件表達(dá)式) {

語句序列; };【例】以下錯(cuò)誤的語句為

。

A.if(x>y);B.if(x=y)&&(x!=0)x+=y;C.if(x!=y)scanf("%d",&x);elsescanf("%d",&y);D.if(x<y){x++;y++;}

答:if語句的條件必須包含在一個(gè)括號(hào)中。本題答案為:B。3.2.2if...else語句如果希望在“條件表達(dá)式”為真和為假時(shí)分別執(zhí)行不同的語句,則用else來引入條件表達(dá)式為假時(shí)執(zhí)行的語句序列,這就是if...else語句,它根據(jù)不同的條件分別執(zhí)行不同的語句序列,其語法形式如下:

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

語句序列1; } else {

語句序列2; }【例】為了避免在嵌套的條件語句if-else中產(chǎn)生二義性,C語言規(guī)定:else子句總是與

配對(duì)。

A.縮排位置相同的if B.同一行上的ifC.其之后最近的if D.其之前最近的if

答:本題答案為:D?!纠恳韵鲁绦虻妮敵鼋Y(jié)果是

。#include<stdio.h>main(){intx=2,y=-1,z=2;if(x<y)if(y<0)z=0;elsez+=1;printf("%d\n",z);}A.3 B.2C.1 D.0答:x<y為假,直接執(zhí)行printf語句。本題答案為:B?!纠恳韵鲁绦蚺袛噍斎氲哪攴菔欠駷殚c年(凡是能被400整除的,或不能被100整除但能被4整除的年份為閏年)。

#include<iostream.h>voidmain(){ intyear,rem4,rem100,rem400; cout<<"輸入年份:"; cin>>year; rem400=year%400; rem100=year%100; rem4=year%4; if((rem400==0)||((rem4==0)&&(rem100!=0))) cout<<year<<"是閏年"<<endl; else cout<<year<<"不是閏年"<<endl;}程序執(zhí)行:輸入年份:2006↙2006不是閏年3.2.3if...elseif語句

if...elseif語句用于進(jìn)行多重判斷,其語法形式如下:

if(條件表達(dá)式1)語句1; elseif(條件表達(dá)式2)語句2; … elseif(條件表達(dá)式n)語句n; else語句n+1;【例】以下程序?qū)⒂脩糨斎氲姆謹(jǐn)?shù)轉(zhuǎn)換成等級(jí):A(≥90),B(80~89),C(70~79),D(60~69),E(<60)。

#include<iostream.h> voidmain() { floatx; cout<<"分?jǐn)?shù):";cin>>x; if(x>=90)cout<<"A"<<endl; elseif(x>=80)cout<<"B"<<endl; elseif(x>=70)cout<<"C"<<endl; elseif(x>=60)cout<<"D"<<endl; elsecout<<"E"<<endl; }3.2.4switch語句

switch語句也稱為開關(guān)語句,用于有多重選擇的場(chǎng)合,測(cè)試某一個(gè)變量具有多個(gè)值時(shí)所執(zhí)行的動(dòng)作。switch語句的語法形式為:

switch(整型表達(dá)式) { case整型常量表達(dá)式1:語句序列1; case整型常量表達(dá)式2:語句序列2; … case整型常量表達(dá)式n:語句序列n; default:語句n+1; }switch語句的執(zhí)行順序是:首先計(jì)算switch語句中“整型表達(dá)式”的值,然后在case語句中尋找值相等的整型常量表達(dá)式,并以此為入口標(biāo)號(hào),由此開始順序執(zhí)行。如果沒有找到相等的整型常量表達(dá)式,則從“default:”開始執(zhí)行。使用switch語句應(yīng)注意下列問題:(1)整型表達(dá)式包括字符型或枚舉型表達(dá)式。(2)各常量表達(dá)式的值不能相同,但次序不影響執(zhí)行結(jié)果。(3)每個(gè)case分支可以有多條語句,但不必用{}。

(4)每個(gè)case語句只是一個(gè)入口標(biāo)號(hào),并不能確定執(zhí)行的終止點(diǎn),因此每個(gè)case分支的最后應(yīng)該加break語句,用來結(jié)束整個(gè)switch結(jié)構(gòu),否則會(huì)從入口點(diǎn)開始一直執(zhí)行到switch結(jié)構(gòu)的結(jié)束點(diǎn)。(5)當(dāng)若干分支需要執(zhí)行相同操作時(shí),可以使多個(gè)case分支共用一組語句。如:

case1: case2:printf(“case1和2\n”);

注意:可以使用break退出switch語句的執(zhí)行。如:

case1:printf(“case1\n”);break; case2:printf(“case2\n”);【例】有以下程序:

#include<stdio.h>main(){inta=15,b=21,m=0;switch(a%3){case0:m++;break;case1:m++;switch(b%2){default:m++;case0:m++;break;}}printf("%d\n",m);}

程序運(yùn)行后的輸出結(jié)果是

。A.1 B.2C.3 D.4

答:a%3=0,執(zhí)行m++和printf語句。本題答案為:A。3.3循環(huán)控制語句循環(huán)控制語句提供重復(fù)處理的能力,當(dāng)某一特定條件為真時(shí),循環(huán)語句就重復(fù)執(zhí)行,并且每循環(huán)一次,就會(huì)測(cè)試一下循環(huán)條件,如果為假,則循環(huán)結(jié)束,否則繼續(xù)循環(huán)。

C++支持三種格式的循環(huán)控制語句:while、do和for語句。三者可以完成類似的功能,不同的是它們控制循環(huán)的方式。3.3.1while語句

while語句的一般形式為:

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

當(dāng)“條件表達(dá)式”的運(yùn)算結(jié)果為真時(shí),則重復(fù)執(zhí)行“語句”。每執(zhí)行一次“語句”后,就會(huì)重新計(jì)算一次“條件表達(dá)式”,當(dāng)該表達(dá)式的值為假時(shí),循環(huán)結(jié)束?!纠吭O(shè)有以下程序段:

intx=0,s=0;while(!x!=0)s+=++x;printf("%d",s);

則______。

A.運(yùn)行程序段后輸出0 B.運(yùn)行程序段后輸出1C.程序段中的控制表達(dá)式是非法的 D.程序段執(zhí)行無限次答:x=0,!x=1,!x!=0為真,執(zhí)行s+=++x,++x返回1,x=1,s=s+1=1;x=1,!x=0,!x!=0為假,不再執(zhí)行循環(huán)語句。本題答案為:B。3.3.2do語句

do語句的一般形式為:

do

語句;

while(條件表達(dá)式);do語句每一次循環(huán)執(zhí)行一次“語句”,然后計(jì)算“條件表達(dá)式”是否為真,如果是,則繼續(xù)執(zhí)行循環(huán),否則結(jié)束循環(huán)。與while語句不同的是,do循環(huán)中的“語句”至少會(huì)執(zhí)行一次,而while語句當(dāng)條件第一次就不滿足時(shí),語句一次也不會(huì)被執(zhí)行?!纠坑幸韵鲁绦蚨危?/p>

intn=0,p;do{scanf("%d",&p);n++;}while(p!=12345&&n<3);

此處do-while循環(huán)的結(jié)束條件是

A.p的值不等于12345并且n的值小于3B.p的值等于12345并且n的值大于等于3C.p的值不等于12345或者n的值小于3D.p的值等于12345或者n的值大于等于3

答:do-while循環(huán)的結(jié)束條件為!(p!=12345&&n<3),即p==12345||n>=3。本題答案為:D。3.3.3for語句

for語句通常用于預(yù)先知道循環(huán)次數(shù)的情況,其一般形式為:

for(初始化語句;表達(dá)式1;表達(dá)式2)語句;

其中,“初始化語句”可以是一個(gè)定義語句或表達(dá)式語句,一般用于對(duì)一組變量進(jìn)行初始化或賦值。“表達(dá)式1”用于控制循環(huán),當(dāng)它的值為真時(shí),循環(huán)會(huì)繼續(xù)下去,而它一旦為假,則終止循環(huán)。“表達(dá)式2”在每次循環(huán)執(zhí)行完成后執(zhí)行,一般用于改變控制循環(huán)的變量?!罢Z句”在“表達(dá)式1”為真時(shí)執(zhí)行。具體來說,for循環(huán)的執(zhí)行過程為:①執(zhí)行“初始化語句”;②計(jì)算“表達(dá)式1”的值;③如果“表達(dá)式1”的值為真,先執(zhí)行后面的“語句”,再執(zhí)行“表達(dá)式2”,然后轉(zhuǎn)向步驟②;如果“表達(dá)式1”的值為假,則結(jié)束循環(huán)?!纠恳韵鲁绦虻妮敵鼋Y(jié)果是

。#include<stdio.h>main(){inta=0,i;for(i=1;i<5;i++){switch(i) { case0: case3:a+=2; case1: case2:a+=3; default:a+=5; }}pri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論