CBuilder的基本功能【共享】_第1頁
CBuilder的基本功能【共享】_第2頁
CBuilder的基本功能【共享】_第3頁
CBuilder的基本功能【共享】_第4頁
CBuilder的基本功能【共享】_第5頁
已閱讀5頁,還剩149頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

C++BuiIder的基本功能我們用高級語言寫程序,我們很得意,因?yàn)楦呒壵Z言比較接近人類的語言,使我們用起來得心應(yīng)手,所以我們當(dāng)然得意。但我們更得意的一定是讓程序代碼趕快變成可執(zhí)行文件。無論是在寫代碼的過程,還是最后要編譯成可執(zhí)行文件,都需要有一個(gè)工具存在。這一工具一般稱為編程集成環(huán)境(IDE)O之所以稱為集成,是因?yàn)閺膶懘a到最后軟件的出爐,我們需要它的地方實(shí)在太多了,這里列出其中最重要的功能項(xiàng)。1、代碼編輯:方便的代碼編輯功能。盡管你可以使用記事本、Word或其它任何文本編輯器來寫代碼,但除非特殊需要,否則那將是極為低效的方法。相反,現(xiàn)在的編程集成環(huán)境,都相當(dāng)?shù)闹悄埽e例如:代碼自動(dòng)功能,可以在很多情況下自動(dòng)完成我們所需的代碼,既準(zhǔn)確還迅速。Borland公司出品的編程集成環(huán)境不僅有常見的關(guān)鍵字高亮等功能,還支持代碼模板,支持鍵盤宏,同樣支持高級的腳本插件功能。2、界面設(shè)計(jì):可視化的程序界面設(shè)計(jì)功能。你所要產(chǎn)生的窗口,在設(shè)計(jì)期間就真實(shí)地出現(xiàn),包括字體、顏色和定位。比如:你不僅可以插入falsh的動(dòng)畫,而且無需運(yùn)行,就直接可以在你的界面上看到該動(dòng)畫的演播,這是別的編程環(huán)境不能做到的。3、程序編譯:這是編程工具的主要功能。我們寫的代碼在成為機(jī)器能懂的可執(zhí)行程序時(shí),必須通過編譯。4、程序調(diào)試:如何盡量減少你程序的BUG呢?沒有編程集成環(huán)境提供的強(qiáng)大調(diào)試功能,我們做的程序?qū)⒑翢o質(zhì)量保證。5、代碼優(yōu)化:Borland提供的編譯器,不僅在編譯速度上一直在美國屢獲大獎(jiǎng),而且其代碼自動(dòng)優(yōu)化功能一直領(lǐng)先對手兒近一個(gè)時(shí)代。使用編程集成環(huán)境,我們可以輕松獲得更快更優(yōu)的最終可執(zhí)行程序文件。6、輔助程序安裝:程序的安裝已屬于另外一種工具的范疇,但我們?nèi)钥梢酝ㄟ^編程集成環(huán)境來決定最終生成單一可執(zhí)行文件,還是帶有其它動(dòng)態(tài)庫。如果是后者,我們還可以通過集成環(huán)境來檢查程序運(yùn)行時(shí)調(diào)用了哪些動(dòng)態(tài)庫文件。C++Builder提供的功能遠(yuǎn)不止我上面所說的,并不是因?yàn)槲易毂?,而是我認(rèn)為對一個(gè)工具,你只有動(dòng)手使用,才會(huì)真正了解它。C++是一門語言,而BorlandC++Builder則是語言實(shí)現(xiàn)工具。作為一個(gè)編程工具,CB提供以上功能正是份內(nèi)之事。在這個(gè)意義上,你可以認(rèn)為CB是Word2000,而C++則是英語或漢語。正如我們用英語或漢語在Word2000上寫出優(yōu)美文章,編程可說為:我們用C++語言在CB上編寫出優(yōu)美的程序。VCLvs.MFC在作為--種編程工具的意義上,我們認(rèn)為C++Builder和你也許常聽的VC(VisualC++)沒有什么本質(zhì)的區(qū)別。就像Word2000和WPS2000在本質(zhì)都是字處理軟件。但現(xiàn)在我們要從另外一個(gè)角度討論C++Builde這個(gè)編程工具。這個(gè)角度就是“封裝”——面向?qū)ο缶幊趟枷胫械淖钪匾彩亲罨A(chǔ)的概念。一個(gè)要學(xué)習(xí)編程的人,可能從c開始學(xué)起。學(xué)C時(shí),我們沒有接觸那些挺玄的概念,到了C++,—切就來了,什么面向?qū)ο?,什么封裝、繼承、多態(tài)……于是我們興奮起來,努力去理解、掌握,運(yùn)用這些概念所代表的技術(shù),在掌握這些別人暫時(shí)未能理解的概念之后而頗有成就感?,F(xiàn)在我要問的是,為什么要有這些概念?這些技術(shù)?正確回答這個(gè)問題,不僅有助于我們今后對編程語言各種概念的學(xué)習(xí),而且它能讓我們避免成為新技術(shù)的奴隸,這一切也許聽起來有些形而上,不過我想通過以下討論,至少可以回答一個(gè)很現(xiàn)實(shí)的問題:為什么要選C++Builder?而不是我們更常聽的VC?這是我碰到的編程初學(xué)者較疑惑的問題之一。如果人類長有翅膀,那么飛機(jī)大抵永遠(yuǎn)不會(huì)被發(fā)明。飛機(jī)的發(fā)明,是為了彌補(bǔ)人類自已不能飛翔的缺陷。不能說所有的技術(shù)都是這樣,但C++對于C的發(fā)展,完全是為彌補(bǔ)程序員腦力的不足。一個(gè)在校生在學(xué)會(huì)C后,往往并沒有機(jī)會(huì)用C去實(shí)踐一個(gè)大中型的項(xiàng)目,體會(huì)不到在一個(gè)龐大軟件工程中,非面向?qū)ο笳Z言的短處,所以在之后學(xué)習(xí)C++的過程中,也就很難真正體會(huì)到面向?qū)ο笳Z言的長處。簡短一點(diǎn)說:不知道C的短處,就不懂C++的長處。相反,倒是很快就發(fā)現(xiàn)C++的缺點(diǎn):它的代碼效率多數(shù)情況下都要比C低不少。前面我們說過低級語言與高級語言的對比,C++語言也正是從語法結(jié)構(gòu)和語言功能上來限定或?qū)崿F(xiàn)一門編程語言更加接近人在現(xiàn)實(shí)生活中的思維習(xí)慣,從而達(dá)到減輕人的記憶和判斷上的負(fù)擔(dān)。這其中最佳的方法之一就是所謂的“封裝二VC的封裝類庫稱為MFC,它是一種很低階的封裝,它并沒有按照人類的思維習(xí)慣來重新組織和解釋W(xué)indows對象(指Windows編程中所需的數(shù)據(jù),處理,機(jī)制,接口),而純粹是API一對一的翻版。這樣的封裝工作帶來代碼封裝所固有的代碼效率降低的副作用,卻沒有給使用者帶來任何方便。如果你是編程初學(xué)者,而你身邊又有VC高手,那么你一定要多多向他學(xué)習(xí)請教,因?yàn)橐粋€(gè)真正的VC編程高手,其同時(shí)一定也是一個(gè)深刻理解Windows內(nèi)核機(jī)制(消息循環(huán),內(nèi)存管理,多任務(wù)實(shí)現(xiàn),資源使用等),熟悉Windows各種常用API函數(shù)等等的高手。C++Builder對封裝庫稱為VCL(帶VC字樣,可別以為它是VisualC++,其實(shí)它是:VisualComponentLibrary,即:可視控件庫)。VC的MFC和CB的VCL都是基于(但不限于)對WindowsAPI(應(yīng)用程序接口函數(shù))的封裝,為什么要對API進(jìn)行封裝?這就是回到了我們前面說過的,為什么有了C又會(huì)有C++的問題。因?yàn)椴僮飨到y(tǒng)是用C和匯編寫成的,它獲得到操作系統(tǒng)必須的代碼效率,但對應(yīng)用程序開發(fā)者而言,它失去了易用性。所以微軟和Borland都使用高級語言對之進(jìn)行封裝工作。二者誰進(jìn)行得更好呢?要想成為Windows編程高手,最終一定要繞過各種封裝,理解Windows對象。但作為一個(gè)初學(xué)者,我們必須挑選一個(gè)好的封裝。下面我們舉字體(Font)作為例子,將三者:沒有封裝過的Windows字體API、封裝過的MFC字體對象和封裝過的VCL字體對象做一個(gè)對比。為了保證不會(huì)有偏倚和差錯(cuò),有關(guān)前二者的代碼,都是筆者從MSDN(微軟提供的幫助文檔)中直接拷貝出來。

