C++初學者入門全篇_第1頁
C++初學者入門全篇_第2頁
C++初學者入門全篇_第3頁
C++初學者入門全篇_第4頁
C++初學者入門全篇_第5頁
已閱讀5頁,還剩380頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++初學者指南第一篇C++基礎

如果說有一種語言定義了當今編程的實質(zhì),那么它就是C++。它是高性能軟件開發(fā)的杰出語言。它的語法已經(jīng)成為專業(yè)編程語言的標準,并且它的設計思想在計算界引起深刻的反響。

Java和C#語言都是從C++繼承而來的。簡而言之,要成為專業(yè)的編程人員就意味著要深刻理解C++。它是現(xiàn)代編程的基礎。

本篇旨在介紹C++,包括它的歷史,它的設計思想,以及幾個最重要的特性。學習一門編程語言最困難的事情就是所有的元素都不是單獨孤立存在的。相反,構(gòu)成語言的各個部分是相互協(xié)作,一起工作的。這種相關性使得我們很難討論C++的一個方面而不去考慮其它方面。為了克服這個困難,本篇對幾個C++特性進行了簡單的介紹,包括C++程序的通用形式,一些基本的控制語句,以及運算符。本篇不會涉及過多的細節(jié),更注重C++程序中通用的概念。

必備技能1.1C++歷史簡介

C++是從C語言發(fā)展而來的。這一點不難理解,因為C++是構(gòu)筑的C語言的基礎之上的。然而,C++是C語言的超集。C++擴展并增強了C語言,支持面向?qū)ο蟮木幊蹋ㄟ@點在本篇的后面會進行描述)。C++同時對C語言做了改進,包括擴展了例行程序庫集。然而大部分的C++特性是直接從C繼承而來的。因此,為了充分理解和欣賞C++,我們必須深入了解C語言是如何運作的。

C:現(xiàn)代編程時代的開始

C語言的發(fā)明定義了現(xiàn)代編程時代的開始。它的影響不應該被低估,因為它從根本上改變了人們考慮和實現(xiàn)程序的方法。它的設計思想和語法已經(jīng)影響到了每一個主流的編程語言。C語言是計算發(fā)展的主要的,革命性的推動力之一。C語言由DennisRitchie在DECPDP-11電腦上,在UNIX操作系統(tǒng)下發(fā)明并實現(xiàn)的。C語言是從一種古老的叫做BCPL的語言發(fā)展而來。BCPL是由MartinRichards開發(fā)的。BCPL語言對由KenThompson發(fā)明的B語言產(chǎn)生著深刻的影響,而B語言最終在20世紀70年代發(fā)展成C語言。

在C語言發(fā)明之前,計算機語言被設計出來或者是為了進行學術計算,或者是為官方的委員們所使用。而C卻不同。它是一群真實的程序員設計、實現(xiàn)并開發(fā)出來的。它反映了這些人完成編程工作的方法。它的特性是這群實際使用這個語言的人們反復推敲,打磨,測試的結(jié)果。因此,C語言吸引了眾多的擁護者,并迅速成為全世界編程人員的選擇。

C語言的發(fā)展經(jīng)歷了20世紀60年代的結(jié)構(gòu)化編程的革命。在此之前,大型程序是難以書寫的,因為程序的邏輯趨向于退化成“意大利面條式的代碼”,充斥著難以理解的,混亂的轉(zhuǎn)跳,函數(shù)調(diào)用和返回。結(jié)構(gòu)化編程通過增加很好的控制語句,帶有局部變量的子程序段和其它的一些改進解決了這個問題。結(jié)構(gòu)化編程使得編寫巨大的程序成為了可能。盡管還有別的結(jié)構(gòu)化的編程語言,例如Pascal,C卻是第一個功能強大,富于表達,能書寫出優(yōu)美代碼的結(jié)構(gòu)化語言。它語法簡單易用,并且它的設計思想是程序員掌控一切,而不是語言本身掌控一切,這就使得C語言很快擁有了眾多的擁護者。我們現(xiàn)在來看這點可能有點難以理解,但是C當時確實為編程者帶來了他們渴望已久的新鮮空氣。因此,C語言很快就在20世紀80年代變成了使用最廣泛的結(jié)構(gòu)化編程語言。

我們需要C++

經(jīng)過前文的描述,你可能會問,那為什么還要發(fā)明C++呢?既然C是很優(yōu)秀的編程語言,我們?yōu)槭裁催€需要別的編程語言呢?這個問題的答案非常復雜??v觀編程技術的發(fā)展歷史,程序復雜度的增加驅(qū)使我們需要更好的方式來管理我們的程序。C++就應運而生了。為了更好地理解增長的程序復雜度與計算機編程語言發(fā)展之間的關系,我們需要簡單回顧一下計算機編程技術發(fā)展的歷史。當計算機剛被發(fā)明出來的時候,人們使用計算機前面的面板,通過撥動開關來發(fā)送二進制的機器指令。這種方式在計算機程序只有幾百行的時候還可以工作。隨著計算機程序的增大,人們發(fā)明了匯編語言,通過使用符號代替機器指令,以便程序員可以處理更大的,更復雜的程序。第一個被廣泛使用的計算機語言是FORTRAN。FORTRAN語言在起初給人的印象是非常深刻的,當時幾乎沒有語言能實現(xiàn)編寫整潔,易于理解的程序。20世紀60年代,結(jié)構(gòu)化編程誕生了,這正是諸如C語言一樣的語言所鼓勵的編程方法。通過結(jié)構(gòu)化的編程方法,很輕松的編寫大型程序第一次成為了可能。然而,即使是使用結(jié)構(gòu)化的編程方法,一旦一個項目到達了一定的規(guī)模,其復雜度也就超過了程序員所能管理的范圍。在20世紀70年代,很多項目幾乎都處于這種境地。為了解決這種問題,出現(xiàn)了一種新的編程方法:面向?qū)ο缶幊?。通過使用面向?qū)ο缶幊?,程序員可以處理更大的,更復雜的程序。而C語言是不支持這種面向?qū)ο缶幊谭椒ǖ?。于是,人們對面向?qū)ο蟮腃的渴望就直接導致了C++的誕生??梢?,自從計算機發(fā)明以來,編程的方式已經(jīng)發(fā)生了巨大的變化。

最后一點,盡管C是世界上最受歡迎的專業(yè)編程語言之一,也有復雜的程序是C不能完成的。一旦一個程序的規(guī)模達到了一定的大小,其復雜度就會增加,以至于很難從整體上對其進行把握。C++的目的就是突破這種障礙,幫助編程人員理解并管理更大,更復雜的程序。

C++的誕生

C++由BjarneStroustrup于1979年在位于新澤西州MurrayHill的貝爾實驗室成功發(fā)明。起初它的名字叫“帶有類的C”,后來在1983年更名為C++。Stroustrup在C的基礎上構(gòu)建了C++,因此C++包括C的所有特性和優(yōu)點。它還繼承了C的理念:程序員而不是程序掌控一切。有一點必須明確,Stroustrup并沒有創(chuàng)建一個全新的編程語言。相反,它增強了已經(jīng)高度成功的語言。大多數(shù)Stroustrup為C增加的特性都是為了支持面向?qū)ο蟮木幊?。從本質(zhì)上來講,C++就是支持面向?qū)ο蟮腃。通過在C的基礎上構(gòu)建C++,就實現(xiàn)了到面向?qū)ο缶幊痰钠交^渡。C程序員不必重新學習一門新的語言,只需要學習那些新增的特性,就能收獲面向?qū)ο缶幊處淼暮锰?。在設計C++語言的時候,Stroustrup清楚地知道在增加支持面向?qū)ο缶幊痰奶匦詴r,保持原有C的特性,包括C的高效,靈活和C的設計理念是非常重要的。幸運的是,他的目標實現(xiàn)了。C++在提供了面向?qū)ο蟮木幊虄?yōu)點同時,還保留了C的靈活。盡管發(fā)明C++的初衷是為了輔助管理那些大型的程序,但它絕不僅限于此。實際上,C++的面向?qū)ο筇匦钥梢员挥行У匾玫綄嶋H上任何程序中。C++可以廣泛地被用來開發(fā)諸如編輯器,數(shù)據(jù)庫,個人文件系統(tǒng),網(wǎng)絡工具,通信程序等,這些都非常常見。由于C++保留了C的高效性,大量的高性能系統(tǒng)軟件都是用C++開發(fā)的。同樣,C++也經(jīng)常被用來開發(fā)windows程序。