WindowAPIWindowsAPI創(chuàng)建指定樣式字體:HFONTCreateFont(intnHeight,//heightoffontintnWidth,//averagecharacterwidthintnEscapement,//angleofescapementintnOrientation,//base-lineorientationangleintfnWeight,//fontweightDWORDfdwltalic,//italicattributeoptionDWORDfdwUnderline,//underlineattributeoptionDWORDfdwStrikeOut,//strikeoutattributeoptionDWORDfdwCharSet,//charactersetidentifierDWORDfdwOutputPrecision,//outputprecisionDWORDfdwC1ipPrecision,//clippingprecisionDWORDfdwQuality,//outputqualityDWORDfdwPitchAndFamily,//pitchandfamilyLPCTSTRIpszFace//typefacename);MFC(VisualC++)將HFONT封裝為CFontBOOLCFont::CreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbltalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRIpszFacename);VCL(C++Builder)將HFONT封裝為TFontl要設(shè)置字體名,高度,尺寸等使用以下代碼:Font->Name="宋體”;〃設(shè)置為宋體Font->Size=24;〃設(shè)置尺寸為24號2將字體的粗,斜,下劃線,刪除線再封裝為TFontStyle屬性:Font->Style=Font->Style?fsBold?fsUnderlien;〃字體增加粗體和下劃線屬性。對于字體不常用的旋轉(zhuǎn)等屬性,不進(jìn)行封裝,你可以直接調(diào)用API函數(shù)來設(shè)置TFont的Handle屬性。比較表中第一行和第二行:前者是原始的API,后者是VC精心的封裝成果,可惜二者兒近雷同;既然你要封裝,你就是要讓它變得面向?qū)ο?,易記易用?模一樣的照抄一遍,然后改改參數(shù)的名字,意義何在?如你是想維持代碼的效率,那么在繁雜度一樣的情況下,為什么我們不直接使用效率更高的API函數(shù)呢?倘若說,MFC的“封裝”純粹是一種多余,那或許也還可以接受。然而MFC偏偏還要在這種冗余的封裝上建立自己的應(yīng)用程序架構(gòu),和前面的“封裝”一樣,MFC建立應(yīng)用架構(gòu)的出發(fā)點(diǎn)也是良好的,為了方便Windows程序員編程的難度,而結(jié)果卻更糟糕。有問題的架構(gòu)犯了類庫或接口提供者的大忌:“有協(xié)議編程二什么叫“有協(xié)議編程”?我們先來講“無協(xié)議編程”。所謂“無協(xié)議編程”是指接口的提供者在提供接口時(shí),同時(shí)也提供接口的使用約定,這一套約定應(yīng)該在接口所要提供的功能上廣泛適用,而無須再有種種特殊的例外,這樣的接口顯然非常適于使用。學(xué)習(xí)編程,如果挑錯(cuò)了我們每天都要面對的封裝類庫,就將永遠(yuǎn)都在努力處理這些無任何意義的問題。MFC的CWnd提供了對Windows最基本的窗口元素的封裝,其中對創(chuàng)建窗口的函數(shù)的封裝為:未封裝的API:HWNDCreateWindow(LPCTSTRIpClassName,//registeredclassnameLPCTSTRIpWindowName,//windownameDWORDdwStyle,//windowstyleintx,//horizontalpositionofwindowinty,//verticalpositionofwindowintnWidth,//windowwidthintnHeight,//windowheightHWNDhWndParent,//handletoparentorownerwindowHMENUhMenu,//menuhandleorchildidentifierHINSTANCEhlnstance,//handletoapplicationinstanceLPVOIDIpParam//window-creationdata);使用這個(gè)API函數(shù),我們可以創(chuàng)建各種窗口。CWnd封裝的函數(shù):virtualBOOLCWnd::Create(LPCTSTRIpszClassName,LPCTSTRIpszWindowName,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID,CCreateContext*pContext=NULL);不用我說,你也能看出這仍然是個(gè)改改參數(shù)的蹩腳的封裝。我們不去管它,現(xiàn)在我們關(guān)心的是:CWnd::Create對CreateWindow進(jìn)行了封裝,可是這一封裝的結(jié)果是:原來CreateWindow能實(shí)現(xiàn)的一些事情,在CWnd::Create里突然成了例外。是的,為了適應(yīng)CWnd在MFC架構(gòu)中所處的角色,程序員在涉及CWnd時(shí)必須記憶這樣一條例外:“CWnd的Create用于創(chuàng)建窗口的實(shí)際元素,但其中參數(shù)dwStyle不能包含有窗口風(fēng)格中WS_POPUP(彈出式窗口),如果你要建立一個(gè)帶有該風(fēng)格的窗口,請使用CreateEx ”我仍然要說VC也是一個(gè)很優(yōu)秀的編程工具,但對于不想浪費(fèi)無謂精力的編程初學(xué)者,我個(gè)人建議使用BorlandC++Builder,因?yàn)樗鼘?shí)現(xiàn)真正的對象封裝,從而使你可以節(jié)省不低于80%的時(shí)間來學(xué)習(xí)編程本質(zhì)的知識(shí)——就是我們常說的數(shù)據(jù)結(jié)構(gòu)與算法,這些東西最終決定你的編程能力。下面是C++BuiIder提供我們的最重要的東西:一、VCL類庫:一個(gè)好的底層類庫,讓我們從學(xué)習(xí)編程最初時(shí)刻就自然而然地學(xué)會(huì)使用面向?qū)ο蟮姆椒▉韺懗绦颉K蟠蠼档土宋覀內(nèi)腴T門檻的高度,卻又讓我們--開始就站在比別人高的位置看待與程序有關(guān)的問題;二、組件技術(shù):組件技術(shù)代表了當(dāng)今編程技術(shù)的主要方向,其設(shè)計(jì)思想與MS力推的Active控件如出一轍:擁有相同的先進(jìn)性。只有借助組件技術(shù),我們才有可能從一個(gè)初學(xué)者,迅速成為可實(shí)際工作的編程工作者;另一方面,如果作為組件的提供者,我們可以編寫組件的過程中迅速提高自已的編程能力。C++Builder還提供了許多其它先進(jìn)技術(shù),如事件委拖等等,歸根到底都是通過封裝讓W(xué)indows編程原本需要長期積累才有可能掌握的知識(shí)變得直觀易懂。如果你剛剛開始學(xué)習(xí)編程,或者學(xué)習(xí)較長時(shí)間仍沒有重大突破,或許使用C++Builder結(jié)合本課程系列,是個(gè)不錯(cuò)的選擇。附言:微軟最近推出的C#相信會(huì)對上述MFC的不足做一個(gè)收拾,它對C++的擴(kuò)展與約束與BorlandC++Builder對C++的擴(kuò)展與約束驚人的相似。如果你樂意,我也真的很建議你在學(xué)完C++Builde后,繼續(xù)學(xué)習(xí)C#。熟悉BorlandC++BuiIder一、界面:啟動(dòng)BorlandC++BuilderJg,你會(huì)發(fā)現(xiàn)它的窗口和我們常見的一體化窗口的應(yīng)用程序有所不同:CB的各個(gè)子窗口并沒有集成在一個(gè)主應(yīng)用窗口中,而是分散為獨(dú)立的主窗口。C++Builder5-ProjectlDatabaseToolsHelpLanguage|<Noiine>0色1.期it靠trchW”fcroje"QJ◎當(dāng)3修][⑥二“I「古飛電111①方6|口i[Objoettandard|Additional|Win32|Svstem|DataAccess|Dat氐口蒙’%A砌目旦I區(qū)Unitl.cpp|Fo(m1:TFormlProperties|Events|ActionActiveControlAlign□AnchorsAutoScrollAutoSizeBDiMode□BofderlconsBorderStyleBorderWidthCaptionClientHeightClientwidthColo(2hidden(筆者的桌面分辨率為1024*728,但為了不讓圖的尺寸太大,我特意將各窗口拉得很?。┤绻愦蜷_CB后出現(xiàn)在界面和上圖有所不同,可以通過File菜單,再選NewApplication,建一-新的工程,則上圖標(biāo)注的2到4的窗口應(yīng)該出現(xiàn)。如果仍然有缺,請用鼠標(biāo)點(diǎn)上圖的標(biāo)注為“1”所示窗口的標(biāo)題欄(以確保為活動(dòng)狀態(tài)),然后多按幾次F11或F12,可以在以上窗口來回切換(兩者功能有不同,可以自己試一下)。下面我們來了解這四個(gè)窗口:標(biāo)注為1的窗口:這是我們比較熟悉的應(yīng)用程序主窗口,雖然它看上去是一個(gè)長條,不過其上有主菜單(MainMenu),工具欄(Toolbar),和別的軟件一樣。不一樣的是這一“長條”的右下部分的多頁式工具條。事實(shí)上它并不是尋常意義上的工具條,因?yàn)槠渖系拿恳还ぞ甙粹o并不提供執(zhí)行某一命令的功能。我們稱它為控件欄。控件是CB提供的先進(jìn)的編程思想的體現(xiàn)之一,本章后面我們會(huì)初步學(xué)習(xí)如何使用控件。標(biāo)注為2的窗口:這是一個(gè)文件編輯的窗口,我們之所以稱之為代碼編輯窗口,或簡稱為代碼窗口,由名及義,這是我們寫程序代碼的地方。標(biāo)注為3的窗口:稱它為C++Builder軟件的窗口并不妥當(dāng),它是我們自己要寫軟件的窗口。Windows操作系統(tǒng)的應(yīng)用軟件,譬如Word2000,譬如WPSOffice,或者簡單如畫筆、記事本,總是會(huì)有一或多個(gè)窗口。這是Windows應(yīng)用軟件的典型特征(Windows操作系統(tǒng)也因此稱為Windows)o盡管也可以寫沒有窗口的應(yīng)用程序,但大多數(shù)情況下我們的程序至少需要一個(gè)窗口,所以CB在創(chuàng)建新工程時(shí),總是默認(rèn)為我們生成一個(gè)主窗口,這就是標(biāo)注為3的窗口一在程序運(yùn)行前,我們稱它為“設(shè)計(jì)表單”(Form);在程序運(yùn)行之后,它就是我們程#include<vci.n>alNone[akLeft,akTop]truefalsebdLeftToRight[biSystemMenu.bibbsSizeable0Form!319498序中的窗口。我們的程序需要有兒個(gè)不同的窗口,就可在設(shè)計(jì)期間生成同樣多個(gè)類似標(biāo)注為3的設(shè)計(jì)表單。我對“表單”這個(gè)詞總是無法產(chǎn)生具體的概念,可是不僅C++Builder還是Delphi或者VisualBasic(微軟的得意之作),包括.net計(jì)劃中的C#等快速應(yīng)用程序設(shè)計(jì)系統(tǒng),都使用Form這個(gè)詞來稱呼設(shè)計(jì)期間的窗口。所以我還是統(tǒng)一口徑叫表單。但不管怎樣,如果你在我的課程中偶爾發(fā)現(xiàn)設(shè)計(jì)窗口這樣的說法,不用猜測,你盡管認(rèn)定我就是在說表單。一個(gè)原則:只在設(shè)計(jì)期間,我們才有可能稱它為表單,當(dāng)窗口運(yùn)行了,那就是窗口了,我們從不叫一個(gè)運(yùn)行著的窗口為表單。標(biāo)注為4的窗口:標(biāo)題寫著“ObjectInspector”直譯為:對象檢視器。事實(shí)上CB在調(diào)試程序時(shí)還有?個(gè)“DebugInspector",我倒覺得讓后者叫前者的名字更合適。因?yàn)檫@里的Object也就對象,可不是我們以前說過面向?qū)ο蟮膶ο螅鋵?shí)是用來查看,設(shè)置當(dāng)前放在設(shè)計(jì)表單上的某個(gè)或某些控件的屬性值和事件值的工具,后面我們會(huì)用到它。控件:也稱為“組件”,有些CB的書區(qū)分這兩者,認(rèn)為前者是后者的某一特定的子集,就是窗口1右下的控件欄上的控件,至于控件的屬性,稍后我們使用時(shí),你就會(huì)了解;為了直觀,我決定稱4號窗口為控件屬性檢視器,或者屬性檢視器,或者屬性窗口,總之離不了屬性二字。屬性檢視器有兩頁:Properties(屬性)和Events(事件)。參照下一頁的圖,在這里統(tǒng)—下口徑,如圖中Properties和Events,我們稱它為多頁(Properties為第一頁,Events為第二頁)。IForml:TForml 二JProperties|Events|BOiMode bdLeftToRight上]□Bendedcons [biSystemMenuzbiMinimizBorderStyle bsSizeableBorderWidth 0J.. v. I關(guān)于分散窗口(蘋果機(jī)早期的應(yīng)用程序風(fēng)格)的得失,我們不想在此討論。需要說明的是,CB的的各常用子窗口都提供Dockable,因此如果你喜歡集成式的窗口,大可通過鼠標(biāo)拖拖放放來定制自己的集成窗口。Dockable是指:拖動(dòng)窗口A,當(dāng)經(jīng)由窗口B的某一邊緣地帶時(shí),窗口A可以成為窗口B上的子窗口,而??吭诖翱贐的某一角落。在CB里,不僅角落可以???,當(dāng)位置為窗口B的中心時(shí),窗口B還能以多頁的方式加入窗口B。大多數(shù)軟件或許會(huì)在退出時(shí)保存住最后的窗口位置大小等設(shè)置,CB則提供你隨時(shí)保存,調(diào)用各套桌面設(shè)置,比如編寫代碼時(shí)的桌面,調(diào)試時(shí)的桌面等。以下就是筆者常用的,用于編寫代碼時(shí)CB桌面設(shè)置之一,它被我存盤為“PowerEditDsk”。這套桌面集成了類專家(ClassExplorer),工程管理(ProjectManager)及消息窗口,任務(wù)列表(To-D。List)等窗口于代碼編輯窗口內(nèi)。鑒于如果各位的桌面設(shè)置不統(tǒng)一會(huì)造成課程講解上的一些困難,另外還有一個(gè)不是理由的理由:CB有關(guān)桌面的設(shè)置有煩人的BUG,所以我們的課程使用CB默認(rèn)的桌面

設(shè)置,也是文前標(biāo)有1、2、3、4的那張圖中所示的窗口位置。編寫自已的第一個(gè)程序,并且用字幕打出“世界你好!”一這是“很早很早”以前一本C程序教材的作者的發(fā)明,后來據(jù)說成了經(jīng)典……不過很多人說這太過時(shí)了。不管怎樣,我認(rèn)為這作為我們初次使用CB的教學(xué)例子仍然很合適。很多人可能感到有點(diǎn)突然,當(dāng)CB慢吞吞啟動(dòng)后,一堆界面元素?zé)o論如何都讓人感到這不是一個(gè)輕量級的人物;我們什么編程基礎(chǔ)都沒有,能駕馭好這個(gè)巨人嗎?其實(shí)這就是CB的強(qiáng)大所在:具有高度的彈性,你可以用它編寫很小的程序,也可以集合數(shù)十個(gè)程序員,用它編寫大型軟件。二、牛刀小試:1、創(chuàng)建空白工程:這是Windows的天下,盡管在《白話C++》的學(xué)習(xí)中,Windows編程并非重點(diǎn),但我們還是選擇了Windows作為我們認(rèn)識(shí)CB的起點(diǎn)。從主菜單中選擇FileINewApplication;FileEditSearchView["INew...NewApplication(約定:在談菜單命令時(shí),我們約定用這種格式:FileINewApplication表示如上圖的實(shí)際操作。)執(zhí)行NewApplication之后,CB為我們新建個(gè)空白工程??瞻坠こ淌侵福航^大多數(shù)Windows程序所共同擁有的,必須的一個(gè)框架。再說白點(diǎn),就是你每寫一個(gè)新程序,都需要的一堆完全一樣的代碼,也就是說在多數(shù)情況,這是一步機(jī)械的工作。既然是“機(jī)械”的工作,當(dāng)然由機(jī)器來完成最合適。很多年前,筆者在VC和BC都未流行時(shí),做了一個(gè)月“機(jī)械工”后,和許多那時(shí)的程序員一樣,筆者很快嘗試自己對這部分的代碼進(jìn)行封裝。后來筆者又建議單位購買一套中國人寫的窗口對象類庫;再后來,筆者開始用BC、VC編程至今天。對于大家能有機(jī)會(huì)直接使用堪稱最好封裝的VCL學(xué)習(xí)編程,筆者能說的一句話就是:珍惜你的機(jī)會(huì),珍惜你的20元錢??瞻坠こ處в幸粋€(gè)名為“Forml”的表單(上一節(jié)圖中標(biāo)有“3”的窗口),這就是程序運(yùn)行時(shí)的主窗口,驗(yàn)證一下你就能明白。選菜單:RunIRun或者按F9鍵??瞻坠こ淌且粋€(gè)完整的工程,在被編譯成程序后運(yùn)行,出現(xiàn)一-個(gè)標(biāo)題為“Forml”的窗口。怎么和設(shè)計(jì)時(shí)的那個(gè)表單一模一樣呢?當(dāng)然,所見即所得嘛。不一樣的地方是設(shè)計(jì)表單上有一些用于定位的小點(diǎn),而運(yùn)行后的窗口沒有這些。上面左圖為表單,右圖為窗口;表單(Form)是指設(shè)計(jì)時(shí)的窗口;窗口(\¥也(10亞)指運(yùn)行時(shí)的表單。2、世界你好:從C++Builder的主窗口(上一節(jié)中標(biāo)有“1”的窗口)右下部的控件欄中找到如下圖所示的Label控件,同時(shí)記住Label控件在Standard頁中。Standard|Additional| |上圖中畫有字母“A”的圖標(biāo)按鈕即為Label,這個(gè)控件用來顯示一些簡單的文字內(nèi)容。在鼠標(biāo)按下該按鈕后(按下后按鈕的形狀如上圖),將鼠標(biāo)挪到表單Form1上隨便位置點(diǎn)左鍵一個(gè)Label控件將被放在表單上。3兇 5 ■-8D6II■ 用鼠標(biāo)再點(diǎn)一下Labell,確保它為如上圖中的被選中狀態(tài)(帶有八個(gè)黑點(diǎn)塊)。我們要通過修改屬性,讓它的內(nèi)容顯示為“Hello,World”。在主菜單上依次點(diǎn)擊ViewIObjectInspector(或者按Fl1鍵),將出現(xiàn)ObjectInspector窗口(也就是上一節(jié)中標(biāo)有“4”的窗口),我們稱為控件屬性檢視器;通過“控件屬性檢視器”,我們可檢查并設(shè)置當(dāng)前選中的控件的屬性(包括事件)。由于剛才選中了Label(如果不是,請重復(fù)用鼠標(biāo)再點(diǎn)一下表單上的Label1)。操作后ObjectInspector窗口

的上部應(yīng)顯示如下圖:的上部應(yīng)顯示如下圖:同時(shí)我們注意到上面的Label:TLabel表示當(dāng)前屬性窗口顯示的是Labell的屬性。同時(shí)我們注意到Caption屬性為Labell(注意:Name的屬性也為Labell,千萬別混T)。Caption意為“標(biāo)題”,它決定一個(gè)Label顯示的內(nèi)容。你應(yīng)該很明白怎么做了,在圖中所示的Caption屬性右邊的編輯框內(nèi),將Labell改為Hello,Worldo眼尖的學(xué)員一定發(fā)現(xiàn),在改的同時(shí),表單上的Labell如我們所愿,顯示為"Hello,World”了。筆者我眼力不鈍,但還是沒有看到結(jié)果,原因是有--個(gè)窗口擋住了Forml;此時(shí)只要按?下F12鍵,F(xiàn)orm1將跳到前|Labell:TLabelProperties||Labell:TLabelProperties|Events|口AlignalNone ▲AlignmenttaLef(JustifyEJAnchors[akLeflakTop]AutoSizehueBiDiModebdLeftToRight|CaptionHelloWorldColor□clBtnFace□Constraints(TSizeConstraints)CursorcrDefauk ▼1面。馴|0“0礴完成后按下F9鍵,只見屏幕一閃,第一個(gè)我們參與設(shè)計(jì)的程序閃亮登場了!很好,我們已經(jīng)向這個(gè)世界打了招呼,工作似乎有點(diǎn)成果。我們插播一段關(guān)于如何存盤的說明:在CB中保存程序,總體上和在字處理里保存一個(gè)文檔是一樣的操作,比如你-一般都要給新文檔命名,并且找到…個(gè)合適的位置保存。HelloWorld這里講一下特別之處:其一、建議大家為本課程中所講的例子程序準(zhǔn)備一個(gè)統(tǒng)一的文件夾,然后以這個(gè)文件夾為父文件夾,再為每一個(gè)例子各建一個(gè)子文件夾(除非是教程中特別指出需要將兩個(gè)例子工程放于一處)。其二、在字處理中(如MSWord),一個(gè)文檔就是一個(gè)文檔,而在CB的程序工程中,一個(gè)工程除了工程自身的文件以外,還包含其它配套文件。這些文件中,有些可以在保存其它文件時(shí)自動(dòng)保存,現(xiàn)在需要我們手工保存的是工程文件和代碼文件。保存文件是相當(dāng)頻繁的事,我們兒乎不用菜單,而總是使用快捷工具按鈕(Toolbar)或者鍵盤,尤其是后者。這里我只講一?個(gè)按鈕,這個(gè)有一疊軟盤的圖標(biāo)表示SaveAH(保存全部),現(xiàn)在請點(diǎn)它(或按Ctrl+Shift+S)。將彈出兩次的存盤對話框,第一次要求存盤的是代碼文件,CB默認(rèn)的文件名為Unitl;我就采用了這個(gè)默認(rèn)名,必竟這只是一個(gè)小小的工程。隨后是工程文件要求存盤,我一樣采用了默認(rèn)的Project2.bpr的名字。(因?yàn)槲覀兘?jīng)常圖省事,直接使用默認(rèn)名,所以如果不將不同的工程存在各自的文件夾內(nèi),重名的文件名就將令事情很糟糕。)最后是一些提醒:提醒一:CB默認(rèn)的存盤位置是其安裝目錄下的Projects文件夾。建議不要采用它,而是自已在外面新創(chuàng)建?個(gè)文件夾。提醒二:當(dāng)程序復(fù)雜時(shí),程序運(yùn)行甚至編譯時(shí)就有可能造成死機(jī)。所以在寫程序時(shí)常常存盤是一種非常良好且必要的習(xí)慣。除了這些,存盤是件再熟悉不過的事了,在File菜單下還有不少和存盤有關(guān)的命令。有空大家一定看看。三、DOS版Hello,World:在本部教程內(nèi),我們要集中全部精力,扎扎實(shí)實(shí)地打下C++語言的基礎(chǔ)。這是以后我們深入學(xué)習(xí)任何編程的要點(diǎn),無論是Windows編程還是你想學(xué)Linux編程,也無論我們今后在實(shí)際工作中側(cè)重于通訊或數(shù)據(jù)庫或工控;甚至無論我們以后是否用C++這門語言編程;只要有C++根基,你就會(huì)比別人更容易掌握各種編程新知。傳言也并非都是假的,關(guān)于C++晦澀難懂之類的傳言便很現(xiàn)實(shí)。另一方面,Windows編程的重點(diǎn)幾乎全部都在于如何和Windows操作系統(tǒng)打交道,它要求你有很好的C語言基礎(chǔ)。出于這樣的考慮及在實(shí)際運(yùn)行中遇到的困難,筆者放棄曾有的,“以語言為中心,同時(shí)學(xué)會(huì)Windows編程基礎(chǔ)”的理想。寫DOS風(fēng)格的程序想起來是令人沮喪的;沒有華麗的窗口界面,也不再使用那些功能強(qiáng)大的控件,但正因?yàn)镈OS程序的樸素,它可以使我們更好地將重心放在C++語言本身;等到學(xué)習(xí)第二部教程時(shí),我們才有足夠的底氣對Windows世界說一聲:我來了!1、空白控制臺(tái)工程:如果你的CB停留在前面Windows版HelloWorld工程中,請確保退出HelloWorld的窗口。然后選主菜單:FileICloseAll,關(guān)閉Windows版HelloWorld工程。依次點(diǎn)擊菜單:FileINew,出現(xiàn)一個(gè)NewItems對話框,等待我們選擇要新建什么。默認(rèn)的選中項(xiàng)是上頁圖中New頁內(nèi)的第一-個(gè):Application0如果選它,確認(rèn)后的工程就是上一節(jié)我們創(chuàng)建的空的工程。但現(xiàn)在我們要建立一個(gè)DOS風(fēng)格的程序。選上圖中加有紅圈的ConsoleWizard(控制臺(tái)程序向?qū)В?。確認(rèn)后出現(xiàn)向?qū)У牡谝徊剑赫埬_認(rèn)將對話框中的相關(guān)選項(xiàng)設(shè)置成和上圖一致,然后點(diǎn)OK按鈕。沒有表單,只有代碼編輯框窗口(第一節(jié)的“2”號窗口)內(nèi)中代碼為://- #pragmahdrstop//- #pragmaargsusedintmain(intargc,char*argv[])(return0;}// 這是C語言的主函數(shù),或者稱為入口函數(shù)。程序從這個(gè)地方作為起點(diǎn)開始執(zhí)行,以后會(huì)有更多講解。同樣地,這也是一個(gè)程序框架,一個(gè)空白的DOS程序框架。讓我們選菜單中RunIRun或直接按F9鍵,看看結(jié)果和前面的Windows空白程序會(huì)有什么不同?眼前出現(xiàn)一個(gè)黑色的窗口,然后就一晃而過,回到了C++Builder的界面。黑色的窗口,在不同版本的Windows中有不同的叫法和不同的實(shí)現(xiàn)機(jī)制,但都是Windows操作系統(tǒng)兼容DOS的方式。這種DOS方式在術(shù)語上稱為“控制臺(tái)/console"。如果你不明白什么是DOS,請通過其它途徑另外學(xué)習(xí)。2、用控制臺(tái)輸出“Hell。world”:我們需要加入三行代碼才能實(shí)現(xiàn)DOS版的HelloWorld;以下黑體部分為你需要在代碼中加入的內(nèi)容:(約定:在代碼中使用黑體,用來表示您應(yīng)該輸入的部分)// #include<stdio.h>#pragmahdrstop// #pragmaargsusedintmain(intargc,char*argv[])(printf("HeIIo,worId!”);getchar();return0;}//- 這是一?個(gè)很短的程序,我們稍微做點(diǎn)解說:如果作一個(gè)大的程序,代碼一多自己都會(huì)看暈,所以就需要在代碼中加一些注釋,用以解說某行或某段代碼的用途,或者用以讓代碼顯得清晰。C++中,常用雙斜杠“〃”開始,一直到該行結(jié)束的內(nèi)容來代表注釋。上面的代碼中,有三行:// 這正是用來從視覺上分隔代碼的注釋。注釋對程序的運(yùn)行沒有任何影響,其作用只用來給人看的。當(dāng)編譯器編譯進(jìn),它會(huì)過濾掉所的有注釋內(nèi)容。#pragmahdrstop和#pragmaargsused兩行為編譯預(yù)處理命令,當(dāng)編譯器在編譯本段代碼,預(yù)處理命令會(huì)影響編譯的某些行為。#include<stdio.h>是我們新加的一行,stdio.h是一個(gè)文件的名字,擴(kuò)展名是.h。h是head的意思,所以被稱為頭文件。這個(gè)文件在哪里呢?在你的機(jī)器里,在C++Builder安裝后的文件夾內(nèi)的某個(gè)子文件夾內(nèi);在這個(gè)文件夾內(nèi),C++Builder為我們提供了上千個(gè)頭文件。頭文件起什么作用呢?C++Builder為我們提供了函數(shù)庫(RTL/runtimelibrary)和類庫(VCL);而Windows操作系統(tǒng)(Windows用C寫成)則向我們提供了API函數(shù)庫?!皫臁笔恰皟?chǔ)存”大量實(shí)用的解決各種問題,實(shí)現(xiàn)各種功能的“工具”的地方,它們都通過頭文件列出清單。當(dāng)我們寫上#include<stdio.h>這一行時(shí),我們是在向編譯器說明:本文件中的程序需要用到stdio.h頭文件中所列的某些函數(shù);“include”正是包含之意。printf("Hello,world!");getchar();printft和getchar正是兩個(gè)在stdio.h中列出來的函數(shù)。如果沒有#include<stdio.h>這一行,編譯器便會(huì)報(bào)錯(cuò)說不認(rèn)識(shí)這兩個(gè)符號。換句話說,include語句讓編譯器知道我們要用的庫函數(shù)在哪一個(gè)庫里。我們會(huì)在下一節(jié)“簡單程序調(diào)試”中做相應(yīng)試驗(yàn)。Print是打印之意,而f則為format,二者結(jié)合意為“有格式地打印”。我們的Hell。World不需要任何格式。至于getchar從字面上理解是“得到字符”,事實(shí)上就是程序會(huì)在此處停下來,等待用戶輸入字符,直到輸入一個(gè)回車符,程序繼續(xù)執(zhí)行。在我們的這個(gè)程序里,繼續(xù)執(zhí)行的結(jié)果是碰上這一行:return0;return的意思是返回,當(dāng)主函數(shù)main返回時(shí),整個(gè)程序就結(jié)束了。所以,使用這個(gè)getchar()的目的很明顯:讓程序在結(jié)束之前可以等我們一下(因?yàn)槲覀冃枰?-眼輸出的"HelloWorld”)。Printf的作用是輸出(output)內(nèi)容,而getchar。則是等待你輸入,從這一點(diǎn)看,我們也可以理解前面include為什么是stdio.h了。std是英文標(biāo)準(zhǔn)的前三個(gè)字符,而I和0分別是input和output的首字母。說了很長,但程序運(yùn)行結(jié)果卻很簡單,這是按F9后的運(yùn)行結(jié)果:按回車結(jié)束程序。結(jié)束后,別忘了保存我們的第二個(gè)程序。四、簡單程序調(diào)試:1、編譯期錯(cuò)誤與運(yùn)行期錯(cuò)誤:如果我在上面的程序輸出時(shí),打出的字幕不是“Hello,world",而是“Hello,word”。你一定會(huì)說“哎,哥們,程序錯(cuò)了!于是,我就要去代碼中查找有關(guān)輸出的那一句,一看,喲,真少寫了一個(gè)T。將這一錯(cuò)吳改正,重新運(yùn)行,檢查結(jié)果。這就是一個(gè)調(diào)試過程,發(fā)現(xiàn)錯(cuò)誤;查找出錯(cuò)原因;改正;再運(yùn)行。當(dāng)然,由于很多時(shí)候我們也不是非要等到發(fā)現(xiàn)錯(cuò)誤了才去檢查,有時(shí)我們會(huì)主動(dòng)一步步去事先主動(dòng)檢查是否有錯(cuò)。必竟BUG總是常見的。程序錯(cuò)誤(BUG)表現(xiàn)上各式各樣,但若是從其“發(fā)作”的時(shí)間上分,則可分為“編譯期錯(cuò)誤”和“運(yùn)行期錯(cuò)誤”。如果上面說的錯(cuò)誤屬于后者,因?yàn)樗鼘幾g過程并不產(chǎn)生什么阻礙,編譯可以通過,錯(cuò)誤將在運(yùn)行中表現(xiàn)出來(按時(shí)間分還有一種稱為“鏈接期錯(cuò)誤”,這里不說)。在上--節(jié)的代碼中,我們來故意制造一個(gè)編譯期的BUG,我們故意將最后一-句代碼:return0;行末的分號刪除,代碼如下:intmain(intargc,char*argv[])(printf("Hello,world!");getchar();return0〃根據(jù)約定,我們用粗斜體表示修改過的代碼}寫好代碼后按F9,程序并沒有跑起來。但在代碼編器窗口下面,出現(xiàn)一消息框(如果你沒有發(fā)現(xiàn),請?jiān)诖a窗口中點(diǎn)鼠標(biāo)右鍵,將出現(xiàn)右鍵菜單,選:MessageView項(xiàng))。編譯過程是一個(gè)相當(dāng)復(fù)雜的過程,在編譯之前,代碼會(huì)被做很多格式上的轉(zhuǎn)換,人寫代碼出錯(cuò)的原因也五花八門,所以想讓編譯器判斷到底你犯了什么錯(cuò)吳事實(shí)上是很難的,但CB的編譯出錯(cuò)消息仍竭盡全力讓我們找到出錯(cuò)原因:[C++Error]:錯(cuò)誤類型;這是在告訴我們,這是?個(gè)C++語言語法方面的錯(cuò)誤。編譯器說對了,因?yàn)槲覀兩賹懸粋€(gè)分號,確實(shí)是犯了C++語法錯(cuò)誤。Unit.cpp(13):錯(cuò)誤位置;說的是在Unit.cpp這個(gè)文件內(nèi)的第13行,出錯(cuò)的文件顯然是說對了,但行數(shù)卻稍有偏差,少了分號的那行其實(shí)是第12行,從狀態(tài)欄可以看到當(dāng)前光標(biāo)位置的行列數(shù)。E2378:錯(cuò)誤編號,CB對各錯(cuò)誤消息進(jìn)行了編號。Returnstatementmissing;錯(cuò)誤消息;在這里這個(gè)消息完全正確,"return”語句丟了分號。在使用中,并不是每回都能幸運(yùn)得到這樣準(zhǔn)確的錯(cuò)誤報(bào)告和消息。比如,同樣是去掉分號,但這回是把return。一句的分號補(bǔ)上,轉(zhuǎn)而去掉printf("Helloworld!")這一行的分號,編譯出錯(cuò)消息是這樣:錯(cuò)誤消息說我們調(diào)用了一個(gè)“非函數(shù)”,為什么呢?答案是因?yàn)闆]有了分號,編譯將兩句連成一句:printf("Helo,world!")getchar();這樣,它就把printfCHelo,world!w)getchar整個(gè)兒認(rèn)為是一個(gè)函數(shù)名,于是就不認(rèn)識(shí)它了。下面我們做一個(gè)實(shí)驗(yàn),結(jié)果報(bào)錯(cuò)也同樣為“Callofnonfunctionw,但原因不是我們寫錯(cuò)了函數(shù)名,而是我們使用了庫函數(shù),只是沒有通過include語句來告訴編譯器:這些函數(shù)在哪個(gè)庫里。//- //#include<stdio.h>#pragmahdrstop// #pragmaargsusedintmain(intargc,char*argv[])printf("Hello,world!");getchar();return0;}//- 代碼中,我們故意用“〃”將#include<stdio.h>從一行代碼搖身一變成為一行注釋,前面說過注釋是僅給人看的,編譯看不到這一行,相當(dāng)于這一行被刪除了;現(xiàn)在編譯這-行,錯(cuò)誤提示如下:兩行同樣類型的錯(cuò)誤消息,編譯器一下子不認(rèn)識(shí)printf和getchar兩個(gè)函數(shù)了。五、學(xué)會(huì)使用幫助文檔:經(jīng)過上一節(jié),同學(xué)可能會(huì)問三個(gè)問題:第一:怎么知道有printf和getchar這個(gè)兩個(gè)函數(shù)呢?回答:有兩個(gè)途徑,常用的函數(shù)會(huì)在課程里講到,其它函數(shù)則根據(jù)需要在幫助文檔中查找。第二:怎么會(huì)知道printf是用來輸出,而getchar則可以用于等待輸入?回答:和上面一致,從課程和幫助文檔中獲得。第三:就算知道了printf這個(gè)函數(shù),又怎么才能知道它在stdi。這個(gè)頭文件對應(yīng)的庫里?回答還是一樣。學(xué)會(huì)使用幫助文檔很重要,文檔有多種,比如有專門的函數(shù)大全之類的書,不過現(xiàn)在的文檔是幫助文檔。初學(xué)者在調(diào)試程序時(shí),很多人由于英文不佳,于是根本不去動(dòng)幫助文檔。其實(shí)當(dāng)你帶些具體的目的去看幫助文檔,你會(huì)發(fā)現(xiàn)就算英文不好,也可以從中獲得幫助,解決大部分程序問題。我們用一節(jié)的那個(gè)BUG來說明問題。假如你用了printf和getchar這兩個(gè)函數(shù),但你不知它們包含在哪個(gè)庫里(也就是說你不知道在#include之后應(yīng)該寫“stdio.h"),可以這樣作:依次點(diǎn)擊菜單:HelpIC++BuilderHelp-在出現(xiàn)的Windows標(biāo)準(zhǔn)的幫助索引窗口中的索引行內(nèi)鍵入:printf回車。

找到的有關(guān)printf的幫助如下一頁的圖示:提高英語水平對學(xué)習(xí)編程的幫助是很大的。數(shù)據(jù)類型的基本概念一、數(shù)據(jù)類型:在計(jì)算機(jī)編程世界中,有哪些基本的數(shù)據(jù)類型?在人類世界里,數(shù)據(jù)類型很多,把人類的對萬物劃分類型的方法照搬入計(jì)算機(jī)世界,顯然不可能,怎么辦呢?方法就是:抽象。計(jì)算機(jī)先哲們?yōu)槲覀冏隽诉@一切;其中最重要的類型也稱為“C和C++語言的基本數(shù)據(jù)類型”,只有兩個(gè):“數(shù)值”和“字符”?,F(xiàn)實(shí)生活中,數(shù)字被廣泛地應(yīng)用在兩種不同的范疇;其一:是那些典型的,需要進(jìn)行計(jì)算的場合;其二,則是那些只用來表示符號的范疇。比如電話號碼和車牌號,把兩個(gè)電話號碼進(jìn)行相加或相減的操作是沒有意義的。基于數(shù)字的兩種完全不一樣的使用范疇在被抽象到計(jì)算機(jī)程序語言時(shí),數(shù)字被分到“數(shù)值”和“字符”兩種類型中;但字符類型并不只有阿拉伯?dāng)?shù)字,鍵盤上的字母符號,都屬于字符類型。在C和C++中,“字符類型”其實(shí)也可歸入數(shù)值類型。在某些情況下,它仍然會(huì)被用來參與計(jì)算。比如在計(jì)算機(jī)中,字符W加1后,會(huì)得到下一個(gè)字符,B,,這種操作符合我們的習(xí)慣。二、整型和實(shí)型:數(shù)值類型乂被分為“整型”和“實(shí)型整型就是不帶小數(shù)位的數(shù),而實(shí)型則是指帶小數(shù)位的數(shù),也稱為“浮點(diǎn)數(shù)”。我們在生活中一般并不做如此區(qū)分。譬如說雞蛋的價(jià)格罷,今兒便宜了,一斤2塊整,但這不防礙明兒價(jià)漲了,我們說成:漲了,2.30元一斤。在編程時(shí)可不能這樣,你必須事先考慮到雞蛋的價(jià)格是必須帶小數(shù)的,就算現(xiàn)在是2塊整,也得將價(jià)格定為實(shí)型,否則,漲成2塊3時(shí),計(jì)算機(jī)會(huì)把那0.3元給丟了,還是變成2元整。你也許會(huì)問,為什么不直接就定一個(gè)實(shí)型就好呢?實(shí)型不就包含了整型的值嗎(如2.0等于2元)?回答很簡單:因?yàn)樵谟?jì)算機(jī)里,對整數(shù)的運(yùn)算要遠(yuǎn)遠(yuǎn)快于對浮點(diǎn)數(shù)的運(yùn)算,所以,在人類的思維習(xí)慣與計(jì)算機(jī)特點(diǎn)之間,必須做一個(gè)折衷。折衷的結(jié)果就是雖然都是數(shù)值類型,但程序員在寫程序時(shí),必須事先想好,哪些數(shù)據(jù)是必須帶小數(shù)計(jì)算的,那些數(shù)據(jù)定為實(shí)型較好,比如工資,沒有哪個(gè)員工會(huì)認(rèn)為老板可以將自己工資中的小數(shù)位忽略不計(jì);而那些可以不用,或者可以不計(jì)較小數(shù)的數(shù)值,則被建議設(shè)計(jì)成整型,比如人的年紀(jì),雖然可以,但我們很少需要有類似1.6歲這種說法。想想,假如一位女士說自己28歲,而你卻立刻糾正她:“不,準(zhǔn)確地說,您已經(jīng)28.7歲了”……結(jié)局會(huì)怎樣呢?為了那0.7歲,不僅你的程序會(huì)跑得慢,而且會(huì)倍受女人的白眼殺傷。想想其實(shí)也很自然:工資必須設(shè)計(jì)成實(shí)型,而年齡雖然不是必須,但建議設(shè)計(jì)成整型。三、數(shù)值的范圍:顧及計(jì)算機(jī)的運(yùn)行速度,人(程序員)做出了妥協(xié),必須對"整型''或“實(shí)型”做出考慮。另一方面,和速度同樣重要的是計(jì)算機(jī)的空間的考慮,它讓程序員必須再做?步妥協(xié)。有時(shí)候,在計(jì)算機(jī)中你設(shè)置了一個(gè)數(shù),當(dāng)再住這個(gè)數(shù)加1時(shí),真不幸,計(jì)算機(jī)會(huì)告訴你說:加1是加1了,可是結(jié)果變成0,甚至是負(fù)數(shù)。這就是計(jì)算機(jī)的空間問題:任何一個(gè)量,都有一個(gè)大的上限,和小的下限,出了這個(gè)范圍(比上限還大,比下限還?。?就會(huì)稱為溢出。這是--種物理的現(xiàn)實(shí),也是一種人為的規(guī)定。為什么要這樣規(guī)定?原因是計(jì)算機(jī)的存儲(chǔ)器,特別是其中很重要的內(nèi)存,其可存儲(chǔ)的數(shù)據(jù)多少總是有限度的(而且,同樣大小數(shù),2進(jìn)制的表達(dá)形式比10進(jìn)制長得多),如果允許編程像生活中--樣任何一個(gè)數(shù)都可以很大很大,也就是這個(gè)量表達(dá)起來將很長很長,那么存儲(chǔ)器的空間就會(huì)很快用完?。o窮大就不用說了,因?yàn)椴豢赡苡袩o窮大的存儲(chǔ)器)。就是這樣,數(shù)值類型在被劃分為整型和實(shí)型后,將根據(jù)所占用的空間而被繼續(xù)劃分為兒種不同的類型。而我們在考慮工資必須設(shè)計(jì)成帶小數(shù)的實(shí)型后,必須再面對--個(gè)設(shè)計(jì)上的考慮,工資這個(gè)量在程序里要占多大空間?依據(jù)其實(shí)很簡單,就看你的單位最高月薪是多少,憑此找到??個(gè)合適的類型。比如月薪不超過1萬元,那我們選擇一個(gè)剛剛可以包含10000的數(shù)據(jù)類型。兩種基礎(chǔ)類型:數(shù)值類型和字符類型,前者說了很多,現(xiàn)在我們也來對字符類型做一些附加說明。字符類型要比數(shù)值類型簡單得多,它不能帶小數(shù),所以沒有整型實(shí)型之說;它占用1個(gè)字節(jié),已經(jīng)是計(jì)算機(jī)能單獨(dú)處理的最小空間單位,所以也不存在繼續(xù)分為不同空間長度的問題,所以我們將以它為例,詳細(xì)說明有關(guān)數(shù)據(jù)類型的一些基本而重要的概念。第一:由于計(jì)算機(jī)和編程都是老外的發(fā)明,而老外生活中常用的字符并不多(主要是阿拉伯?dāng)?shù)字、英文字母、標(biāo)點(diǎn)符號等),所以字符的寬度被定為1個(gè)字節(jié)。1字節(jié)=8位,所以它能表示的最大數(shù)當(dāng)然是8位都是1(既然2進(jìn)制的數(shù)只能是0或1,如果是我們常見的10進(jìn)制,那就8位都為9,這樣說你該懂了?)o1字節(jié)的二進(jìn)制數(shù)中的最大數(shù)是11111111。無論是什么進(jìn)制,都是左邊是高位,右邊是低位。第?章中我們說過,10進(jìn)制數(shù)的最低位(個(gè))的權(quán)值是100,第二位是101,第三位是102……,用小學(xué)課本上的說法就是:個(gè)位上的數(shù)表示幾個(gè)1,十位上的數(shù)表示幾個(gè)10,百位上的數(shù)表示幾個(gè)100……二進(jìn)制數(shù)則是:第1位數(shù)表示幾個(gè)1(20),第2位數(shù)表示幾個(gè)2(21),第3位數(shù)表示幾個(gè)4(22),第4位數(shù)表示向個(gè)8(23)……在C和C++中,很多計(jì)數(shù)的習(xí)慣都是從0開始,所以在你看明白上面那些內(nèi)容后,讓我們立刻改口換成下面的說法,以后我們只用這種說法:二進(jìn)制數(shù):第0位數(shù)表示兒個(gè)1(20),第1位數(shù)表示幾個(gè)2(21),第3位數(shù)表示兒個(gè)4(22),第4位數(shù)表示向個(gè)8(23)……按照這種說法,我們可以發(fā)現(xiàn),從右向左數(shù),第n位數(shù)的權(quán)值=2的n次方。二進(jìn)制各位權(quán)值的計(jì)算方法:第n位權(quán)值=2no下表詳細(xì)地表示2進(jìn)制數(shù)11111111是如何逐位計(jì)算,累加得到10進(jìn)制的值:第兒位76543210合計(jì)權(quán)值27=12826=6425=3224=1623=822=421=220=12進(jìn)制1111111110進(jìn)制128643216S421255上表表示了這么一個(gè)計(jì)算過程(*表示乘號):1*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20=255計(jì)算結(jié)果是:11111111(b)=255(d)(為了不互相混淆,我們在書中常用(b)來表示前面的數(shù)是2進(jìn)制的,而(d)則表示該數(shù)是10進(jìn)制數(shù)。同樣地,另有8進(jìn)制數(shù)用(o)表示,16進(jìn)制用(h)表示。不過記住了,這只是在書中使用,在程序中,另有一套表示方法。)以前我們知道1個(gè)字節(jié)有8位,現(xiàn)在通過計(jì)算,我們又得知:1個(gè)字節(jié)可以表達(dá)的最大的數(shù)是255,也就是說表示。?255這256個(gè)數(shù)。那么兩個(gè)字節(jié)(雙字節(jié)數(shù))呢?雙字節(jié)共16位1111111111111111,這個(gè)數(shù)并不大,但長得有點(diǎn)眼暈。從現(xiàn)在起,我們要學(xué)會(huì)這樣來表達(dá)二制數(shù):1111111111111111,即每4位隔?空格。雙字節(jié)數(shù)最大值為:1*215+1*214+1*213+1*212+1*211+1*210+ +1*22+1*21+1*20=65535很自然的,我們可以想到,一種數(shù)據(jù)類型允許的最大值,和它的位數(shù)有關(guān)。n位二進(jìn)制數(shù)的最大值:1*2(n-l)+1*2(n-2)+...+1*20任何一種基本數(shù)據(jù)類型,都有其范圍。比如字符類型,它的最大值是255,那么當(dāng)一個(gè)數(shù)在其類型的范圍已經(jīng)是最大值時(shí),如果再往上加1,就會(huì)造成“溢出其實(shí),有限定范圍的數(shù)量并不只在計(jì)算機(jī)中出現(xiàn),鐘表就是一個(gè)例子;10點(diǎn)再加1點(diǎn)是11點(diǎn),再加1點(diǎn)是12點(diǎn),可是再加1點(diǎn),就又回到1點(diǎn)。再如汽車的行程表,假設(shè)最多只能顯示99999公里,當(dāng)達(dá)到最高值后繼續(xù)行駛,行程表就會(huì)顯示為00000公里。四、有符號數(shù)和無符號數(shù):回頭看上一節(jié),我們所講的數(shù)都是正數(shù)。同樣是年紀(jì)和工資,前者不需要有負(fù)值,但后者可能需要。那么,負(fù)數(shù)在計(jì)算機(jī)中如何表示呢?關(guān)于這一點(diǎn),你可能聽過兩種不同的回答。一種是教科書,它會(huì)告訴你:計(jì)算機(jī)用“補(bǔ)碼”表示負(fù)數(shù)??墒怯嘘P(guān)“補(bǔ)碼”的概念一說就得一節(jié)課,這一些我們需要在第6章中用一章的篇幅講2進(jìn)制的一切;再者,用“補(bǔ)碼''表示負(fù)數(shù),其實(shí)只是說出一種公式,公式的作用在于告訴你,想得到問題的答案,應(yīng)該如何計(jì)算。卻并沒有告訴你為什么用這個(gè)公式就可以得到答案?另一種是一些程序員告訴你的:用二進(jìn)制數(shù)的最高位表示符號,最高位是0,表示正數(shù),最高位是1,表示負(fù)數(shù)。這種說法本身沒錯(cuò),可是如果沒有下文,那么它就是錯(cuò)的。至少它不能解釋出,為什么字符類型的-1用二進(jìn)制表示是“1111 進(jìn)制為FF);而不是我們更能理解的“10000001”(為什么說后者更好理解呢?因?yàn)榧热徽f最高位是1時(shí)表示負(fù)數(shù),那10000001不是正好是-1嗎?)o關(guān)于這一點(diǎn),讓我們從頭說起。1、你自已決定是否需要有正負(fù)。就像我們必須決定某個(gè)量使用整數(shù)還是實(shí)數(shù),使用多大的范圍的數(shù)一樣,我們必須自已決定某個(gè)量是否需要正負(fù)。如果這個(gè)量不會(huì)有負(fù)值,那么我們可以定它為帶正負(fù)的類型。在計(jì)算機(jī)中,可以區(qū)分正負(fù)的類型,稱為有符類型,無正負(fù)的類型(只有正值):稱為無符類型。數(shù)值類型分為整型或?qū)嵭?,其中整型又分為無符類型或有符類型,而實(shí)型則只有符類型。字符類型也分為有符和無符類型。比如有兩個(gè)量,年齡和庫存,我們可以定前者為無符的字符類型,后者定為有符的整數(shù)類型。2、使用二制數(shù)中的最高位表示正負(fù)。首先得知道最高位是哪一位?1個(gè)字節(jié)的類型,如字符類型,最高位是第7位;2個(gè)字節(jié)的數(shù),最高位是第15位;4個(gè)字節(jié)的數(shù),最高位是第31位。不同長度的數(shù)值類型,其最高位也就不同,但總是最左邊的那位(如下示意中的粗體字為最高位)。字符類型固定是1個(gè)字節(jié),所以最高位總是第7位。單字節(jié)數(shù):11111111雙字節(jié)數(shù):1111111111111111四字節(jié)數(shù):11111111111111111111111111111111當(dāng)我們指定一個(gè)數(shù)量是無符號類型時(shí),其最高位的1或。和其它位一樣,用來表示該數(shù)的大小。當(dāng)我們指定一個(gè)數(shù)量是無符號類型時(shí),此時(shí),最高數(shù)稱為“符號位”。為1時(shí),表示該數(shù)為負(fù)值,為。時(shí)表示為正值。3、無符號數(shù)和有符號數(shù)的范圍區(qū)別。無符號數(shù)中,所有的位都用于直接表示該值的大小,有符號數(shù)中最高位用于表示正負(fù),所以,當(dāng)為正值時(shí),該數(shù)的最大值就會(huì)變小。我們舉一個(gè)字節(jié)的數(shù)值對比:無符號數(shù):11111111值:2551*27+1*26+1*25+1*24+1*23+1*22+1*21+1*20有符號數(shù):01111111值:127 1*26+1*25+1*24+1*23+1*22+1*21+1*20同樣是一個(gè)字節(jié),無符號數(shù)的最大值是255,而有符號數(shù)的最大值是127o原因是有符號數(shù)中的最高位被挪去表示符號了。并且,我們知道,最高位的權(quán)值也是最高的(對于1字節(jié)數(shù)來說是2的7次方=128),所以僅僅少于一位,最大值一下子減半。有符號數(shù)的長處是可以表示負(fù)數(shù)。因此,雖然它的在最大值縮水了,卻在負(fù)值的方向出現(xiàn)了伸展。我們?nèi)砸砸粋€(gè)字節(jié)的數(shù)值對比:無符號數(shù): 0 255有符號數(shù):-128 0 127同樣是一個(gè)字節(jié),無符號的最小值是0,而有符號數(shù)的最小值是-128。所以二者能表達(dá)的不同的數(shù)值的個(gè)數(shù)都一樣是256個(gè)。只不過前者表達(dá)的是0到255這256個(gè)數(shù),后者表達(dá)的是-128到+127這256個(gè)數(shù)。一個(gè)有符號的數(shù)據(jù)類型的最小值是如何計(jì)算出來的呢?有符號的數(shù)據(jù)類型的最大值的計(jì)算方法完全和無符號一樣,只不過它少了一個(gè)最高位(見第3點(diǎn));但在負(fù)值范圍內(nèi),數(shù)值的計(jì)算方法不能直接使用1*26+1*25的公式進(jìn)行轉(zhuǎn)換。在計(jì)算機(jī)中,負(fù)數(shù)除為最高位為1以外,還采用補(bǔ)碼形式進(jìn)行表達(dá)。所以在計(jì)算其值前,需要對補(bǔ)碼進(jìn)行還原。這些內(nèi)容我們將在第六章中的二進(jìn)制知識(shí)中統(tǒng)一學(xué)習(xí)。這里,先直觀地看一眼補(bǔ)碼的形式:以我們原有的數(shù)學(xué)經(jīng)驗(yàn),在10進(jìn)制中,1表示正1;而加上負(fù)號,-1則表示和1相對的負(fù)值。那么,我們會(huì)很容易認(rèn)為在2進(jìn)制中(1個(gè)字節(jié)):00000001表示正1,則高位為1后:10000001應(yīng)該表示-1。然而,事實(shí)上計(jì)算機(jī)中的規(guī)定有些相反,請看下表:二進(jìn)制值(1字節(jié))十進(jìn)制值10000000-12810000001-12710000010-1261000(X)11卜125 |… 1L 111111110t? 111111111-i首先我們看到,從-1到-128,其二進(jìn)制的最高位都是1(表中標(biāo)為紅色),正如我們前面的學(xué)。然后我們有些奇怪地發(fā)現(xiàn),10000000并沒有拿來表示-0;而10000(X)1也不是拿來直觀地表示-1。事實(shí)上,在計(jì)算機(jī)中-1用11111111來表示。怎么理解這個(gè)問題呢?先得問一句是-1大還是-128大?當(dāng)然是-1大,-1是最大的負(fù)整數(shù)。以此對應(yīng),計(jì)算機(jī)中無論是字符類型還是整數(shù)類型,也無論這個(gè)整數(shù)是兒個(gè)字節(jié)。它都用全1來表示-1。比如一個(gè)字節(jié)的數(shù)值中:11111111表示-1,那么,11111111-1是什么呢?和現(xiàn)實(shí)中的計(jì)算結(jié)果完全一致。11111111-1=11111110,而11111110就是-2。這樣一直減下去,當(dāng)減到只剩最高位用于表示符號的1以外,其它低位全為0時(shí),就是最小的負(fù)值了,在一字節(jié)中,最小的負(fù)值是10000000即-128。我們以-1為例,來看看不同字節(jié)數(shù)的整數(shù)中,如何表達(dá)/這個(gè)數(shù):|字節(jié)數(shù) ||二進(jìn)制值 |十進(jìn)制值|單字節(jié)數(shù)pmmi ?1雙字節(jié)數(shù)mimimimi ?4四字節(jié)數(shù)mimimimimimimimi?1可能有同學(xué)這時(shí)會(huì)混了,為什么11111111有時(shí)表示255,有時(shí)又表示-1?所以我再強(qiáng)調(diào)一下本節(jié)前面所說的第2點(diǎn):你自已決定一個(gè)數(shù)是有符號還是無符號的。寫程序時(shí),指定一個(gè)量是有符號的,那么當(dāng)這個(gè)量的二進(jìn)制各位上都是1時(shí),它表示的數(shù)就是-1;相反,如果事選聲明這個(gè)量是無符號的,此時(shí)它表示的就是該量允許的最大值,對于一個(gè)字節(jié)的數(shù)來說,最大值就是255。這一節(jié)課,看似羅嗦,但我希望每位沒有編程基礎(chǔ),或者以前對進(jìn)制,對負(fù)值、補(bǔ)碼和反碼等概念,對數(shù)據(jù)類型理解不透徹的學(xué)員,都能多花點(diǎn)時(shí)間反復(fù)閱讀,直到看懂文中的每-張圖表的意思為止。五、字符集和保留字:字符集和保留并不專屬于“數(shù)據(jù)類型”的基礎(chǔ)知識(shí),它是一門語言最基礎(chǔ)的東西,就像字母A-Z對于英語的作用一樣,我把它放到這里,更多的是因?yàn)檫@是我們第一次要碰到它,在下一節(jié)中馬上就要用上了。感覺上它的難度和學(xué)會(huì)26個(gè)字母差不了多少。字符集:每種語言都使用一組字符來構(gòu)造有意義的語句,組成C++程序,最終是以下這些字符(空格這個(gè)字符不好表示,就直接寫上“空格”兩字了,以后同):26個(gè)字母的大小寫形式:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrst;10個(gè)阿拉伯?dāng)?shù)字:0123456789;其它符號:+-*/=,._:;?\"'~l!#%&()[]{}A<>(空格)其它符號(包括漢字),可以作為程序中字符串的內(nèi)容,用于顯示等。最后要說明的是,C和C++語言是區(qū)分大小寫的語言,也就是說ABC和abc并不相同。保留字:保留字也稱關(guān)鍵字,它是預(yù)先定義好的標(biāo)識(shí)符,這些標(biāo)識(shí)符必須保留給C++語言自身專用,因?yàn)樗鼈冇脕碓诰幾g過程中表示特殊的含義;比如,我們想定義一個(gè)量為整數(shù)類型,那么C++就必須有一個(gè)詞來表示什么是整數(shù)類型,這個(gè)詞就是一個(gè)關(guān)鍵字。C和C++主要的關(guān)鍵字,我們在章末附表列出。下面先列出本章要用的關(guān)鍵字:char:字符類型int:整型float:單精度實(shí)型(浮點(diǎn)型)double:雙精度實(shí)型unsigned:無符號類型signed:有符號類型bool :布爾類型true :布爾類型的真值false :布爾類型的假值void :無類型sizeof:取得指定類型的所占用的范圍typedef:為某種類型取-別名六、基本數(shù)據(jù)類型:前面講了一些有關(guān)數(shù)據(jù)類型的各種基本概念,下面是數(shù)據(jù)類型這?課真正開始的時(shí)候,如果在其中你有什么概念不能理解,最好的方法就是首先回頭看本章前面的內(nèi)容。1、字符型和各種整型、實(shí)型:類型標(biāo)識(shí)符類型說明卜用備注char字符型1II|-128-127-27-(27-1)unsignedchar無符字符型10-2550~(28-1)shortint短整型2-32768~327672-15-(215-1)[unsignedshortint|1無符短整型20~655350-(216-1)卜型4-21474836482147483647-231~(231-1)unsignedint無符整型40~42949672950-(232-1)float實(shí)型(單精度)41.18*10-38~3.40*10387位有效位double實(shí)型(雙精度)82.23*10-3081.79*1030815位有效位longdouble實(shí)型(長雙精度)103.37*10-49321.18*10493219位有效位unsigned用于修飾int和char類型,它使int或char類型成為無符號類型signed是unsigned的反義詞,如signedint表示有符號類型,不過signed可以省略,所以上面列出char,shortint,int都是有符號類型。有shortint(短整型),所以也就有對應(yīng)longint(長整型)。longint用于表示4個(gè)字節(jié)(32位)的整數(shù)。但是在我們現(xiàn)在普通使用的32位計(jì)算機(jī)中,int默認(rèn)就是4個(gè)字節(jié),所以long也是可以省略的。(較早幾年,也就是Windows3.1/DOS流行的時(shí)候,那時(shí)的機(jī)器及操作系統(tǒng)都是16位的,這種情況下,int默認(rèn)是16位的,此時(shí),如果想實(shí)現(xiàn)32位整數(shù),就必須定義為這樣的類型:longint)。在浮點(diǎn)數(shù)方面,我們最常用的將是double,它的精度適合于我們?nèi)粘V械母鞣N運(yùn)算。當(dāng)然,float的精度也在很多情況下也是符合要求的。2、布爾型(bool)和無類型(void):除字符型,整型,實(shí)型以外,布爾型和無類型也是較常用的兩種數(shù)據(jù)類型。布爾型(bool):布爾類型是C++的內(nèi)容,C語言沒有這一類型;布爾類型的數(shù)據(jù)只有兩種值:true(真)或false(假)。什么時(shí)候使用布爾型呢?履歷表中--般有“婚否”這一項(xiàng),婚否這種數(shù)據(jù)就適于用真或假來表示。性別“男”或“女”,有時(shí)也會(huì)用布爾值表示,(一般程序都不約而同地把男性設(shè)置“真”,女性設(shè)置為"假)無類型(void):這個(gè)類型比較怪,“無”類型,沒有類型的類型?;蛘呶覀冞@樣認(rèn)為比較好接受:在不需要明確指定類型的時(shí)候,我們可以使用void來表示。七、為數(shù)據(jù)類型起別名:typedef用法:typedef原類型名類型的別名;為什么要給現(xiàn)成的數(shù)據(jù)類型起別名?當(dāng)然這也是為了遷就我們?yōu)槿祟?,就像我們給人家起綽號一樣,形象好記,不易混淆。比如,我們在編程中需要使用一些年齡數(shù)據(jù),應(yīng)該使用整型(int)類型。另我們還使用到身高的數(shù)據(jù),由于單位采用“厘米”,所以也可能使用int類型。兩種數(shù)據(jù)屬于同一數(shù)據(jù)類型,但所代表的內(nèi)容卻不容混淆。我們可以使用typedef來臨時(shí)為int取兩個(gè)別名:typedefintAGE;typedefintSTATURE;通過以上兩行話(行末都需要以分號結(jié)束),我們獲得了兩種新的數(shù)據(jù)類型名稱。它們的一切屬性都和其原名int的數(shù)據(jù)類型完全一致,只是名字變得有意義了一點(diǎn)而已。這里,為了說明問題舉一個(gè)簡單的例子,(事實(shí)上例子的情況并不值得使用typedef來取別名)來說明typedef常用來為一些復(fù)雜的類型取一簡單且意義明了的別名;比如定義函數(shù)的指針,在C++Builder的捽件編寫中,更是有非常頻繁地用typedef來為那些定義復(fù)雜的事件函數(shù)(類成員函數(shù)的指針)取別名。sizeof的使用:用法:sizeof(數(shù)據(jù)類型)sizeof(變量)C和C++提供了關(guān)鍵字sizeof,用于在程序中測試某一數(shù)據(jù)類型的占用多少字節(jié)。sizeof有兩種用法,效果一樣。由于我們還沒有學(xué)變量,所以我們先講第一種。sizeof是一種計(jì)算,計(jì)算的對象是指定的一種數(shù)據(jù)類型,計(jì)算的結(jié)果是該數(shù)據(jù)類型占用的字節(jié)數(shù)目。如:sizeof(char)=1;也就是說char類型占用1個(gè)字節(jié)。sizeof(int)=4;也就是說int類型占用4個(gè)字節(jié)。使用sizeof的例子:下面我們來完成一個(gè)實(shí)例,這個(gè)例子使用sizeof將我們已學(xué)的所有數(shù)據(jù)類型的名稱所占用的字節(jié)數(shù)列出。首先,新建一個(gè)控制臺(tái)工程,其余操作步驟如下:1、選擇主菜單FileINew;2、NewItems對話框,選New頁中的ConsoleWizard,然后點(diǎn)OK;3、ConsoleWizard對話框,SourceType中選中C++,右邊的分組中只選中“ConsoleApplicationM后點(diǎn)擊OK按鈕。完成以上步驟后,代碼編輯窗口自動(dòng)新建并打開Unitl.cpp,其代碼如下:// #pragmahdrstop// #pragmaargsusedintmain(intargc,char*argv[])return0;// 保存工程文件為SizeOf.bpr,保存CPP文件為Unitl.cpp0按F9編譯并運(yùn)行這個(gè)空白工程,你會(huì)發(fā)現(xiàn)一個(gè)DOS窗口一閃而過,這我們在第二章就知道了。添加以下代碼中的粗體部分:// #include<iostream.h>#pragmahdrstop// #pragmaargsusedintmain(intargc,char*argv[])(getchar();return0;)// 在第二章中我們加過類似的代碼,目的都是:讓程序執(zhí)行以后不是自動(dòng)結(jié)束,而是在我們敲一個(gè)回車鍵才結(jié)束,因?yàn)槲覀冃枰榭闯绦虻膱?zhí)行結(jié)果。以后我們所有使用控制臺(tái)形式的程序,都將需要這兩行代碼,不過以后不會(huì)特別指出了,如果你對這兩話的作用還有些模糊,最好的辦法是現(xiàn)在再按一次F9鍵,運(yùn)行這個(gè)程序。下面開始我們的sizeof用法初試。我們這次的目標(biāo)是輸出所有我們已學(xué)的數(shù)據(jù)類型:整數(shù)(含unsigned,short的修飾等);實(shí)型(含各精度);字符型;布爾型等數(shù)據(jù)類型占用的字節(jié)數(shù),但我們事實(shí)上還沒有學(xué)過C和C++的任何語法,所以我想我們還是先來一個(gè)簡單的,確保成功以后,再完成所有的語句。添加以下代碼中的粗體部分:(為了節(jié)省版面,我只抄出需要變化的main那一部分,之前的代碼由于不再需要變化就不抄到這里了,省略號只用來示意前面還有代碼,你別把……也輸入代碼中??!)intmain(intargc,char*argv[])Icout?”Sizeofcharis:"<<sizeof(char)?endI;getchar();return0;)// 這次輸入的是這一行:cout?"Sizeofcharis:"?sizeof(char)?endl;這是一行標(biāo)準(zhǔn)的C++語句,cout在C++里表示"標(biāo)準(zhǔn)輸出設(shè)置”,這曾經(jīng)是每個(gè)學(xué)習(xí)C++的人必學(xué)的內(nèi)容。在Windows的編程里,它已是昨日黃花,我想諸位就不用再花什么時(shí)間去學(xué)習(xí)它了,只要簡單地弄明白它的基本用法就是。