C++的發(fā)展

C++被發(fā)明后,經(jīng)過了三次大的修訂,每次修訂都對語言自身做了增加和改動。第一次和第二修訂分別是在1985年和1990年。第三次修訂發(fā)生在C++標準化的過程中。幾年前(現(xiàn)在來看,應該是十幾年前了),人們開始進行C++的標準化工作。那時,建立了由美國國家標準研究所(ANSI)和國際標準組織(ISO)合作的標準化組織組。建議標準的第一次草案是在1994年1月25日完成的。在這份草案中,ANSI/ISO聯(lián)合委員會保留了Stroustrup當初定義的特性,并增加了一些新的特性??偟膩碚f,這份最初的草案反映了當時C++的情況。在此之后不久,發(fā)生了一件事情,促使了聯(lián)合委員會大大地擴展了該標準:由AlexanderStepanov提出的標準模板庫的創(chuàng)建。標準模板庫是一套我們可以用之處理數(shù)據(jù)的通用程序的集合。通用模板庫很強大,也很簡潔優(yōu)雅。但是它很巨大。在第一次草案之后,委員會曾經(jīng)投票來決議是否在標準C++中增加標準模板庫。標準模板庫的增加使得C++大大超出了起初定義的范圍。對標準模板庫和其它一些特性的增加使得C++標準化的步伐減慢了許多。完全可以說C++的標準化工作比人們期望的時間要長許多。在整個過程中,C++中加入了許多新的特性,并做了許多小的改動。實際上,由該聯(lián)合委員會制定的C++比Stroustrup當初設計的C++要復雜很多。最終的草案在1997年12月14日通過,ANSI/ISO標準C++在1998年成為現(xiàn)實。這就是人們通常說的標準C++。本書描述的都是標準的C++。本書描述的C++是所有主流C++編譯器,包括微軟的visualC++都支持的C++。因此本書中的代碼和信息是完全可移植的。必備技能1.2:C++與Java和C#的關系

除了C++之外,還有兩個重要的現(xiàn)代編程語言:Java和C#。Java是有SunMicrosystems公司開發(fā)的,而C#則是由微軟公司開發(fā)的。由于人們有時會對C++與Java和C#的關系產(chǎn)生一些混淆,這里有必要對此介紹一下。C++是Java和C#之父。盡管Java和C#都是在C++的基礎上對語言的特性進行了一些增加,刪除和改動,但是總體上來說它們?nèi)叩恼Z法是幾乎相同的。進一步來說,C++所采用的對象模型和Java,C#的都是相似的。最后,三者給人的總體感覺也是非常相近的。這就意味著,一旦學會了C++,就能很輕易地學習Java和C#。

反之亦然,如果你懂Java或者C#學習C++也是很簡單的。這就是為什么Java,C#和C++都是用相同的語法和對象模型了,這也是大量有經(jīng)驗的C++程序員能順地過渡到是Java或者C#的原因。它們之間的區(qū)別在于各自設計針對的計算環(huán)境不同。C++是針對指定類型的CPU和操作系統(tǒng)而設計的高性能的語言。例如:如果你想寫在windows操作系統(tǒng)下,因特爾奔騰系列的CPU上運行的程序,那么C++是最好的選擇。專家答疑

問:

Java和C#都實現(xiàn)了跨平臺和可移植的編程,C++為什么不能了?

答:

Java和C#之所以能實現(xiàn)跨平臺,可移植的編程,而C++不能是因為它們的編譯器生成的目標代碼不同。就C++而言,編譯器的輸出是機器代碼,這是CPU可以直接執(zhí)行的。因此它是緊密和指定的CPU以及操作系統(tǒng)相關的。如果想讓C++程序在不同的系統(tǒng)上運行,則需要針對該目標系統(tǒng)進行代碼的重新編譯。為了讓C++程序可以在不同的環(huán)境上運行,就需要生成不同的可執(zhí)行版本。Java和C#是通過把代碼編譯成偽碼,一種中間語言。就Java而言,這種偽碼是在運行時系統(tǒng)上運行的,這就是Java虛擬機。對C#而言,這就是CLR(公共語言運行時)。因此,Java語言的程序可以在任何有java虛擬機的環(huán)境下運行,C#的程序可以在任何實現(xiàn)了CLR的環(huán)境下運行。因為Java和C#的運行時系統(tǒng)處于程序和CPU之間,和C++相比,這就引起了多余的開銷。這就是為什么,對等情況下,C++程序比Java和C#程序運行快的原因了。Java和C#的開發(fā)是為了滿足互聯(lián)網(wǎng)上在線程序的統(tǒng)一編程需求。(C#的設計也是用來簡化軟件構(gòu)件的開發(fā))?;ヂ?lián)網(wǎng)上連接的是許多不同的CPU和操作系統(tǒng)。因此跨平臺和可移植性就成了最重要的著眼點。第一個著眼于這個問題的語言就是Java。Java語言編寫的程序可以在很多不同的環(huán)境下運行。因此,Java程序可以在互聯(lián)網(wǎng)上自由運行。然而這樣做的代價就是犧牲了效率,Java程序的執(zhí)行要比C++程序慢許多。同樣的事情也發(fā)生在C#身上。最終分析,如果你想開發(fā)高性能軟件,就是用C++。如果你想開發(fā)高度可移植的軟件,就是用Java或者C#。最后一點:請記住,C++,java和C#是用來解決不同問題的。這里并沒有那個語言好,那個語言不好的問題,而是那個語言更適合用來完成我們手頭工作的問題。練習:

1.C++語言是從什么語言發(fā)展而來的?

2.C++語言產(chǎn)生的主要原因是什么?

3.C++語言是Java和C#語言之父,對嗎?

答案:

1.C++是從C語言發(fā)展而來的。

2.程序復雜性的不斷增加是產(chǎn)生C++語言的主要原因。

3.

正確。必備技能1.3:面向?qū)ο蟮木幊?/p>

C++的中心是圍繞著面向?qū)ο蟮木幊?。正如前面介紹的那樣,面向?qū)ο蟮木幊淌谴龠MC++產(chǎn)生的主要因素。正是因為這一點,在學習編寫簡單的C++程序之前,理解面向?qū)ο缶幊痰幕舅枷胧欠浅V匾摹?/p>

面向?qū)ο蟮木幊毯芎玫乩昧私Y(jié)構(gòu)化編程的思想,并增加了一些新的概念,能夠更好地組織程序。通常情況下,有兩種方式來組織程序:以代碼為中心或者以數(shù)據(jù)為中心。通過結(jié)構(gòu)化的編程技術,程序通常是以代碼為中心來組織的。這種方法可以被認為是“代碼作用于數(shù)據(jù)”。

面向?qū)ο蟮木幊虅t是以數(shù)據(jù)為中心。程序以數(shù)據(jù)為中心進行組織,主要的原則就是“數(shù)據(jù)控制代碼”。在面向?qū)ο蟮恼Z言中,我們定義數(shù)據(jù)和允許作用于這些數(shù)據(jù)的例行程序段。因此,數(shù)據(jù)的類型明確定義了可以作用在這些數(shù)據(jù)上的操作。

為了支持面向?qū)ο缶幊痰脑瓌t,所有的面向?qū)ο笳Z言,包括C++,都有三個顯著的特點:封裝,多態(tài)和繼承。讓我們一個一個來學習。封裝

封裝是一種編程機制,它把數(shù)據(jù)和處理數(shù)據(jù)的代碼捆綁在一起,這可以防止外部程序錯誤地訪問數(shù)據(jù)和代碼。在面向?qū)ο蟮恼Z言中,數(shù)據(jù)和代碼可以通過黑盒子的方式綁定起來,盒子內(nèi)部是全部必要的數(shù)據(jù)和代碼。當數(shù)據(jù)和代碼以這種方式綁定的時候,此時我們就創(chuàng)建了一個對象。換句話說,一個對象就是支持封裝的設備。專家答疑

問:

我聽說過子程序段的學名為方法,那么方法和函數(shù)是同一回事情嗎?

答:

通常來說,是的。方法在Java里面使用很廣泛。C++則中叫做函數(shù),Java中則被稱作方法。C#程序員同樣使用方法這個術語。因為它已經(jīng)廣泛地被采用了,所以有時候在C++里面,函數(shù)有時候也被稱作方法。

對于一個對象來說,代碼或者數(shù)據(jù)或者兩者都有可能是私有的或者公有的。私有的代碼或者數(shù)據(jù)只能是該對象的其它部分可以訪問和感知的。也就是說,私有的代碼和或者數(shù)據(jù)是不能被對象之外的程序段訪問的。當代碼或者數(shù)據(jù)是公有的,雖然它是被定義在對象中的,但是程序的其它部分都是可以訪問它的。通常情況下,對象的公有部分是用來提供對對象私有元素的可控的訪問接口的。

C++中最基本的封裝單元就是類。一個類定義了對象的通用形式。它同時定義了數(shù)據(jù)和作用于這些數(shù)據(jù)的代碼。C++使用類來構(gòu)建對象。對象是類的實例。因此,一個類實際上是構(gòu)建對象的工廠。

類中的數(shù)據(jù)和代碼稱為類的成員。更詳細一點來說,成員變量,也叫做實例變量,是類定義的數(shù)據(jù)。成員函數(shù)是作用于這些數(shù)據(jù)的操作。函數(shù)在C++中是針對子程序的術語。多態(tài)

多態(tài),字面意思就是多種形態(tài)的意思。它是一種機制,可以允許一個接口來訪問類的通用動作。一個簡單的多態(tài)性的例子就是汽車的方向盤。方向盤(接口)都是一樣的,不管實際中使用了怎樣的轉(zhuǎn)向機制。也就是說,不管你的汽車使用的是手工的轉(zhuǎn)向盤,還是動力的轉(zhuǎn)向盤,或者是齒輪轉(zhuǎn)向盤,方向盤的工作效果都是一樣的:就是把方向盤往左轉(zhuǎn),車就會左轉(zhuǎn),不管使用的是什么樣子的轉(zhuǎn)向盤。這種統(tǒng)一接口的好處就是一旦我們知道了如何掌控方向盤,我們就可以開什么類型的車。

同樣的原理也可以應用在編程上。比如,考慮一個棧,程序可能需要針對三種不同數(shù)據(jù)類型的棧。一個是針對整型數(shù)的,一個是針對浮點型數(shù)據(jù)的,一個是針對字符的。在這種情況下,棧的實現(xiàn)算法是一致的,只是存儲的數(shù)據(jù)類型是不一樣的。在非面向?qū)ο蟮恼Z言中,我們必須創(chuàng)建三個不同的棧的程序,每一個都是用不同的名字。然而,在C++,通過多態(tài),我們就可以創(chuàng)建一個通用的棧,三種不同的數(shù)據(jù)類型都可以存儲。這樣,一旦知道了棧是如何使用的,我們就等于知道了三種不同數(shù)據(jù)類型的棧的用法。

通常,多態(tài)的概念經(jīng)常被表述如下:一個接口,多種方法。意思是說可以通過對一組相關的活動定義一個通用的接口。多態(tài)性通過一個接口來闡明動作的通用性,可以幫助我們減少程序的復雜性。編譯器針對應用的情況來選擇具體應該是那個動作(方法)。程序員不必手工來做這種選擇。我們只需要記住并使用這個通用的接口就可以了。繼承

繼承是一個對象可以獲取到另外一個對象的屬性的過程。繼承非常重要,因為它支持了層次化的分類。仔細想想,大多數(shù)的知識都是通過層次化的分類來管理的。例如:紅色的甜蘋果是屬于蘋果分類的,而蘋果分類又是水果分類的一種,水果又是一個更大的類:食物的一種。也就是說,食物有一些特質(zhì),比如可以食用,有營養(yǎng)等等,邏輯上來說它的子類水果也是有的。除了這些特質(zhì),水果還有特殊的特質(zhì),比如多汁,香甜等等,正是這些特質(zhì)使得水果和其它的食物有所區(qū)分。蘋果類定義了蘋果特有的特質(zhì),比如生長在樹上,非熱帶的等等。一個紅色香甜的蘋果應該繼承了它的父類的所有特質(zhì),同時也定義了一些使得它和別的蘋果區(qū)分開來的特質(zhì)。

如果沒有層次化的分類,每一個對象都必須顯示地定義自己的所有特性。通過使用繼承,一個對象只需要定義那些使得它在整個類中顯得獨特的那些特質(zhì)。它可以從父類那里繼承所有通用的特質(zhì)。因此正是繼承機制使得一個對象成為一個通用類的實例成為可能。專家答疑

問:

文中說到面向?qū)ο蟮木幊淌且环N有效的進行大程序管理的方法。但是面向?qū)ο蟮木幊趟坪鯐黾酉鄬π〕绦虻拈_銷。就C++而言,這點是真是假?

答:

假。理解C++的關鍵一點是使用C++可以編寫面向?qū)ο蟮某绦颍遣⒉皇钦f必須寫面向?qū)ο蟮某绦?。這一點是C++和Java、C#的一個很重要的不同點。Java和C#采用嚴格的對象模型,所以每個程序,不管其多小,都是面向?qū)ο蟮?。C++也提供了該選項。更重要的是,在運行的時候,C++的面向?qū)ο筇匦允峭该鞯?,因此,如果存在的話,增加的開銷也是很少的。練習:

1.說出面向?qū)ο缶幊痰脑瓌t。

2.C++中,封裝的最基本的單元是什么?

3.C++中,子程序通常被稱作什么?

答案:

1.封裝,多態(tài)和繼承是面向?qū)ο缶幊痰脑瓌t。

2.C++中類是封裝的基本單元。

3.C++中,子程序通常被成為函數(shù)。必備技能1.4:第一個簡單的程序

現(xiàn)在我們開始編程了。我們通過編譯和運行下面的一個簡短的C++程序開始:

/*

這是一個簡單的C++程序.

文件名稱為Sample.cpp.

*/

#include<iostream>

usingnamespacestd;

//C++程序都是從main()函數(shù)開始的

intmain()

{

cout<<"C++ispowerprogramming.";

return0;

}

我們將按照下面的三個步驟來進行

1.鍵入程序

2.編譯程序

3.運行程序

在開始之前,讓我們先復習兩個術語:源代碼和目標代碼。源代碼就是人類可讀的程序,它是存儲在文本文件中的。目標代碼是由編譯器生成的程序的可執(zhí)行形式。鍵入程序

本書中出現(xiàn)的程序都可以從Osborne的網(wǎng)站上獲取到:

。然而,如果你想手工鍵入這些程序也是可以的。手工鍵入這些程序通??梢詭椭覀冇洃涍@些關鍵的概念。如果你選擇手工鍵入這些程序,你必須有一個文本編輯器,而不是一個字處理器。字處理器通常存儲帶有格式的文本信息。這些信息會使得C++編譯器不能正常工作。如果你使用的是windows平臺,那么你可以使用記事本程序,或者其它你喜歡的程序編輯器。

存儲源代碼的文件名稱從技術上來說是可以任意取的。然而,C++程序文件通常采用.cpp的擴展名。因此,你可以任意命名C++的程序文件,但是它的擴展名應該是.cpp。針對這里的第一個例子,源文件取名為Sample.cpp。本書中的其它程序,你可以自行選擇文件名。編譯程序

怎樣編譯Sample.cpp取決于你的編譯器和你采用了什么樣子的編譯選項。更進一步來說,許多編譯器,例如你可以自由下載的微軟的VisualC++ExpressEdition,都提供兩種不同的編譯方式:命令行編譯和集成開發(fā)環(huán)境。因此,這里不可能給出一個通用的編譯C++程序的操作。你必須查看與你的編譯器相關的操作指南。