cout和<<合用,后者是兩個(gè)小于號,你可別老眼昏眼看作是中文的書名號《;?在C++里屬于操作符重載,我們以后在學(xué)習(xí)時(shí),還會(huì)在不同的場合里遇見它的另一位老兄:>>。理解并且迅速記下<<的作用是看它的箭頭方向:<<指向左邊,它的意思是把它右邊的東西賦予或接到右邊?,F(xiàn)在,它的左邊是cout;cout這里就是屏幕,給屏幕東西,專業(yè)的說法就是:輸出到屏幕。圖示為:將"Sizeofcharis:"輸出到屏幕,當(dāng)然一對雙引號是不會(huì)被輸出的,因?yàn)樗鼈冇脕肀硎具@是一句話。cout不僅可以輸出一句話(字符串),而且可以用來輸出各種C和C++基本類型的數(shù)據(jù),并且通過<<可以一個(gè)接一個(gè)地輸出所需內(nèi)容。在上面的那行代碼中,它首先輸出:"Sizeofcharis:";然后是輸出sizeof(char)的計(jì)算結(jié)果;最后輸出endl;endl表示換一新行(回車換行)。理解了cout部分,那一行代碼中我們惟?不明白的就是行末的那個(gè)分號了。是啊你看到了沒有,所有C和C++語句行都在語句后有一個(gè)?,和其它C++語句的主要組成部分一樣,它必須是英文符號,如果你打入一個(gè)中文的符號現(xiàn)在改還來得及。并且從此刻起就記住了,所有C++語句中用到標(biāo)點(diǎn)符號,除非是指定就要用中文作為輸出等參數(shù),否則全都必須是英文的?,F(xiàn)在,你可以放心地把那句話原樣照敲入你的代碼中了。聰明的學(xué)員可能已經(jīng)完成“Ctrl+C"/"Ctrl+V"大法,直接粘貼了,不過如果你真的以前還沒寫過C和C++代碼,還是動(dòng)手輸入。按F9編譯,運(yùn)行結(jié)果如下圖:-inixiC'E:\編程插籃',程-inixiC'E:\編程插籃',程"Sizeofcharis:1"中,最后的那個(gè)1就是sizeof(char)的計(jì)算結(jié)果。至于那個(gè)endl呢?你看、光標(biāo)不是在下?行的行首閃爍嗎?如果你把代碼改成這樣:cout?Sizeofcharis:?sizeof(char);那么,輸出結(jié)果幾乎一模一樣,除了光標(biāo)改成在行末。我們之所以需要換行,是因?yàn)楹竺孢€要輸出。你可能喜歡用中文來輸出?好吧。cout?”char(字符)占用的子節(jié)■數(shù):"<<sizeof(char)?endl;三U退空叫空笆胤生史陽三U退空叫空笆胤生史陽\proje(char<2J我默認(rèn)不采用中文的原因只是因?yàn)閷W(xué)生容易在切換中英輸入法的關(guān)節(jié)出錯(cuò),結(jié)果在不該使用中文的時(shí)候輸入了一些中文字符,造成無謂的錯(cuò)誤,白白浪費(fèi)學(xué)習(xí)時(shí)間。再接再厲,我們輸出所有語句。

溫馨提示

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

最新文檔

評論

0/150

提交評論