如果你采用的是VisualC++,那么最簡單的編譯和運行本書中的程序的方式就是采用VC中提供的命令行。例如,使用VisualC++來編譯Sampler.cpp,你可以采用這樣的命令行:

C:\...>cl-GXSample.cpp

其中-GX是增強編譯選項。在使用VisualC++命令行編譯器之前,你必須先執(zhí)行visualC++提供的批處理文件VCVARS32.BAT。VisualStudio同時也提供了一個很方便使用命令行的方式:可以通過任務欄的開始|程序|MicrosoftVisualStudio菜單中的工具列表中的VisualStudioCommandPrompt菜單來激活命令行。

C++編譯器的輸出是一個可以執(zhí)行的目標代碼。在windows環(huán)境下,可執(zhí)行文件的名字和源碼文件的名字相同,但是擴展名為.exe。因此,Sample.cpp的可執(zhí)行文件為Sample.exe。運行該程序

C++程序編譯好之后就可以運行了。既然C++編譯器的輸出為可執(zhí)行的目標代碼,那么運行這個程序,只需要在命令行提示符下鍵入這個程序的名字即可。例如,運行Sample.exe時,采用如下的命令行

C:\...>Sample

運行時,程序?qū)@示下面的輸出:

C++ispowerprogramming.

如果你使用的是集成開發(fā)環(huán)境,那么你可以從菜單中選擇Run來運行這個程序。運行的方式也和編譯器相關,這點請參考你使用的編譯器的操作指南。針對本書中的程序,通常從命令行來編譯和運行會簡單一些。

最后一點:本書中的程序都是基于控制臺模式的,而不是基于windows模式的。也就是說,這些程序是運行在命令行提示符下的。C++對windows編程也是很內(nèi)行的。實際上,它是windows開發(fā)時最常用的語言。然而,本書中所有程序都沒有使用windows的圖形化用戶界面。這一點的原因也很好理解:windows編程本質(zhì)上是很巨大和復雜的,即使是創(chuàng)建一個最小的windows框架程序也需要50至70行代碼,而編寫能夠展示C++特性的windows程序也需要幾百行代碼。相比之下,基于控制臺的程序更短小,通常都是采用基于控制臺的程序來學習的。一旦你掌握了C++,你就能夠很輕松地把學習的知識應用到windows編程上了。逐行剖析第一個簡單的程序

盡管Sample.cpp相當短小,但是它卻涵蓋了幾個C++中常用的關鍵特性。讓我們近距離地研究一下這個程序的每個部分。程序以

/*

這是一個簡單的C++程序.

文件名稱為Sample.cpp.

*/

開始,這點是很常見的。就像其它大多數(shù)編程語言一樣,C++允許程序員對程序的源碼進行注釋。注釋的內(nèi)容會被編譯器忽略掉。注釋的目的是給所有讀源碼的人描述或者解釋該程序。就本例子來講,注釋解釋了改程序的功能。在更復雜的程序中,注釋可以被用來解釋程序的每個部分是為什么這樣做,以及如何做才能以完成預期的功能。換句說,你可以對程序的功能提供一種詳細的描述。

在C++中,有兩種注釋的方式。剛才看到的叫做多行注釋。這種類型的注釋以/*開始,以*/結(jié)束。任何處于這兩個注釋符號之間的內(nèi)容都會被編譯器忽略掉。多行注釋可以是一行或者多行的。第二種注釋會在后續(xù)的程序中看到。

接下來的代碼是:

#include<iostream>

C++語言定義了幾個頭文件,這些頭文件中定義了或者必要的或者有用的信息。該程序就需要頭文件中的iostream來支持C++的輸入/輸出系統(tǒng)。該頭文件是由編譯器提供的。程序中通過#include來包含頭文件。在本書后續(xù)章節(jié)中,我們會學習到更多的關于頭文件和為什么要包含頭文件的知識。

接下來的代碼是:

usingnamespacestd;

這行告訴編譯器使用std命名空間。命名空間是相對較新的增加到C++里面的特性。本書后續(xù)會對命名空間進行詳細的討論,這里給出一個簡單的描述。一個命名空間創(chuàng)建了一個聲明域,其中可以放置各種程序元素。在一個命名空間中聲明的元素和另外一個命名空間中聲明的元素是相互分開的。命名空間可以幫助我們組織大型程序。using語句通知編譯器我們要使用std這個命名空間。這是聲明了整個標準C++庫的命名空間。通過使用std這個命名空間,我們訪問標準庫。(因為命名空間相對比較新,舊的編譯器可能不支持。如果你使用的是舊的編譯器,請參見附錄B,其中描述了簡單的應急措施)

程序的下一行是:

//C++程序都是從main()函數(shù)開始的

這一行中使用到了C++中的第二種注釋方式:單行注釋。單行注釋以//開始,在一行的末尾結(jié)束。通常情況下,針對較多的,詳細的注釋使用多行注釋,簡單的注釋一般使用單行注釋。當然,這個也完全是個人編程風格的問題。

接下來的一行代碼,正如上面的注釋一樣,是程序執(zhí)行的入口:

intmain()

所有的C++程序都是由一個或者多個函數(shù)組成。正如前面解釋的那樣,一個函數(shù)就是一個子程序。每一個C++函數(shù)都必須有個名字,任何C++程序都必須有一個main()函數(shù),就像本例子中的一樣。main()函數(shù)是程序執(zhí)行的入口,通常也是程序結(jié)束的地方。(從技術上來講,一個C++程序通過調(diào)用main()函數(shù)而開始,大多數(shù)情況下,當main()函數(shù)返回的時候,程序也就結(jié)束了)。該行中的一對括號表示main()函數(shù)代碼的開始。main()函數(shù)前面的int表明了該函數(shù)的返回值為int類型。后面會介紹到,C++支持幾種內(nèi)建的數(shù)據(jù)類型,其中就有int。它代表的是一個整型數(shù)。

接下的一行是:

cout<<"C++ispowerprogramming.";

這是一條控制臺輸出語句。它輸出:C++ispowerprogramming.到計算機顯示器上。輸出是通過使用輸出運算符<<來完成的。<<運算符把它右側(cè)的表達式輸出到左側(cè)的設備上。cout是一個預先定義好的標識符,它代表了控制臺的輸出,通常就是指計算機的顯示器。因此,這句程序就是把信息輸出到計算機的顯示器上。請注意:這句程序是以分號結(jié)束的。實際上,所有的C++語句都是以分號結(jié)束的。信息“C++ispowerprograming.”是一個字符串。在C++中,一個字符串就是由雙引號引起來的一個字符的序列。在C++中,字符串是會經(jīng)常用到的。

下一行是:

return0;

該行代碼終止了main()函數(shù),并且返回0給調(diào)用進程(調(diào)用進程通常就是操作系統(tǒng))。對于大多數(shù)的操作系統(tǒng)來說,返回值0就意味著程序正常終止。其它返回值則代表程序因為產(chǎn)生了錯誤而終止。return是C++的關鍵字之一,用它來表示函數(shù)的返回值。所有的程序在正常終止的情況下(也就是沒有出現(xiàn)錯誤的情況下)都應該返回0。

程序最后的大括號表示程序到此結(jié)束。處理語法錯誤

根據(jù)以前的編程經(jīng)驗,我們知道,編程時很容易出現(xiàn)鍵入錯誤的情況的。慶幸的是,如果我們在鍵入程序的時候輸入錯誤了,編譯器在編譯的時候會報告語法錯誤信息的。大多數(shù)的C++編譯器都試圖正確理解我們編寫的程序。正是由于這個原因,編譯器報告的錯誤并不一定都反映了問題出現(xiàn)的原因。例如,在前面的程序中,如果我們遺忘了main()后面的大括號,編譯器則會報告說cout語句有語法錯誤。當編譯器報告語法錯誤信息的時候,我們就應該檢查最新寫的那幾行代碼,看看是否有錯誤。專家答疑

問:

除了錯誤信息以外,編譯器還會提供告警信息。告警和錯誤有什么區(qū)別,我應該關注那類信息?

答:

除了報告致命的錯誤信息以外,大多是的編譯器都會上報幾種告警信息。錯誤信息代表的是程序中出現(xiàn)了明確的錯誤,比如忘記鍵入分號等。告警信息則是指出現(xiàn)了從技術上講是正確的,但是值得懷疑的地方。由程序員來決定此處是否正確。

告警可以用來報告諸如使用了已經(jīng)被廢棄的特性或者無效的構(gòu)成等。通常來講,我們可以選擇那些告警是可見的。本書中的程序是符合標準C++的,因此只要輸入無誤,是不會出現(xiàn)令人煩惱的告警信息的。

針對本書中的示例程序,你可能想使用編譯器缺省的錯誤報告。然而,你可以查閱自己編譯器的相關文檔以明確編譯器提供哪些選項。很多編譯器都可以幫助我們檢查出潛在的錯誤,不至于引起大麻煩。了解編譯器的錯誤報告機制是很值得的。練習:

1.C++程序是從哪里開始執(zhí)行的?

2.cout是做什么用的?

3.#include<iostream>是用來做什么的?

答案:

1.C++程序從main函數(shù)開始執(zhí)行。

2.cout是預先定義好的標識符,它連接到控制臺輸出。

3.它用來包含頭文件<iostream>,可以支持輸入/輸出。必備技能1.5:第二個簡單的程序

變量是程序最基本的構(gòu)成元素。一個變量就是一個被命名的,可以被賦值的內(nèi)存位置。進一步來說,變量的取值在程序的執(zhí)行過程中是可以改變的。也就是說變量的內(nèi)容是可變的,而不是固定的。

下面的程序創(chuàng)建了一個變量叫做length,賦值7,并在顯示器上輸出信息“Thelengthis7”。

//usingavariable.

#include<iostream>

usingnamespacestd;

intmain()

{

intlength;

//這行是聲明一個變量

length=7;

//給變量賦值為7

cout<<"Thelengthis";

cout<<length;

//這行輸出7,也就是輸出變量length的值

return0;

}

正如前文所提到的,C++程序的命名是可以任意的。因此,鍵入這個程序后,你可以選擇一個自己喜歡的文件名字來保存該程序。當然,文件可以取名為VarDemo.cpp。

這個程序引入了兩個概念。第一,語句

intlength;

//這行是聲明一個變量

聲明了一個變量,叫做length,它的類型為整型。在C++中,所有的變量都必須在使用之前進行聲明。而且,變量所能存儲的值的類型也必須指定,這叫做變量的類型。所以上面的代碼聲明的變量length是用來存儲整型數(shù)的。整型數(shù)的取值范圍為-32768到32767。在C++中,欲聲明一個整型的變量,就在它的名稱前加上int。后面會學習到C++支持更多的內(nèi)置的變量類型。(還可以自己創(chuàng)建自己的數(shù)據(jù)類型)

接下來的一行中用到了第二個新的特性:

Length=7;//給變量賦值為7

正如注釋所解釋的那樣,這句代碼給變量length賦值為7。在C++中,賦值運算符就是一個單等號。它把右側(cè)的取值拷貝到左側(cè)的變量中。在該賦值語句之后,變量length的取值將為7。

接下來的語句輸出了變量length的值:

cout<<lenght;//這行輸出7,也就是輸出變量length的值

通常來講,如果我們想要輸出一個變量的取值,只要把它放置在cout語句中<<的右側(cè)即可。針對例子中的情況,因為length的取值為7,因此輸出的值就會是7。在繼續(xù)學習下面的內(nèi)

容之前,我們可以嘗試給length賦于其它的值,并觀察輸出的結(jié)果。必備技能1.6:使用運算符

和大多數(shù)其它的語言一樣,C++支持全部的算術運算符,以便能夠處理程序中的數(shù)字。這其中就包括:

+

加法

-

加法

*

乘法

/

除法

在C++中,這些運算符的用法和代數(shù)中的用法是一樣的。

下面的程序使用*運算符來根據(jù)長度和寬度計算矩形的面積。

//usinganoperator

#include<iostream>

usingnamespacestd;

intmain()

{

intlength;//這行定義了一個變量

intwidth;//這行定義了另外的一個變量

intarea;

//這行也是定義變量

length=7;//給變量length賦值為7

width=5;//給變量width賦值為5

area=length*width;//計算面積,把length和width的乘積賦值給area

cout<<"Theareais";

cout<<area;//輸出35

return0;

}

這個程序聲明了三個變量:length,width和area。給變量length賦值為7,width賦值為5。然后計算他們的乘積,并把結(jié)果賦值給變量area。這個程序的輸出如下:

Theareais35

在這個程序中實際沒有必要聲明變量area??梢园凑障旅娴氖痉吨貙懸幌聞偛诺某绦颍?/p>

//Asimplifiedversionoftheareaprogram.

#include<iostream>

usingnamespacestd;

intmain()

{

intlength;//聲明一個變量

intwidth;

//聲明另外的一個變量

length=7;//給lenght賦值為7

width=5;//給width賦值為5a

cout<<"Theareis";

cout<<length*width;//輸出35

return0;

}

在這段代碼中,面積是在cout語句中通過把legth和width做乘法運算而得到的,然后把結(jié)果輸出到顯示屏幕上。

在繼續(xù)學習之前,我們還應該指出,在同一個聲明變量的語句中,我們是可以聲明兩個或者多個變量的。只需要用逗號把它們分開即可。例如,可以通過下面的方式聲明三個變量length,width,area:

intlength,width,area;//使用一條語句聲明全部的變量

在專業(yè)的代碼中,通過一條語句聲明兩個或者多個變量是非常普遍的。練習:

1.變量在使用前是否必須先聲明?

2.如何給變量min賦值0?

3.在一條聲明語句中是否可以聲明多個變量?

答案:

1.是的,C++中的變量在使用前都必須聲明。

2.min=0;

3.是的。在一條聲明語句中可以聲明多個變量。必備技能1.7:從鍵盤讀取輸入

前面的程序中使用的都是顯示指定的數(shù)據(jù)。例如,計算面積的程序計算的是長為7,寬為5的矩形的面積,矩形的尺寸本身就是程序的一部分。然而,不管矩形的尺寸是多少,其面積的計算方法都是一樣的。因此,如果能夠提示用戶從鍵盤輸入矩形的尺寸,然后計算矩形的面積的話,那么這個程序?qū)蛴杏靡恍?/p>

我們可以使用>>運算符來使用戶從鍵盤輸入數(shù)據(jù)到程序中。這就是C++中的輸入運算符。通常使用下面的形式從鍵盤獲取數(shù)據(jù)

cin>>var;

其中,cin是另外一個預先定義好的標識符。它代表控制臺輸入,這是C++自動支持的。缺省情況下,cin是和鍵盤綁定的,它也可以被重定向到其它的設備上。var代表接收輸入的變量。

下面重寫計算面積的程序,允許用戶輸入矩形的尺寸:

/*

用來計算矩形面積的交互式程序

*/

#include<iostream>

usingnamespacestd;

intmain()

{

intlenght;//聲明一個變量

intwidth;

//聲明另外一個變量

cout<<"Enterthelength:"

cin>>length;//從鍵盤輸入長度

cout<<"Enterthewidth:";

cin>>width;//從鍵盤輸入寬度

cout<<"Theareais";

cout<<length*width;//輸出面積

return0;

}

運行的結(jié)果可能如下:

Enterthelength:8

Enterthewidht:3

Theareais24

請注意下面的幾行:

cout<<"Enterthelength:"

cin>>length;//從鍵盤輸入長度

cout語句提示用戶輸入數(shù)據(jù)。cin語句讀取用戶輸入的數(shù)據(jù),并把值存儲在變量length中。于是,用戶鍵入的數(shù)值(就本例中的程序,用戶必須輸入一個整型數(shù))就被存放在了>>右側(cè)的變量中(本例中就是length)。在執(zhí)行完畢cin語句后,變量length存放的就是矩形的長度(如果用戶鍵入的是非數(shù)字,變量lenght的值將會是0)。提示用戶輸入寬度和從鍵盤讀取矩形長度的語句工作原理是一樣的。一些輸出選項

到目前為止,我們一直使用的都是cout的最簡單的形式。然而,cout可用來輸出更復雜的語句。下面是兩個有用的技巧。首先,我們可以使用一個cout語句輸出多條信息。比如,在計算面積的程序中,我們使用下面的兩行來輸出面積:

cout<<"Theareais";

cout<<length*width;

這兩行代碼可以使用下面更方便的語句來表達:

cout<<"Thearesis"<<length*width;

這種方式在同一個cout語句中使用了兩個輸出運算符,這將在輸出字符串"Therareais"后接著輸出面積。通常情況下,我們可以在一條輸出語句中連接多個輸出運算符,每個輸出項單獨使用一個運算符即可。

第二個技巧,到目前為止我們還沒有換行輸出,也就是回車。但是不久我們就需要這樣輸出了。在字符串中我們使用"\n"表示換行,試試下面的程序就可以看到"\n"的效果了。

/*

這個程序演示了\n的用法,可以輸出換行

*/

#include<iostream>

usingnamespacestd;

intmain()

{

cout<<"one\n";

cout<<"two\n";

cout<<"three";

cout<<"four";

return0;

}

這段程序的輸出如下:

one

two

threefour

換行字符可以被放置在字符串中的任意位置,并不一定是放置在最后。在理解了換行字符的作用后,就可以自己寫程序看看結(jié)果了。練習:

1.C++中的輸入運算符是哪個?

2.缺省情況下,cin是和那個設備進行綁定的?

3.\n代表什么?

答案

1.輸入運算符是>>

2.c缺省地是和鍵盤綁定。

3.\n代表換行字符。其它的數(shù)據(jù)類型

在前面的程序中,我們使用的都是int類型的變量。int類型的變量只能用來存儲整型數(shù)。當需要存儲小數(shù)的時候,int類型的變量就不能使用了。比如,一個int類型的變量可以用來存儲值18,但是不能用來存儲值18.3。幸運的是,int類型只是C++中定義的幾種數(shù)據(jù)類型之一。C++定義了兩種浮點類型來表示小數(shù):float和double類型,它們分別代表單精度和雙精度的小數(shù)。其中,double可能是最常用的了。

可以采用類似下面的方式來聲明一個double類型的變量:

doubleresult;

這里,result是變量的名稱,它的類型是double類型的。因為它的類型是浮點類型,因此可以被用來存放諸如88.56或者-107.03之類的數(shù)據(jù)。

為了更好地理理解int和double類型的區(qū)別,可以試一試下面的程序:

/*

這個程序展示了int類型和double類型的區(qū)別

*/

#include<iostream>

usingnamespacestd;

intmain()

{

intivar;//聲明一個整形的變量

doubledvar;//聲明一個浮點型的變量

ivar=100;//給ivar賦值100

dvar=100.0;//給dvar賦值100.0

cout<<"Originalvalueofivar:"<<ivar<<"\n";

cout<<"Originalvalueofdvar:"<<dvar<<"\n";

cout<<"\n";//打印一個空行

//各自都除以3

ivar=ivar/3;

dvar=dvar/3.0

cout<<"ivarafterdivision:"<<ivar<<"\n";

cout<<"dvarafterdivision:"<<dvar<<"\n"

return0;

}

程序的輸出如下:

Originalvalueofivar:100

Originalvalueofdvar:100

ivarafterdivision:33

dvarafterdivision:33.3333

從上面的例子可以看出,當ivar除以3的時候,得到的結(jié)果是33,小數(shù)部分丟失了。而dvar除以3后,小數(shù)部分是被保留的。

該程序中還有一個新的需要注意的地方:

cout<<"\n"http://輸出一個空行

這句將輸出一個空行??梢栽谛枰魏涡枰敵隹招械牡胤绞褂迷撜Z句。專家解答

問:

為什么C++中用兩種不同的數(shù)據(jù)類型來分別表示整型數(shù)和浮點數(shù)了?也就是說,為什么不是所有的數(shù)據(jù)都僅僅使用一個類型了?

答:

C++提供了不同的類型是為了程序的效率更高。比如,整形數(shù)的運算要比浮點數(shù)的運算快。因此,如果不需要小數(shù),就沒有必要引入float或者double類型帶來的開銷。還有就是,各種類型的數(shù)據(jù)在存儲的時候所需的內(nèi)存的大小也是不一樣的。通過支持不同的數(shù)據(jù)類型,C++使得我們可以最好地利用系統(tǒng)的資源。最后,一些算法是需要一些特定類型的數(shù)據(jù)的。C++提供了大量的內(nèi)置類型以提供最好的靈活性。項目1-1英尺到米的轉(zhuǎn)換

雖然前面的幾個程序展示了C++語言的幾個重要特性,但是它們并不實用。盡管到目前為止我們對C++的學習并不多,但是我們?nèi)匀豢梢岳盟鶎W習的知識來創(chuàng)建一個實用的程序。在該項目中,我們創(chuàng)建一個程序來把英尺轉(zhuǎn)換成米。該程序提示用戶輸入英尺數(shù)據(jù),然后顯示出轉(zhuǎn)換后的米的數(shù)據(jù)。

一米大約等于3.28英尺,因此我們需要使用浮點數(shù)。為了完成轉(zhuǎn)換,程序中聲明了兩個浮點類型的變量,一個用來存儲英尺的數(shù)據(jù),一個用來存儲米數(shù)據(jù)。步驟:

1.創(chuàng)建一個C++文件,命名為FtoM.cpp。(注意:在C++中文件的名字是可以任意的,你可以取任何自己喜歡的名字。)

2.文件以下面的內(nèi)容開始。這些內(nèi)容解釋了該程序的功能,包含了iostream頭文件,指明了std命名空間。

/*

Project1-1

該程序?qū)崿F(xiàn)從英尺到米的轉(zhuǎn)換

程序文件命名為FtoM.cpp

*/

#include<iostream>

usingnamespacestd;

3.main()函數(shù)中聲明變量f和m:

intmain()

{

doublef;//存儲英尺的長度

doublem;//存儲轉(zhuǎn)換后的米的數(shù)據(jù)

4.增加輸入英尺數(shù)據(jù)的代碼:

cout<<"Enterthelegthinfeet:";

cint>>f;//讀取英尺數(shù)據(jù)

5.增加進行轉(zhuǎn)換和輸出的代碼:

m=f/3.28;//轉(zhuǎn)換成米

cout<<f<<"feetis"<<m<<"meters.";

6.以下面的代碼結(jié)束程序:

return0;

}

7.程序完成后應該是下面的這個樣子:

/*

Project1-1

該程序?qū)崿F(xiàn)從英尺到米的轉(zhuǎn)換

程序文件命名為FtoM.cpp

*/

#include<iostream>

usingnamespacestd;

intmain()

{

doublef;//holdsthelengthinfeet

doublem;//holdstheconversiontometers

cout<<"Enterthelengthinfeet:";

cin

>>f;//readthenumberoffeet

m=f/3.28;//converttometers

cout<<f<<"feetis"<<m<<"meters.";

return0;

}

8.編譯并運行該程序,舉例的輸出結(jié)果如下:

Enterthelengthinfeet:55feetis1.52439meters.

9.可以嘗試著輸入其它的數(shù)據(jù),也可以嘗試修改成把米轉(zhuǎn)換成英尺。練習:

1.在C++中整型類型的關鍵字是什么?

2.double是什么意思?

3.怎樣才能輸出新的一行?

答案:

1.整形數(shù)據(jù)類型為int

2.double是用來表示雙精度的浮點數(shù)的。

3.輸出新的一行,使用\n.必備技能1.8:兩條控制語句

在一個函數(shù)內(nèi)部,語句是按照從上到下的順序執(zhí)行。然而,我們可以通過使用C++支持的各種程序控制語句來改變程序的順序執(zhí)行方式。盡管我們會在后文中仔細研究控制語句,在這里我們還是要簡單介紹兩種控制語句,我們可以使用它們來寫幾個簡單的示例程序。if語句

我們可以使用C++的條件語句選擇性地執(zhí)行程序的部分代碼:if語句。C++中的if語句和其它程序語言中的if語句是很類似的。例如,在語法上C++中的if語句和C,Java,C#中的都是一樣的。它的最簡單的形式如下:

if(condition)statement;

這里的condition是一個待評估的條件表達式,它的值或者是true(真)或者是false(假)。在C++中,true就是非零的數(shù)值,而false就是0。如果condition為真,則statement部分將會被執(zhí)行。如果condition為假,statement部分將不會被執(zhí)行。例如,下面的代碼片段將在顯示器上顯示出片語:10islessthan11,因為10是小于11的。

if(10<11)cout<<"10islessthan11";

再考慮下面的代碼片段:

if(10>11)cout<<"thisdosenotdisplay";

在上面的片段中,10并不是大于11的,所以cout語句并不會被執(zhí)行。當然,if語句中的條件表達式中不一定都必須使用常量。它們也可以是變量。

C++中定義了全部的關系運算符,它們可以被用在條件表達式中。如下:

運算符

含義

<

小于

<=

小于或者等于

>

大于

>=

大于或者等于

==

等于

!=

不等于

注意,等于是兩個等號。'

下面是一個示例程序,它展示了if語句的用法:

//Demonstratetheif

#include<iostream>

usingnamespacestd;

intmain()

{

inta,b,c;

a=2;

b=3;

if(a<b)cout<<"aislessthanb\n";

//這里是一條if語句

//下面的語句將不能顯示任何東西

if(a==b)cout<<"youwon'tseethis\n"

cout<<\n;

c=a-b;//c的值為-1

cout<<"ccontains-1\n";

if(c>=0)cout<<"cisno-negative\n";

if(c<0)cout<<"cisnegative\n";

cout<<"\n";

c=b-a;//c的值現(xiàn)在為1

cout<<"ccontains1\n";

if(c>=0)cout<<"cisnon-negativa\n";

if(c<0)cout<<"cisnegative\n";

return0;

}

這個程序的輸出如下:

aislessthanbccontains-1

cisnegativeccontains1

cisnon-negative

for循環(huán)

通過循環(huán),我們可以反復執(zhí)行一系列的語句。C++提供了多種不同的方式來支持循環(huán)。這里我們將要看到的是for循環(huán)。如果你很熟悉Java或者C#,你會很高興地看到,C++中的for循環(huán)和這兩個語言中的for循環(huán)是一樣的。for循環(huán)最簡單的形式如下:

for(initialization;condition;increment)語句)

這里initialization用來設置循環(huán)控制變量的初始值。condition是每次重復執(zhí)行的時候需要進行的檢查條件,只要條件為真,循環(huán)就一直繼續(xù)。increment是一個表達式,它表示每次循環(huán)的時候,循環(huán)的控制變量時如何遞增的。

下面的程序演示了for循環(huán)的使用方法。它在屏幕上輸出數(shù)字1到100。

//Aprogramthatillustratestheforloop.

#include<iostream>

usingnamespacestd;

intmain()

{

intcout;

for(count=1;count<=100;count=count+1)

cout<<count<<"";

return0;

}

在上面的循環(huán)中,count初始化為1。循環(huán)每執(zhí)行一次,條件count<=100就會被檢查一次。如果條件為真,則輸出count的取值,并且count增加1。當count的值大于100的時候,檢測的條件就為假了,循環(huán)終止了。在專業(yè)的代碼中,是永遠不會看到類似下面的語句的:

count=count+1;

因為C++中包含了一個特殊的自增運算符來更有效的完成上面的功能。這個自增運算符就是++,也就是兩個連續(xù)的加號。自增運算符使得運算數(shù)的值增加1。前面的for語句通常會被寫成下面的形式:

for(count=1;count<=100;count++)cout<<count<<"";

本書的后續(xù)章節(jié)將都會采用這種書寫的形式。

C++中同時提供了自減的運算符:--,它使得運算數(shù)的值減一。練習:

1.if語句是用來做什么的?

2.for語句是用來做什么的?

3.C++中有哪些關系運算符?

答案:

1.if語句是C++中的條件語句。

2.for語句是用來做循環(huán)用的。

3.C++中的關系運算符有:==,!=,<,>,<=,>=必備技能1.9:使用代碼塊

C++中一個基本的元素就是代碼塊。一個代碼塊由兩個或者多個語句組成,由一對花括號括起來的。代碼塊可以作為一個邏輯單元出現(xiàn)在任何單條語句可以出現(xiàn)的地方。例如,代碼塊可以被使用在if語句或者for循環(huán)中:

if(w<h)

{

v=w*h;

w=0;

}

這里,如果w小于h,則代碼塊中的兩條語句都會被執(zhí)行。因此,代碼塊中的兩條語句形成了一個邏輯單元,要么兩條語句都會被執(zhí)行,要么兩條語句都不會被執(zhí)行。凡是需要把兩條或者多條語句在邏輯上進行關聯(lián)的地方,我們都可以使用代碼塊。代碼塊使得許多算法實現(xiàn)起來更加清晰和有效。

下面的程序中使用了代碼塊來防止除數(shù)為0。

//Demonstrateablockofcode

#include<iostream>

usingnamespacestd;

intmain()

{

doubleresult,n,d;

cout<<"Entervalue:";

cin>>n;

cout<<"Enterdivisor:"

cin>>d;

//thetargetofthisifisablock

if(d!=0)

{

cout<<"ddoesnotquealzerosodivisionisOK"<<"\n";

result=n/d;

cout<<n<<"/"<<d<<"is"<<result;

}

return0;

}

一個示例的輸出結(jié)果如下:

Entervalue:10

Enterdivisor:2

ddoesnotquealzerosodivisionisOK

10/2is5

在上面的這個例子中,if語句的目標不是一條語句,而是一個代碼塊。如果if語句的控制條件為真,代碼塊中的三條語句都會被執(zhí)行??梢試L試輸入除數(shù)為0,并觀察程序的輸出結(jié)果。此時,代碼塊中的三條語句都不會被執(zhí)行。

在本書的后面的的章節(jié)中,我們會看到代碼塊還有別的屬性和用法。然而,代碼塊存在的主要原因是它能夠創(chuàng)建在邏輯上不可分割的獨立單元。專家答疑

問:

使用代碼塊是否會降低運行時的效率?也就是說代碼塊中的大括號是否會在代碼執(zhí)行的過程中消耗運行時間?

答:

不會的。代碼塊在運行的時候并不會增加任何的開銷。實際上,由于它能簡化一些特性算法的編碼,使用代碼塊通常會增加運行的速度和效率。分號和位置

在C++中,分號代表著語句的結(jié)束。也即是說,每一個單獨的語句都必須以分號結(jié)束。通過前面的介紹,我們知道,代碼塊是在邏輯上關聯(lián)的一組語句的集合,它由一對花括號括起來。代碼塊不是以分號作為結(jié)束的。既然代碼塊是一組語句的集合,其中每條語句都是以分號結(jié)束,所以代碼塊不是以分號結(jié)束是有意義的。代碼塊的結(jié)束是通過}來標記的。

C++中,并不是一行的結(jié)束就代表著一條語句的結(jié)束,只有分號才能代表語句的結(jié)束。所以,我們把語句寫在了哪一行并不是很重要。例如,在C++中

x=y;

y=y+1;

cout<<x<<""<<y;

和下面的代碼是一樣的

x=y;y=y+1;cout<<x<<""<<y;

更進一步,語句的單獨元素也可以被放置在不同的行中。例如,下面的代碼也是可以接受的:

cout<<"Thisisalongline.Thesumis:"<<a+b+c+

d+e+f;

采用上面的方式避免一行中寫過多的代碼可以增加代碼的可閱讀性。縮進

在前面的例子中,可以看到一些語句采用了縮進的格式。C++是一個很自由的語言,也就是說,在一行中,把相關的代碼放置在了行的什么地方并不要緊。然而,人們已經(jīng)形成了常用的和可以接受的縮進風格,方便閱讀程序。本書將遵循這樣的縮進風格。并建議讀者也這樣做。在這種風格中,針對每個{后面的代碼都需要縮進一個級別,在}之后代碼的縮進格式需要向前提升一個級別。還有一些語句將采用另外的縮進方式,本書后續(xù)會進行描述。練習

1.如何創(chuàng)建代碼塊?它是用來做什么用的?

2.在C++中語句塊是以_____結(jié)束的。

3.所有的C++語句都必須在同一行開始和結(jié)束,對嗎?

答案:

1.代碼塊是以{開始,以}結(jié)束的。它是用來創(chuàng)建邏輯單元的。

2.分號。

3.錯誤。項目1-2生成一張從英尺到米的轉(zhuǎn)換表

這個項目將顯示一張從英尺到米的轉(zhuǎn)換表,其中用到了for循環(huán),if語句和代碼塊。表格的起始為一英尺,終止為100英尺。每輸出10英尺的轉(zhuǎn)換表后,輸出一個空行,這個是通過使用變量counter來實現(xiàn)的。邊玲counter是用來表示行數(shù)的,請注意它的用法。

步驟:

1.創(chuàng)建一個新的文件,命名為FtoMTable.cpp。

2.文件中鍵入下面的程序:

#include<iostream>

usingnamespacestd;

intmain()

{

doublef;//用來存儲英尺長度

doublem;//用來存儲轉(zhuǎn)換后的米的值

intcounter;

counter=0;//用于統(tǒng)計行數(shù),變量初始化為0

for(f=1.0;f<=100;f++)

{

m=f/3.28;//英尺轉(zhuǎn)換為米

cout<<f<<"feetis"<<m<<"meters.\n";

//循環(huán)每次都要把行數(shù)增加1

counter++;

//每10行輸出一個空行

//如果行數(shù)為10了,則需要輸出一個空行

if(counter==10)

{

cout<<"\n";//輸出空行

counter=0;

//重置行數(shù)計數(shù)器

}

}

return0;

}

3.注意我們是如何使用counter變量來實現(xiàn)每10行輸出一個空行的。在for循環(huán)外該變量被初始化為0。在for循環(huán)體內(nèi)部,每做一次英尺到米的轉(zhuǎn)換,counter就增加1。當counter增加到10的時候,就輸出一個空行,然后重置counter的值為0,重新開始上面的過程。

4.編譯并運行上面的程序。下面是輸出的一部分。注意程序輸出的小數(shù)部分并不是很整齊。

1feetis0.304878meters.

2feetis0.609756meters.

3feetis0.914634meters.

4feetis1.21951meters.

5feetis1.52439meters.

6feetis1.82927meters.

7feetis2.13415meters.

8feetis2.43902meters.

9feetis2.7439meters.

10feetis3.04878meters.

11feetis3.35366meters.

12feetis3.65854meters.

13feetis3.96341meters.

14feetis4.26829meters.

15feetis4.57317meters.

16feetis4.87805meters.

17feetis5.18293meters.

18feetis5.4878meters.

19feetis5.79268meters.

20feetis6.09756meters.

21feetis6.40244meters.

22feetis6.70732meters.

23feetis7.0122meters.

24feetis7.31707meters.

25feetis7.62195meters.

26feetis7.92683meters.

27feetis8.23171meters.

28feetis8.53659meters.

29feetis8.84146meters.

30feetis9.14634meters.

31feetis9.45122meters.

32feetis9.7561meters.

33feetis10.061meters.

34feetis10.3659meters.

35feetis10.6707meters.

36feetis10.9756meters.

37feetis11.2805meters.

38feetis11.5854meters.

39feetis11.8902meters.

40feetis12.1951meters.

5.可以自己嘗試修改上面的程序為每25行輸出一個空行。必備技能1.10:引入函數(shù)

C++程序通常是由多個叫做函數(shù)的代碼塊構(gòu)成的。盡管我們會在第五章對函數(shù)進行詳細的介紹,這里也有必要進行一個簡單的介紹。函數(shù)的定義如下:一個包含了一條或者多條C++語句的子程序。

每個函數(shù)都有一個名字,通過名字來調(diào)用該函數(shù)。調(diào)用函數(shù)的時候,需要在自己的程序的源碼中指定函數(shù)的名字,后面緊跟著函數(shù)的參數(shù)。例如,有個函數(shù)名字為MyFunc。如下代碼展示了如何調(diào)用該函數(shù):

MyFunc();

當調(diào)用一個函數(shù)的時候,程序的控制就轉(zhuǎn)移到了被調(diào)用函數(shù)中,函數(shù)中的代碼將被執(zhí)行。當函數(shù)中的代碼執(zhí)行完畢后,程序的控制又轉(zhuǎn)回給函數(shù)的調(diào)用者。因此,函數(shù)是為一個程序的其它部分完成相應功能的。

有些函數(shù)需要一個或者更多的參數(shù),我們在調(diào)用的時候需要傳入這些參數(shù)給函數(shù)。因此,一個參數(shù)就是我們傳入到函數(shù)中的值。在調(diào)用函數(shù)的時候,參數(shù)是放置在括號中的。例如,如果函數(shù)MyFunc()需要一個整型數(shù)作為參數(shù),那么下面的代碼就是在調(diào)用函數(shù)的時候傳入了參數(shù)2:

MyFunc(2);

當函數(shù)需要兩個或者更多參數(shù)的時候,這些參數(shù)之間用逗號來分隔。在本書中,術語參數(shù)列表指的就是用逗號分隔的參數(shù)。注意,并不是所有的函數(shù)都需要參數(shù)。如果函數(shù)不需要參數(shù),則括號中為空。

函數(shù)可以為調(diào)用者返回一個值。并不是所有的函數(shù)都需要返回值的,但大多數(shù)都是需要返回值的。函數(shù)的返回值可以被賦值給調(diào)用者中的一個變量,這是通過把對函數(shù)的調(diào)用放置在賦值語句的右邊來實現(xiàn)的。例如,如果函數(shù)MyFunc()返回一個值,那么可以通過下面的方式來調(diào)用它:

x=MyFunc(2);

首先,函數(shù)MyFunc()被調(diào)用。當它返回的時候,它的返回值被賦值給x。還可以在表到式中調(diào)用函數(shù)。例如,

x=MyFunc(2)+10;

在這中情況下,函數(shù)MyFunc()的返回值加上10后被賦值給x。通常情況下,當在語句中遇到函數(shù)的名字,該函數(shù)就會自動被調(diào)用,以便獲取它的返回值。

復習一下,一個參數(shù)就是調(diào)用函數(shù)的時候傳入的值。返回值是函數(shù)返回給調(diào)用者的值。下面是一個簡短的小程序,它展示了如何調(diào)用函數(shù)。其中使用了C++中內(nèi)置的函數(shù),叫做abs()來計算一個數(shù)的絕對值。abs()函數(shù)需要一個參數(shù),把這個參數(shù)轉(zhuǎn)換成它的絕對值,并返回結(jié)果。

//usetheabs()function

#include<iostream>

usingnamespacestd;intmain()

{

intresult;

resutl=abs(-10);//調(diào)用函數(shù)abs(),將其返回值賦值給變量result

cout<<result;

return0;

}

這里,傳入到abs()函數(shù)中的值為-10。abs()函數(shù)在調(diào)用的時候接收傳入的參數(shù)-10,并返回-10的絕對值,也就是10給調(diào)用者。這個指被賦值給變量result。因此,該程序在屏幕上顯示10。

關于上面這個程序需要注意的另外一個地方:它包含了頭文件cstdlib。這是abs()函數(shù)需要的頭文件。一旦我們使用了內(nèi)置的函數(shù),我們必須包含它的頭文件。

通常情況下,我們的程序需要兩種類型的函數(shù)。第一種就是我們自己寫的函數(shù),main()就是其中之一。后面,我們會學習到如何自己編寫其它的函數(shù)。我們會看到,一個真實的C++程序?qū)嶋H上包含了許多自己

溫馨提示

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

提交評論