版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
CBeta原作:JuanSouliéJingXu本教程根據(jù)JuanSoulie的英文版C++CBeta原作:JuanSouliéJingXu本教程根據(jù)JuanSoulie的英文版C++本教程對(duì)C++語(yǔ)言進(jìn)行了深入淺出的介紹,從基礎(chǔ)知識(shí)到ANSI-++BasicsofStructureofaVariablesandDataCommunicationthroughControlstructuresandControl函數(shù)FunctionsFunctionsCharacterControlstructuresandControl函數(shù)FunctionsFunctionsCharacterDynamicDataUserdefineddataClasses.ConstructorsandDestructors.PointerstoOverloadingOperators.this.StaticRelationshipsbetweenclasses:friend.VirtualMembers.Abstraction.OverloadingOperators.this.StaticRelationshipsbetweenclasses:friend.VirtualMembers.Abstraction.ExceptionAdvacnedClassType-PreprocessorCC++StandardInput/Outputwith對(duì)于C語(yǔ)言熟悉的讀者可將前三章(1.13.4)當(dāng)作復(fù)習(xí),因?yàn)檫@部分內(nèi)容主要介紹C++中的C部分。不過(guò)某些C++的語(yǔ)法與C對(duì)于C語(yǔ)言熟悉的讀者可將前三章(1.13.4)當(dāng)作復(fù)習(xí),因?yàn)檫@部分內(nèi)容主要介紹C++中的C部分。不過(guò)某些C++的語(yǔ)法與C還是有些差別,所以建議還是快速的讀一第五章主要介紹ANSI-C++ANSI-C++標(biāo)準(zhǔn)近幾年來(lái)被接受為國(guó)際標(biāo)準(zhǔn)。盡管C++80年代即存在,ANSI-C++在1997年才被發(fā)表,2003年又被修訂過(guò)。因此很多編譯器不支持ANSIC++同樣對(duì)于C和C++CC++本教程中所有例題程序均為console程序(控制臺(tái)程序)。此類(lèi)程序以文本形式與用戶(hù)交所有C++編譯器均支持console程序的編譯。要了解更多關(guān)于如何編譯的說(shuō)明,請(qǐng)查很多讀者詢(xún)問(wèn)編譯器和開(kāi)發(fā)環(huán)境的問(wèn)題。除了常用的商用收費(fèi)的MSVisualStudio,費(fèi)的C++開(kāi)發(fā)軟件:1、Eclipse的CDT開(kāi)發(fā)工具,官方網(wǎng)站在很多讀者詢(xún)問(wèn)編譯器和開(kāi)發(fā)環(huán)境的問(wèn)題。除了常用的商用收費(fèi)的MSVisualStudio,費(fèi)的C++開(kāi)發(fā)軟件:1、Eclipse的CDT開(kāi)發(fā)工具,官方網(wǎng)站在C+(BasicsofStructureofaVariablesandDataCommunicationthrough1.1C++(Structureofa//myfirstprograminC++#include<iostream.h>usingnamespaceintmain()cout<<“Helloreturn}Hello}HelloWorld!C++可寫(xiě)出的最簡(jiǎn)單的程序之一,但其中已經(jīng)包含了每一個(gè)C++程序的基本組成結(jié)構(gòu)。下面我們就逐個(gè)分析其組成結(jié)構(gòu)的每一部分://myfirstprogramin產(chǎn)生影響。在本例中,這行注釋對(duì)本程序是什么做了一個(gè)簡(jiǎn)要的描述。#include<iostream.h指示。在本例中這個(gè)句子#includeiostream.h告訴編譯器的預(yù)處理器將輸入輸出usingnamespaceC++標(biāo)準(zhǔn)函數(shù)庫(kù)的所有元素都被聲明在一個(gè)名空間中,這就是std名空間。因此為了int這一行為主函數(shù)(mainfunction)的起始聲明。mainfunction是所有C++程序的運(yùn)行的號(hào)(),括號(hào)中可以有一些輸入?yún)?shù)。如例題中顯示,主函數(shù)(mainfunction)的內(nèi)容緊跟在它的聲明之后,由花括號(hào)({})括起來(lái)。cout<<“Hellowcout是C++中的標(biāo)準(zhǔn)輸出流(通常為控制臺(tái),即屏幕)cout是C++中的標(biāo)準(zhǔn)輸出流(通常為控制臺(tái),即屏幕),這句話把一串字符串(本例中為”HelloWorld”)插入輸出流(控制臺(tái)輸出)中。cout在的聲明在頭文件iostream.h中,所以要想使用cout必須將該頭文件包括在程(C程序員最常犯的錯(cuò)誤之一就是忘記在語(yǔ)句末尾寫(xiě)上分號(hào)return返回語(yǔ)句(returnmain()執(zhí)行結(jié)束,并將該語(yǔ)句后面所跟代碼(在本例中為0返回。這是在程序執(zhí)行沒(méi)有出現(xiàn)任何錯(cuò)誤的情況下最常見(jiàn)的程序結(jié)束方式。在后面頭),有編譯器預(yù)處理器的指示行(以#開(kāi)頭),然后有函數(shù)的聲明(本例中main函數(shù)),最后是程序語(yǔ)句(例如調(diào)用cout<<),最后這些語(yǔ)句行全部被括在主函數(shù)的intmain{cout<<"HelloWorld";return0;}intmain(){cout<<"HelloWorld";return0;//mysecondprogramin#includeintmain{cout<<intmain{cout<<"HelloWorld!cout<<"I'maC++program";return0;}HelloWorld!I'maC++在這個(gè)例子中,我們?cè)趦蓚€(gè)不同的語(yǔ)句中調(diào)用了cout<<函數(shù)兩次。再一次說(shuō)明分行寫(xiě)程序代碼只是為了我們閱讀方便,因?yàn)檫@個(gè)main任何問(wèn)題intmain(){cout<<"HelloWorld!";cout<<"I'mtoC++program";return0;intmain{cout<<<<"I'maC++program";return0;}代碼。使用注釋的目的只是使程序員可以在源程序中插入一些說(shuō)明解釋性的內(nèi)容。C+支持兩中插入注釋的方法//line/*blockC+支持兩中插入注釋的方法//line/*blockcomment/*mysecondprograminwithmorecomments#includeintmain{cout<<"HelloWorld!";//saysHellocout<<"I'maC++program";//saysI'maC++programreturn0;}HelloWorld!I'maC++1.2(VariablesandDatatypes你可能覺(jué)得這個(gè)“HellowWorld”程序用處不大。我們寫(xiě)了好幾行代碼,編譯,然后讓我們?cè)O(shè)想這樣一個(gè)例子,我要求你在腦子里記住5這個(gè)數(shù)字,然后再記住2這個(gè)數(shù)16(5+1)2在你的記憶里。現(xiàn)在如果我們將兩數(shù)相減可以得到結(jié)果4。a=ba=b=a=a+1;result=a-b;碼中,變量標(biāo)識(shí)是a,b,和result。我們可以給變量起任何名字,只要它們是有效的標(biāo)標(biāo)識(shí)有效標(biāo)識(shí)由字母(letter),數(shù)字(digits)_組成。標(biāo)識(shí)的長(zhǎng)度沒(méi)有限制,但是有些編譯器只取前32個(gè)字符(剩下的字符會(huì)被忽略)。有字母(letters),數(shù)字(digits和下劃線(_)是合法的。并且變量標(biāo)識(shí)必須以字母開(kāi)頭。asm,auto,bool,break,case,catch,char,class,const,const_cast,continue,default,delete,do,double,dynamic_cast,else,enum,explicit,extern,false,float,for,friend,goto,if,inline,int,long,mutable,namespace,new,operator,private,protected,public,register,reinterpret_cast,return,short,signed,sizeof,static,static_cast,struct,switch,template,this,throw,true,try,typedef,typeid,typename,union,unsigned,using,virtual,void,volatile,wchar_t,whileand,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,and,and_eq,bitand,bitor,compl,not,not_eq,or,or_eq,xor,和非常重要:+(“sesniie”)RESLT,變量rslt和變量Rult.計(jì)算機(jī)的內(nèi)存是以字節(jié)(byte)為單位組織的。一個(gè)字節(jié)(byte)是我們?cè)贑++中能夠個(gè)小整數(shù)(0255之間的整數(shù))。但是計(jì)算機(jī)可以同時(shí)操作處理由多個(gè)數(shù)據(jù)類(lèi)型(DATA字節(jié)數(shù)范圍1(signed)128到無(wú)符號(hào)(unsigned)0到shortint-32768到2有符號(hào)無(wú)符號(hào)(unsigned)0到longint(long)有符號(hào)2147483648無(wú)符號(hào)(unsigned)0到整數(shù)有符號(hào)(signed21474836484無(wú)符號(hào)(unsigned0到4浮點(diǎn)數(shù)(floatingpoint3.4e38(7double308(154浮點(diǎn)數(shù)(floatingpoint3.4e38(7double308(15雙精度浮點(diǎn)數(shù)(doubleprecisionfloatingpoint1.7e+/long8長(zhǎng)雙精度浮點(diǎn)數(shù)(longdoubleprecisionfloating1.7e+/-308(151Boolean值。它只能是真(true)或假(false)兩值之一。true2寬字符(Widecharacter。這是為存儲(chǔ)兩字節(jié)(2bytes一個(gè)寬字符(1wide*字節(jié)數(shù)一列和范圍一列可能根據(jù)程序編譯和運(yùn)行的系統(tǒng)不同而有所不同。這里列出32位系統(tǒng)的常用數(shù)據(jù)。對(duì)于其他系統(tǒng),通常的說(shuō)法是整型(int)具有根據(jù)系統(tǒng)結(jié)構(gòu)建議的自然長(zhǎng)度(即一個(gè)字oneword的長(zhǎng)度),而4中整型數(shù)據(jù)char,shortintlong的長(zhǎng)度必須是遞增的,也就是說(shuō)按順序每一類(lèi)型必須大于等于其前面一個(gè)類(lèi)型的長(zhǎng)度。同樣的規(guī)則也適用于浮點(diǎn)數(shù)類(lèi)型float,double和longdouble,也是按變量的聲明(Declarationof在C++中要使用一個(gè)變量必須先聲明(declare)該變量的數(shù)據(jù)類(lèi)型。聲明一個(gè)新變量的語(yǔ)法是寫(xiě)出數(shù)據(jù)類(lèi)型標(biāo)識(shí)符(例如intshortfloat后面跟一個(gè)有效的變量標(biāo)識(shí)名intfloat以上兩個(gè)均為有效的變量聲明(variabledeclaration)。第一個(gè)聲明一個(gè)標(biāo)識(shí)為a的整型變量(intvariable),第二個(gè)聲明一個(gè)標(biāo)識(shí)為mynumber的浮點(diǎn)型變量(floatinta,b,以上語(yǔ)句同時(shí)定義了a、b、c3inta;intint(charshortinta;intint(charshortlongint可以是有符號(hào)的(signed)(unsigned),這取決于我們需要表示的數(shù)據(jù)范圍。有符號(hào)類(lèi)型(signed)可以表示正以在數(shù)據(jù)類(lèi)型前面加關(guān)鍵字signed或unsigned來(lái)聲明數(shù)據(jù)的符號(hào)類(lèi)型。例如:signedint如果我們沒(méi)有特別寫(xiě)出signed或unsigned,變量默認(rèn)為signedint唯一的例外是字符型(char)變量,這種變量獨(dú)立存在,與signedchar和unsignedchar型均不相同。shortlong可以被單獨(dú)用來(lái)表示整型基本數(shù)據(jù)類(lèi)型,shortshortintlongintshortyearshortintyear最后,signed和unsigned也可以被單獨(dú)用來(lái)表示簡(jiǎn)單類(lèi)型,意思分別同signedintunsignedunsignedint//operatingwith#includeusingnamespaceintmain{//declaringvariables:inta,b;int////declaringvariables:inta,b;int//process:a=5;b=a=a+1;result=a-b;//printoutthecout<<//terminatetheprogram:return0;4}變量的范圍(Scopeof(excutable)語(yǔ)句的中間聲明變量,而不象在C語(yǔ)言中變量聲明只能在程序的開(kāi)頭部然而,我們還是建議在一定程度上遵循C語(yǔ)言的習(xí)慣來(lái)聲明變量,因?yàn)閷⒆兞柯暶鞣旁谝惶帉?duì)debug程序有好處。因此,傳統(tǒng)的C語(yǔ)言方式的變量聲明就是把變量聲明放在每一個(gè)函數(shù)(function)的開(kāi)頭(對(duì)本地變量localvariable)或直接放在程序開(kāi)頭所有函數(shù)(function)的外面(對(duì)全局變量globalvariable)。全局變量Globalvariables可以在程序中任何地方任何函數(shù)(function全局變量Globalvariables可以在程序中任何地方任何函數(shù)(function)中被引用,只本地變量localvariables的作用范圍被局限在聲明它的程序范圍內(nèi)。如果它們是在一個(gè)函數(shù)的開(kāi)頭被聲明的(例如main函數(shù)),它們的作用范圍就是整個(gè)main函數(shù)。在左圖的例子中,這就意味著如果在main函數(shù)外還另有一個(gè)函數(shù),main函數(shù)中聲明的本地變量(Age,ANumber,AnotherOne)不能夠被另一個(gè)函數(shù)使用,反之亦然。在C++中,本地變量(localvariable)的作用范圍被定義在聲明它的程序塊內(nèi)(一個(gè)程變量初始化(Initializationof((typeidentifier=initial_value例如,如果我們想聲明一個(gè)叫做a的int0inta=()typeidentifier(initial_value)inta在C++.#includeusingnamespaceint在C++.#includeusingnamespaceintmain{int int intresulta=a+result=a-b;return6}C++提供一個(gè)string類(lèi)來(lái)支持字符串的操作,它不是一個(gè)基本的數(shù)據(jù)類(lèi)型,但是在一<string>,并且使用usingnamespace語(yǔ)句來(lái)使用標(biāo)準(zhǔn)名空間(std),如下面例子所#include#includeusingnamespaceint#includeusingnamespaceintmain{stringmystring="Thisisastring";cout<<mystring;return}Thisisastringmystring="Thisisastringmystring("ThisisaC++#include<string>usingnamespaceintmain{stringmystring;mystring="Thisistheinitialstringcontent";cout<<mystring<<endl;mystring="Thisisadifferentstringcout<<mystring<<endl;return0;Thisisthecout<<mystring<<endl;return0;Thisistheinitialstring}Thisisadifferentstring要了解更加詳細(xì)的C++字符串操作,建議參考Cplusplus上的string類(lèi)reference1.3常量(Constants字a=字常量(literalconstant)可以被分為整數(shù)(IntegerNumbers浮點(diǎn)數(shù)(Floating-Point整數(shù)(Integer-(")(hexadecimalnumbers)的字常量(literalconstants)。如果我們想要表示一個(gè)八進(jìn)制數(shù),我們必須在它前面加上一個(gè)0字符(zerocharacter),而表示十六進(jìn)制數(shù)我們需要在它前面加字符0x(zero,x)。例如以下字常量(literalconstants)互相等值: //01130x4b75seventy01130x4b75seventyfive,分別以十進(jìn)制數(shù),八進(jìn)制數(shù)和十六過(guò)在后面加字母u或l來(lái)迫使它為無(wú)符號(hào)(unsigned)的類(lèi)型或長(zhǎng)整型(long)。////unsigned////unsigned浮點(diǎn)數(shù)(FloatingPoint浮點(diǎn)數(shù)以小數(shù)(decimals)和/或指數(shù)冪(exponents)的形式表示。它們可以包括一個(gè)小數(shù)點(diǎn),一個(gè)e字符(表示"bytenattheXthheight"X是后面跟的整數(shù)3.14159//6.02e23//6.02x1.6e-19//1.6x10^-//之一,第三個(gè)是一個(gè)電子(electron)的電量(electriccharge)(一個(gè)極小的數(shù)值–所有這些都是近似值。最后一個(gè)是浮點(diǎn)數(shù)字常量表示數(shù)3。浮點(diǎn)數(shù)的默認(rèn)數(shù)據(jù)類(lèi)型為double。如果你想使用float或longdouble面加f或l //long //字符和字符串(Charactersand"Helloworld""Howdoyoudo?"(string字符和字符串(Charactersand"Helloworld""Howdoyoudo?"(string。注意在表示單獨(dú)字符的時(shí)候,我們用單引號(hào)(singlequotes),在表示字符串或多于一個(gè)字符的時(shí)候我們用雙引號(hào)(doublequotes("))。xxx而'x'指字符常量'x'字符常量和字符串常量各有特點(diǎn),例如escapecodes,這些是除此之外無(wú)法在源程序newlinen或跳躍符tabt)。所有這些符號(hào)前面要加一個(gè)反斜杠invertedslash(\)。這里列出了這些escapecodes:換行符回車(chē)carriage跳躍符vertical警告alert單引號(hào)singlequotes雙引號(hào)doublequotes問(wèn)號(hào)question反斜杠invertedslash"Left\tRight"另外你可以數(shù)字ASCII反斜杠invertedslash"Left\tRight"另外你可以數(shù)字ASCII碼表示一個(gè)字符,這種表示方式是在反斜杠(\)之后加以8進(jìn)制數(shù)或十六進(jìn)制數(shù)表示的ASCII碼。在第一種(八進(jìn)制octal)表示中,數(shù)字必需緊跟反斜杠(例如\23或\40),第二種(十六進(jìn)制hexacedimal),必須在數(shù)字之前寫(xiě)一個(gè)x字符(例如\x20或\x4A)。(\)"stringexpressedintwo你還可以將多個(gè)被空格blankspace、跳躍符tabulator、換行符newline"weform""asingle""string""of前面加前綴L:L"Thisisawidecharacter布爾型常量(Boolean布爾型只有兩個(gè)有效的值:true和false,其數(shù)據(jù)類(lèi)型為bool定義常量Definedconstants#defineidentifier#defineNEWLINE'\n'#defineWIDTH#defineNEWLINE'\n'#defineWIDTHcircle=2*PI*cout<<例子中為PI,NEWLINE或WIDTH)的地方替換成他們被定義為的代碼(分別為3.14159265,'\n'和100)。因此,由#define定義的常量被稱(chēng)為宏常量macro聲明常量declaredconstants通過(guò)使用const前綴,你可以定義指定類(lèi)型的常量,就像定義一個(gè)變量一樣constintwidth=constchartab='\t';constzip=12440;1.4操作符/運(yùn)算符前面已經(jīng)學(xué)習(xí)了變量和常量,我們可以開(kāi)始對(duì)它們進(jìn)行操作,這就要用到C++的操作符。有些語(yǔ)言,很多操作符都是一些關(guān)鍵字,比如add,equals等等。C++的操作符特點(diǎn)使得C++程序更簡(jiǎn)潔,也更國(guó)際化。運(yùn)算符是C++賦值A(chǔ)ssignationa=將整數(shù)5賦給變量a。=運(yùn)算符左邊的部分叫做a=將整數(shù)5賦給變量a。=運(yùn)算符左邊的部分叫做lvalue(leftvalue),右邊的部分叫做rvalue(rightvalue)。lvalue必須是一個(gè)變量,而右邊的部分可以是一個(gè)常量,一個(gè)變a=將變量b(rvalue)alvalue)a當(dāng)時(shí)存儲(chǔ)的是什么值。同時(shí)考慮到我們只是將b的數(shù)值賦給a,以后如果b的值改變了并不會(huì)影響到a的值.#includeusingnamespaceintmain{a=b=a=b;b=//a:?,//a:10,//a:10,//a:4,//a:4,cout<<"a:";cout<<a;cout<<"b:";cout<<returna:4}以上代碼結(jié)果是a的值為4,b的值為7。最后一行中b的值被改變并不會(huì)影響到a,雖然在此之前我們聲明了a=b;(從右到左規(guī)則right-to-leftrule)。以上代碼結(jié)果是a的值為4,b的值為7。最后一行中b的值被改變并不會(huì)影響到a,雖然在此之前我們聲明了a=b;(從右到左規(guī)則right-to-leftrule)。C++可以被用作另一個(gè)賦值符的(或rvalue的一部分a=2+(b=b=a=2+5賦給變量b,然后把前面對(duì)b的賦值運(yùn)算的結(jié)果(5)2再賦給變量a,這樣最后a中的值為7。因此,下面的表達(dá)式在C++中也是正確的:abc553個(gè)變量abc數(shù)學(xué)運(yùn)算符Arithmeticoperators*?加?減?*乘?除取模?個(gè)整數(shù)相除的余數(shù)。例如,如果我們寫(xiě)a113;a的值將會(huì)為結(jié)果2,因?yàn)榻M合運(yùn)算符Compoundassignationoperators*^=,C++以書(shū)寫(xiě)簡(jiǎn)練著稱(chēng)的一大特色就是這些組合運(yùn)算符compoundassignationoperators(+=,-=,*=和/=及其他),這些運(yùn)算符使得只用一個(gè)基本運(yùn)算符就可改寫(xiě)變量的valueC++以書(shū)寫(xiě)簡(jiǎn)練著稱(chēng)的一大特色就是這些組合運(yùn)算符compoundassignationoperators(+=,-=,*=和/=及其他),這些運(yùn)算符使得只用一個(gè)基本運(yùn)算符就可改寫(xiě)變量的valueincrease等同于valuevaluea5等同于aaabaaprice*units1等同于priceprice*(units#includeusingnamespaceintmain{inta,b=3;a=b;//return0;5}遞增和遞減Increaseand運(yùn)算符運(yùn)算符在功能上全部等同,即全部使得變量a1這個(gè)運(yùn)算符的一個(gè)特點(diǎn)是它既可以被用作prefix前綴,也可以被用作后綴suffix,也就在功能上全部等同,即全部使得變量a1這個(gè)運(yùn)算符的一個(gè)特點(diǎn)是它既可以被用作prefix前綴,也可以被用作后綴suffix,也就達(dá)式如a++或++a中,這兩種寫(xiě)法代表同樣的意思,但當(dāng)遞增increase或遞減decrease的運(yùn)算結(jié)果被直接用在其它的運(yùn)算式中時(shí),它們就代表非常不同的意思了:當(dāng)遞增運(yùn)算符被用作前綴prefix(++a)時(shí),變量a的值線增加,然后再計(jì)算整個(gè)表達(dá)變量a的值在表達(dá)式計(jì)算后才增加,因此a在增加前所存儲(chǔ)的值被用在了表達(dá)式的計(jì)例例A的值為4BA的值為3B在第一個(gè)例子中,B在它的值被賦給A之前增加1。而在第二個(gè)例子中B原來(lái)的值A(chǔ)然后B14關(guān)系運(yùn)算符Relationaloperators我們用關(guān)系運(yùn)算符來(lái)比較兩個(gè)表達(dá)式。如ANSI-C標(biāo)準(zhǔn)中指出的,關(guān)系預(yù)算的結(jié)果是一個(gè)bool值,根據(jù)運(yùn)算結(jié)果的不同,它的值只能是真true或false。下為C++的關(guān)系運(yùn)算符: 相等 不等大于Greater><小于Less大于等于Greaterorequal小于等于Lessorequal<小于Less大于等于Greaterorequal小于等于Lessorequal將返回(7==(54)將返回將返回(3!=(6>=將返回(5<5)將返回b=3和c=6,(a==將返回(a*b 將返回true因?yàn)樗鼘?shí)際是(2*3(b+4 將返回false因?yàn)樗鼘?shí)際是(3+4((b=2a)將返回注意:運(yùn)算符=(單個(gè)等號(hào))不同于運(yùn)算符==(雙等號(hào))。第一個(gè)是賦值運(yùn)算符(將等號(hào)右運(yùn)算符兩邊的表達(dá)式是否相等。因此在上面例子中最后一個(gè)表達(dá)式((b=2)==a),我們首先將數(shù)值2賦給變量b,然后把它和變量a進(jìn)行比較。因?yàn)樽兞縜中存儲(chǔ)的也是數(shù)值2,所以整個(gè)運(yùn)算的結(jié)果為true。在ANSI-C++標(biāo)準(zhǔn)出現(xiàn)之前的許多編譯器中,就像C真true或假false的bool0,代表"false"或一個(gè)非0數(shù)值(通常為1)來(lái)代表"true"。邏輯運(yùn)算符Logicoperators&&,||運(yùn)算符!等同于ooln運(yùn)算NO邏輯運(yùn)算符Logicoperators&&,||運(yùn)算符!等同于ooln運(yùn)算NOT(),(orn)ru,那么運(yùn)算后值變?yōu)榧賔ls,如果操作數(shù)值為假fs,則運(yùn)算結(jié)果為真ru。它!(5==返回false,因?yàn)樗疫叺谋磉_(dá)式(55)為真返回true因?yàn)?64)為假!(6<= 返回假!false返回真中的與運(yùn)算AND和或運(yùn)算OR。它們的運(yùn)算結(jié)果取決于兩個(gè)操作數(shù)(operand)的關(guān)aba&&ba||55&&36)返回falsetrue&&false55)||36返回truetrue||false條件運(yùn)算符Conditionaloperatortrue或假false而返回conditionresult1result2(1true或假false而返回conditionresult1result2(1如果條件condition為真true,整個(gè)表達(dá)式將返回esult1,否則將返回result27==54337477==5+2?4:5>3?a:返回a5a>b?a:返回較大值,a#includeusingnamespaceintmain{intc=(a>b)?a:cout<<return7}上面的例子中a2,b7,所以表達(dá)式(a>b)運(yùn)算值為假(false),所以整個(gè)表達(dá)式(a>b)?a:b要取分號(hào)后面的值,也就是b的值7。因此最后輸出c的值為7。a=(b=3,這行代碼首先將3賦值給變量b,然后將b+2賦值給變量a。所以最后變量a的值為5,而變量ba=(b=3,這行代碼首先將3賦值給變量b,然后將b+2賦值給變量a。所以最后變量a的值為5,而變量b的值為3。BitwiseOperators&,|^~&邏輯與Logic|邏輯或Logic邏輯異或Logicalexclusive^~1取補(bǔ)(位反轉(zhuǎn))Complementtoone(bit左移Shift右移Shift變量類(lèi)型轉(zhuǎn)換運(yùn)算符ExplicittypecastingC兼容的一種,是在原轉(zhuǎn)換的表intfloatf=3.14;i=(int)f;以上代碼將浮點(diǎn)型數(shù)字3.14轉(zhuǎn)換成一個(gè)整數(shù)值(3)。這里類(lèi)型轉(zhuǎn)換操作符為(int)。在C++中實(shí)現(xiàn)這一操作的另一種方法是使用構(gòu)造函數(shù)constructor的形式:在要轉(zhuǎn)換的表以上代碼將浮點(diǎn)型數(shù)字3.14轉(zhuǎn)換成一個(gè)整數(shù)值(3)。這里類(lèi)型轉(zhuǎn)換操作符為(int)。在C++中實(shí)現(xiàn)這一操作的另一種方法是使用構(gòu)造函數(shù)constructor的形式:在要轉(zhuǎn)換的表i=int(f以上兩種類(lèi)型轉(zhuǎn)換的方法在C++中都是合法的。另外ANSI-C++(objectorientedprogramming)(參考Section5.4,Advancedclasstype-casting).)a=sizeof1給a,因?yàn)閏har1Precedenceofa=5+7%a5726,還是a572正確答案為第一個(gè),結(jié)果為6。每一個(gè)運(yùn)算符有一個(gè)固定的優(yōu)先級(jí),不僅對(duì)數(shù)學(xué)運(yùn)算 12()[].->++--dynamic_caststatic_castreinterpret_castconst_cast3~sizeofnew *+45.*-*6 12()[].->++--dynamic_caststatic_castreinterpret_castconst_cast3~sizeofnew *+45.*-*67 89<><===!=&^|=*=/=%=+=-=>>=<<=&=^=,(a(a=5+7%a572a=(5+7)%1.5控制臺(tái)交互(Communicationthrough鍵盤(pán)通常為標(biāo)準(zhǔn)輸入設(shè)備,而屏幕為標(biāo)準(zhǔn)輸出設(shè)備。在C++的iostream函數(shù)庫(kù)中,一個(gè)程序的標(biāo)準(zhǔn)輸入輸出操作依靠?jī)煞N數(shù)據(jù)流:cin給輸入使用和cout給輸出使用。另外,cerr和clog也已經(jīng)被實(shí)現(xiàn)――它們是兩種特殊設(shè)計(jì)文件(logfile)。因此cout標(biāo)準(zhǔn)輸出流)通常被定向到屏幕,而cin標(biāo)準(zhǔn)輸入流)輸出Output輸出流cout與重載(overloaded)運(yùn)算符<<coutOutputsentence打印Outputsentencecout120120coutxx運(yùn)算符<<又叫插入運(yùn)算符(insertionoperator因?yàn)樗鼘⒑竺嫠臄?shù)據(jù)插入到它前面的數(shù)據(jù)流中。在以上的例子中,字符串常量Outputsentence運(yùn)算符<<又叫插入運(yùn)算符(insertionoperator因?yàn)樗鼘⒑竺嫠臄?shù)據(jù)插入到它前面的數(shù)據(jù)流中。在以上的例子中,字符串常量Outputsentence,數(shù)字常量120和變量x先后被插入輸出流cout中。注意第一句中字符串常量是被雙引號(hào)引起來(lái)的。每當(dāng)我們coutHelloHellocoutHello;Hello插入運(yùn)算符insertionoperatorcout<<"Hello,"<<"Iam"<<"aC++Hello,IamaC+sentence到屏幕上。插入運(yùn)算符cout<<"Hello,Iam"<<age<<"yearsoldandmyzipcodeis"<<如果我們假設(shè)變量age24zipcode90064,以上句子的輸出將為:Hello,Iam24yearsoldandmyzipcodeis90064cout<<"Thisisacout<<"ThisisanotherThisisasentence.Thisisanother換行,我們必須插入一個(gè)換行符來(lái)明確表達(dá)這一要求。在C++中換行符可以寫(xiě)作\n:cout<<"Firstsentence.\ncout<<"Secondsentence.\nThirdFirstsentence.Third另外,你也可以用操作符endlcout<<"Firstsentence."<<cout<<"Firstsentence."<<cout<<"Secondsentence."<<FirstSecond當(dāng)操作符endl被用在bufferedstreams中時(shí)有一點(diǎn)特殊:它們被flushed。不過(guò)cout默認(rèn)為unbuffered,所以不會(huì)被影響。你可以暫時(shí)不管這一點(diǎn)。你可以使用\n或endl來(lái)指定cout輸入InputC++中的標(biāo)準(zhǔn)輸入是通過(guò)在cin數(shù)據(jù)流上重載運(yùn)算符extraction(>>)來(lái)實(shí)現(xiàn)的。它后intcin>>聲明一個(gè)整型變量age然后等待用戶(hù)從鍵盤(pán)輸入到cin并將輸入值存儲(chǔ)在這個(gè)變量輸入一個(gè)單獨(dú)的字符,在用戶(hù)按下回車(chē)鍵(RETURN)之前cin將不會(huì)處理用戶(hù)的輸入的在使用cin輸入的時(shí)候必須考慮后面的變量類(lèi)型。如果你要求輸入一個(gè)整數(shù),//i/oexampleintmain(){intcout<<"Pleaseenteranintegervalue:";cin>>i;cout<<"Thevalueyouenteredis"<<i;cout<<"anditsdoubleiscout<<"Thevalueyouenteredis"<<i;cout<<"anditsdoubleis"<<i*2<<".\n";return}Pleaseenteranintegervalue:Thevalueyouenteredis702anditsdoubleisin(),們期望從用戶(hù)處獲得的數(shù)據(jù)。當(dāng)你使用由in你也可以利用cincin>>a>>cin>>cin>>a,一個(gè)給變量b。輸入時(shí)兩個(gè)變量之間可以以任何有效的空白符號(hào)間隔,包括空格,跳躍符tab或換行。cin>>要一次讀取一整行輸入,需要使用C++的函數(shù)getline,相對(duì)于是用cin,我們更建議使用getline來(lái)讀取用戶(hù)輸入。#include<string>usingnamespace#include<string>usingnamespaceintmain{stringcout<<"What'syourname?";getline(cin,mystr);cout<<"Hello"<<mystr<<".\n";cout<<"Whatisyourfavoritecolor?";getline(cin,mystr);cout<<"Ilike"<<mystr<<"return}What'syourname?HelloWhatisyourfavoritecolor?blueIlikebluetoo!字符串 標(biāo)準(zhǔn)頭文件<sstream>定義了一個(gè)叫做 stringmystr("1204");intmyint;數(shù)變量數(shù)變量myint。然后我們使用stringstream類(lèi)的構(gòu)造函數(shù)定義了這個(gè)類(lèi)的對(duì)象,并以字符串變量mystr為參數(shù)。因?yàn)槲覀兛梢韵袷褂昧饕粯邮褂胹tringstream的對(duì)象,所以我們可以像使用cin那樣使用操作符>>后面跟一個(gè)整數(shù)變量來(lái)進(jìn)行提取整數(shù)數(shù)myint1204#include<string>#include<sstream>usingnamespaceintmain{stringfloatprice=0;intcout<<"Enterprice:";getline(cin,mystr);cout<<"Enterquantity:";getline(cin,mystr);stringstream(mystr)>>cout<<"Totalprice:"<<price*quantity<<endl;return0;Enterprice:}Enterquantity:Totalprice:使用函數(shù)getline從標(biāo)注輸入流cin中讀取字符串對(duì)象(mystr),然后再?gòu)倪@個(gè)字符串對(duì)象中提取數(shù)值price和quantity。使用函數(shù)getline從標(biāo)注輸入流cin中讀取字符串對(duì)象(mystr),然后再?gòu)倪@個(gè)字符串對(duì)象中提取數(shù)值price和quantity。(ControlstructuresandFunctionsControl函數(shù)FunctionsFunctions2.1控制結(jié)構(gòu)(Control為了介紹程序的執(zhí)行順序,我們需要先介紹一個(gè)新概念:語(yǔ)句塊(blockofinstructions)。一個(gè)語(yǔ)句塊(Ablockofinstructions是一組互相之間由分號(hào)semicolons(;)分隔開(kāi)但整體被花括號(hào)curlybracketsigns:{and}括起來(lái)的語(yǔ)句。本節(jié)中我們將看到的大多數(shù)控制結(jié)構(gòu)允許一個(gè)通用的statement做參數(shù),這個(gè)要一條語(yǔ)句做statement,它可以不被括在花括號(hào)({})內(nèi)。但如果我們需要多條語(yǔ)句共同做statement,則必須把它們括在花括號(hào)內(nèi)({})以組成一個(gè)語(yǔ)句塊。條件結(jié)構(gòu)Conditionalstructure:ifandif(condition)if(condition)(condition)為true,statement將被執(zhí)行。否則,statement將被忽略(不被執(zhí)行),例如,以下程序段實(shí)現(xiàn)只有當(dāng)變量x100的時(shí)候才輸出"xisif(x==cout<<"xis如果我們需要在條件condition為真trueif(x=={cout<<"xis";cout<<x;}我們可以用關(guān)鍵字elseifif(condition)statement1elseif(x==cout<<"xis100";cout<<"xisnot以上程序如果x100xis100x100,而且也只有在x不是100的時(shí)候,屏幕上將打出xisnot100。多個(gè)ifelseif(x>cout<<"xispositive";elseif(x<0)cout<<"xisnegative";coutcout<<"xisnegative";cout<<"xisblockofinstructionsIterationstructures或循環(huán)whilewhile表達(dá)式expression語(yǔ)句它的功能是當(dāng)expression的值為真true時(shí)重復(fù)執(zhí)行statement例如,下面我們將用while//customcountdownusingwhile#include<iostream.h>intmain{intcout<<"Enterthestartingnumber>";cin>>n;while(n>0)cout<<n<<",--}cout<<return}Enterthestartingnumber>8,7,6,5,4,3,2,1,程序開(kāi)始時(shí)提示用戶(hù)輸入一個(gè)倒計(jì)數(shù)的初始值。然后while循環(huán)開(kāi)始,如果用戶(hù)輸入的數(shù)值滿足條件n>0n0大),后面跟的語(yǔ)句塊將會(huì)被執(zhí)行一定的次數(shù),直到條件(n>0)不再滿足(變?yōu)閒alse)。從main程序開(kāi)始時(shí)提示用戶(hù)輸入一個(gè)倒計(jì)數(shù)的初始值。然后while循環(huán)開(kāi)始,如果用戶(hù)輸入的數(shù)值滿足條件n>0n0大),后面跟的語(yǔ)句塊將會(huì)被執(zhí)行一定的次數(shù),直到條件(n>0)不再滿足(變?yōu)閒alse)。從main用戶(hù)輸入一個(gè)數(shù)值賦給otrue執(zhí)行statement3步ofalse跳過(guò)statement5步執(zhí)行cout<<n<<",--(將n的值打印在屏幕上,然后將n的值減我們必須考慮到循環(huán)必須在某個(gè)點(diǎn)結(jié)束,因此在語(yǔ)句塊之內(nèi)(loop的statement之內(nèi))我們必須提供一些方法使得條件condition可以在某個(gè)時(shí)刻變?yōu)榧賔alse,否則循環(huán)將false:當(dāng)n變?yōu)?,倒計(jì)數(shù)結(jié)束。do語(yǔ)句statementwhile條件它的功能與while循環(huán)一抹一樣,除了在do-while循環(huán)中是先執(zhí)行statement然后才檢查條件condition,而不想while循環(huán)中先檢查條件然后才執(zhí)行statement。這樣,即使條件condition從來(lái)沒(méi)有被滿足過(guò),statement仍至少被執(zhí)行一次。例如,下面的程序重復(fù)輸出(echoes)用戶(hù)輸入的任何數(shù)值,直到用戶(hù)輸入0為止。//numberechoerintmain{unsignedlongn;do{cout<<"Enterintmain{unsignedlongn;do{cout<<"Enternumber(0toend):";cin>>n;cout<<"Youentered:"<<n<<}while(n!=0);return0;}Enternumber(0toend):Youentered:Enternumber(0toend):Youentered:Enternumber(0toend):Youentered:輸入0,則循環(huán)永遠(yuǎn)不會(huì)結(jié)束。forfor(initialization;condition;increase)它的主要功能是當(dāng)條件condition為真true時(shí)重復(fù)執(zhí)行語(yǔ)句statement,類(lèi)似while循環(huán)。但除此之外,for還提供了寫(xiě)初始化語(yǔ)句initialization和增值語(yǔ)句increase的地執(zhí)行初始化initialization。通常它是設(shè)置一個(gè)計(jì)數(shù)器變量(counter檢查條件condition,如果條件為真true句statement際為減1,而不是加1。下面是用for//countdownusingaforloop#include<iostream.h>intmain{for(intn=10;n>0;n--{cout<<n<<",}cout<<return}10,9,8,7,6,5,4,3,2,1,初始化initialization和增值increase域是可選的(即可以為空)沒(méi)有初始化和增值語(yǔ)句;或for(;n<10;n++)來(lái)表示有增值語(yǔ)句但沒(méi)有初始化語(yǔ)句。另外我們也可以在forfor(n=0,i=100;n!=i;n++,i--{//whatever}50次,如果n和in0,i100,條件是(n!=i)(n不能等于i)。因?yàn)槊看窝h(huán)n1,而且i減1,循環(huán)的條件將會(huì)在第50次循環(huán)之后變?yōu)榧賔alse(n和i都等于50)。分支控制和跳轉(zhuǎn)(Bifurcationofcontrol分支控制和跳轉(zhuǎn)(Bifurcationofcontrolandbreak障//breakloopexampleintmain(){intfor(n=10;n>0;n--{cout<<n<<",";if(n==3){cout<<"countdownaborted!";}return}10,9,8,7,6,5,4,3,countdowncontinue們將跳過(guò)數(shù)字5的輸出://continueloopexample#include<iostream.h>intmain(){for(intn=10;n>0;n--{if(n==5)cout<<n<<",}cout<<n<<",}cout<<return}10,9,8,7,6,4,3,2,1,goto跳轉(zhuǎn)的目標(biāo)點(diǎn)可以由一個(gè)標(biāo)示符(label)來(lái)標(biāo)明,該標(biāo)示符作為goto語(yǔ)句的參數(shù)。一個(gè)標(biāo)示符(label)由一個(gè)標(biāo)識(shí)名稱(chēng)后面跟一個(gè)冒號(hào)colon(:)組成。下面的例子中我們用goto//gotoloopexampleintmain(){intn=10;cout<<n<<",n--if(n>0)gotoloop;cout<<"FIRE!";return}10,9,8,7,6,5,4,3,2,1,exitexit是一個(gè)在cstdlibstdlib.h)voidexit(intexitexitcode是由操作系統(tǒng)使用或被調(diào)用程序使用。通常exitcodeexitcode是由操作系統(tǒng)使用或被調(diào)用程序使用。通常exitcode0表示程序正常結(jié)選擇結(jié)構(gòu)TheselectiveStructure:我們?cè)诒竟?jié)開(kāi)頭學(xué)習(xí)的把幾個(gè)if和elseif{caseconstant1:blockofinstructions1caseblockofinstructions2...defaultblockof}switch計(jì)算表達(dá)式expression的值,并檢查它是否與第一個(gè)常量constant1相等,如果相等,程序執(zhí)行常量1后面的語(yǔ)句塊blockofinstructions1直到碰到關(guān)鍵字break,程序跳轉(zhuǎn)到switch選擇結(jié)構(gòu)的結(jié)尾處。如果expression不等于constant1,程序檢查表達(dá)式expression的值是否等于第二個(gè)常量constant22后面的語(yǔ)句塊blockofinstructions2直到碰到關(guān)鍵字break句,如果它存在的話。default:選項(xiàng)是可以省略的。switch(x){caseswitch(x){casecout<<"xis1";casecout<<"xis2";if-elsecout<<"valueofx}if(x==1)cout<<"xis}elseif(x=={cout<<"xis}elsecout<<"valueofx}前面已經(jīng)提到switch的語(yǔ)法有點(diǎn)特殊。注意每個(gè)語(yǔ)句塊結(jié)尾包含的break語(yǔ)句。這是必須的,因?yàn)槿绻贿@樣做,例如在語(yǔ)句塊blockofinstructions1的結(jié)尾沒(méi)有break,程序執(zhí)行將不會(huì)跳轉(zhuǎn)到switch選擇的結(jié)尾處(}),而是繼續(xù)執(zhí)行下面的語(yǔ)句塊,直到第一次遇到break語(yǔ)句或到switch選擇結(jié)構(gòu)的結(jié)尾。因此,不需要在每一個(gè)case域內(nèi)加花括號(hào){}。這個(gè)特點(diǎn)同時(shí)可以幫助實(shí)現(xiàn)對(duì)不同的可能值執(zhí)行相同的語(yǔ)句{casecasecasecout<<"xis1,2or3";cout<<"xisnot1,2nor}注意cout<<"xisnot1,2nor}注意switch只能被用來(lái)比較表達(dá)式和不同常量的值constants。因此我們不能夠把變量或范圍放在case之后,例如(case(n*2):)或(case(1..3):)都不可以,因?yàn)樗鼈儾皇怯行У某A?。如果你需要檢查范圍或非常量數(shù)值,使用連續(xù)的if和elseif語(yǔ)句。2.2函數(shù)I(Functions用C++所能提供的所有結(jié)構(gòu)化編程的潛力。typename(argument1,argument2,...)????//functionexample#include<iostream.h>intaddition(inta,int{intr;return}intmain{intintr;return}intmain{intz=additioncout<<"Theresultis"<<z;return0;}Theresultis記得在我們教程開(kāi)始時(shí)說(shuō)過(guò):一個(gè)C++程序總是從main我們可以看到main函數(shù)以定義一個(gè)整型變量z開(kāi)始。緊跟著我們看到調(diào)用addition參數(shù)有明顯的對(duì)應(yīng)關(guān)系。在main函數(shù)中我們調(diào)用addition函數(shù),并傳入兩個(gè)數(shù)值:和3 它們對(duì)應(yīng)函數(shù)addition中定義的參數(shù)inta和intb當(dāng)函數(shù)在main中被調(diào)用時(shí),程序執(zhí)行的控制權(quán)從main轉(zhuǎn)移到函數(shù)addition(53被復(fù)制到函數(shù)的本地變量(localvariables)inta和intb中。函數(shù)addition中定義了新的變量(intr;),通過(guò)表達(dá)式r=a+b;,它把a(bǔ)加br。因?yàn)閭鬟^(guò)來(lái)的參數(shù)a和b538return結(jié)束函數(shù)addition,并把控制權(quán)交還給調(diào)用它的函數(shù)(main,從調(diào)用addition開(kāi)始繼續(xù)向下執(zhí)行。另外,return在調(diào)用的時(shí)候后面跟著變量rreturn(r它當(dāng)時(shí)的值為8,這個(gè)值被稱(chēng)為函數(shù)的返回值。函數(shù)返回的數(shù)值就是函數(shù)的計(jì)算結(jié)果,因此,z將存儲(chǔ)函數(shù)addition(5,3)返回的數(shù)值8函數(shù)返回的數(shù)值就是函數(shù)的計(jì)算結(jié)果,因此,z將存儲(chǔ)函數(shù)addition(5,3)返回的數(shù)值8。用另一種方式解釋?zhuān)阋部梢韵胂蟪烧{(diào)用函數(shù)(addition5,3被替換成了它的返回值(8)。接下來(lái)maincout<<"Theresultis"<<變量的范圍(Scopeof數(shù)或指令塊之外使用。例如,在上面的例子里就不可能在main中直接使用變量a,br,因?yàn)樗鼈兪呛瘮?shù)addition的本地變量(localvariable)addition中也不可能直接使用變量z,因?yàn)樗莔ain的本地變量。//functionexampleintsubtraction(inta,int{intr;return}intmain{intx=5,y=3,z=subtractioncout<<"Thefirstresultis"<<z<<cout<<"Thesecondresultiscout<<"Thesecondresultis"<<subtraction(7,2)<<'\n';cout<<"Thethirdresultis"<<subtraction(x,y)<<'\n';z=4+subtraction(x,y);cout<<"Thefourthresultis"<<z<<'\n';return0;Thefirstresultis}ThesecondresultisThethirdresultis2Thefourthresultismain函數(shù)中,函數(shù)subtraction被調(diào)用了多次。我們用了幾種不同的調(diào)用方法,因z=subtractioncout<<"Thefirstresultis"<<也就是z=cout<<"Thefirstresultis"<<cout<<"Thesecondresultis"<<subtractionsubtraction的調(diào)用直接用作coutcout<<"Thesecondresultis"<<5是subtraction7,2)在cout<<"Thethirdresultis"<<subtraction中,與前面的調(diào)用唯一的不同之處是這里調(diào)用subtraction時(shí)的參數(shù)使用的是變量而不x和y中,與前面的調(diào)用唯一的不同之處是這里調(diào)用subtraction時(shí)的參數(shù)使用的是變量而不x和y中存儲(chǔ)的數(shù)值,即分別為5和3,結(jié)果為2。z=4+subtractionz=subtraction(x,y)+z=4+z=2+typename(argument1,argument2...)void#include<iostream>usingnamespacevoidprintmessage{cout<<"I'ma}intmain{printmessage();return0;}I'maintmain{printmessage();return0;}I'mavoidprintmessage{cout<<"I'ma}雖然在Cvoidvoid,以便明確指出函數(shù)不需要2.3II(Functions參數(shù)按數(shù)值傳遞和按地址傳遞(Argumentspassedbyvalueandby數(shù)值而不是變量本身。例如,假設(shè)我們用下面的代碼調(diào)用我們的第一個(gè)函數(shù)additionintx=5,y=3,z=addition(x,y在這個(gè)例子里我們調(diào)用函數(shù)addition同時(shí)將x和y53,而這樣,當(dāng)函數(shù)addition被調(diào)用時(shí),它的變量a和b的值分別變?yōu)?這樣,當(dāng)函數(shù)addition被調(diào)用時(shí),它的變量a和b的值分別變?yōu)?和3,但在函數(shù)addition內(nèi)對(duì)變量a或b所做的任何修改不會(huì)影響變量他外面的變量x和y的值,因?yàn)樽兞縳和y并沒(méi)有把它們自己傳遞給函數(shù),而只是傳遞了他們的數(shù)值。作,我們必須使用按地址傳遞的參數(shù)(argumentspassedbyreference),就象下面//passingparametersbyreference#include<iostream.h>voidduplicate(int&a,int&b,int&{}intmain{intx=1,y=3,z=7;duplicate(x,y,cout<<"x="<<x<<",y="<<y<<",z="<<return}x=2,y=6,后面跟了一個(gè)地址符ampersandsign&),它的作用是指明變量是按地址傳遞的(byreference),而不是像通常一樣按數(shù)值傳遞的(byvalue)。用另一種方式來(lái)說(shuō),我們已經(jīng)把變量a,b,c和調(diào)用函數(shù)時(shí)使用的參數(shù)(x,y用另一種方式來(lái)說(shuō),我們已經(jīng)把變量a,b,c和調(diào)用函數(shù)時(shí)使用的參數(shù)(x,y和z)聯(lián)系起來(lái)了,因此如果我們?cè)诤瘮?shù)內(nèi)對(duì)a進(jìn)行操作,函數(shù)外面的x值也會(huì)改變。同樣,任何對(duì)b的改變也會(huì)影響y,對(duì)c的改變也會(huì)影響z>。這就是為什么上面的程序中,主程序main中的三個(gè)變量xy和zvoidduplicate(int&a,int&b,int&voidduplicate(inta,intb,intampersand&),我們也就沒(méi)有將參數(shù)的地址傳遞給函數(shù),而是傳遞了它們的值,因此,屏幕上顯示的輸出結(jié)果xy,z1,3,ampersand&)來(lái)聲明按地址"byreference"傳遞參數(shù)的方式只是在中適用。在C語(yǔ)言中,我們必須用指針(pointers)//morethanonereturningvalue#include<iostream.h>voidprevnext(intx,int&prev,int&{prev=x-1;next=x+1;}intmain{intx=100,y,z;prevnext(x,y,z);cout<<"Previous="<<y<<",Next="<<return}參數(shù)的默認(rèn)值(Defaultvaluesin}參數(shù)的默認(rèn)值(Defaultvaluesin//defaultvaluesinfunctions#include<iostream.h>intdivide(inta,int{intr;}intmain()cout<<divide(12);cout<<endl;cout<<dividereturn}56divide只有一個(gè)參數(shù)被指明,但函數(shù)divide允許有兩個(gè)參數(shù)。因此函數(shù)divide2,因?yàn)槲覀円呀?jīng)定義了它為該參數(shù)缺省的默認(rèn)值(注意函數(shù)聲明中的intb=2)。因此這次函數(shù)調(diào)用的結(jié)果是6(12/2)。divide(intb=2)4(intb=2)45//overloadedintdivide(inta,int{return}floatdivide(floata,float{return}intmain{intx=5,y=2;floatn=5.0,m=2.0;cout<<divide(x,y);cout<<"\n";cout<<divide(n,m);cout<<"\n";return}2InlineInline函數(shù)(inlineinlinetypename(arguments...){instructions...遞歸n!=n*(n-1)*(n-2)*(n-3)...*更具體一些,5factorialof55!=5*4*3*2*1=//factoriallongfactorial(longif(a>1)return(a*factorial(a-1));elsereturn(1);}intmain{longcout<<}intmain{longcout<<"Typeanumber:";cin>>l;cout<<"!"<<l<<"="<<factorialreturn}Typeanumber:!9=注意我們?cè)诤瘮?shù)factorial中是怎樣調(diào)用它自己的,但只是在參數(shù)值大于1的時(shí)候才做調(diào)用,因?yàn)榉駝t函數(shù)會(huì)進(jìn)入死循環(huán)(aninfiniterecursiveloop)0的時(shí)候,函數(shù)不繼續(xù)用負(fù)數(shù)乘下去(最終可能導(dǎo)致運(yùn)行時(shí)的堆棧溢出錯(cuò)誤(stackoverflowerror)在實(shí)際的標(biāo)準(zhǔn)系統(tǒng)中,長(zhǎng)整型long無(wú)法存儲(chǔ)12!以上的階乘值。到目前為止,我們定義的所有函數(shù)都是在它們第一次被調(diào)用(通常是在main中)之前,而把main函數(shù)放在最后。如果重復(fù)以上幾個(gè)例子,但把main函數(shù)放在其它被它typename(argument_type1,argument_type2,??它以一個(gè)分號(hào)semicolonsign(;)??它以一個(gè)分號(hào)semicolonsign(;)?#includevoidodd(intvoideven(intintmain{inti;do{cout<<"Typeanumber:(0toexit)";cin>>i;odd}while(i!=0);return0;}voidodd(inta)if((a%2)!=0)cout<<"Numberisodd.\n";elseeven(a);}voideven(inta)if((a%2)==0)cout<<"Numberiseven.\n";elseodd(a);}Typeanumber(0toexit):NumberisTypeanumber(0toNumberisTypeanumber(0toexit):6Numberiseven.Typeanumber(0toexit):1030Numberiseven.Typeanumber(0toexit):Numberis的功能。但這個(gè)例子顯示了函數(shù)原型(prototypingfunctions)是怎樣工作的。并且在這里我們首先看到的是函數(shù)odd和evenvoidodd(inta);voideven(inta);樣main就可以被放在邏輯上更合理的位置:即程序代碼的開(kāi)頭部分。odd函數(shù)里需要調(diào)用even函數(shù),而在even函數(shù)里也同樣需要調(diào)用odd函數(shù)。如果兩個(gè)函數(shù)任何一個(gè)都沒(méi)被提前定義原型的話,就會(huì)出現(xiàn)編譯錯(cuò)誤,因?yàn)榛蛘遫dd在even函數(shù)中是不可見(jiàn)的(因?yàn)樗€沒(méi)有被定義),或者even函數(shù)在odd函數(shù)中是不可見(jiàn)的。(AdvancedDataCharactersDynamicDataUserdefineddataDynamicDataUserdefineddata3.15個(gè)整數(shù)叫做billytypename這里type是可以使任何一種有效的對(duì)象數(shù)據(jù)類(lèi)型(objecttype),如int,float...等,name是一個(gè)有效地變量標(biāo)識(shí)(identifier),而由中括號(hào)[]引起來(lái)的elements域指明數(shù)組intbillyintintbilly那么billyintbilly[5]={16,2,77,40,12071[]相符。例如,在上面例子中數(shù)組billy5,因此在后面花括號(hào)中的初始值也有5個(gè),每個(gè)元素一個(gè)數(shù)值。[]intbilly[]={16,2,77,40,12071存取數(shù)組中數(shù)值(Accesstothevaluesofan繼續(xù)上面的例子,數(shù)組billy5個(gè)元素,其中每一元素都是整型int,我們引用其中每75存入數(shù)組billy3billy[2]=又例如,要把數(shù)組billy中第3個(gè)元素的值賦給變量aa=又例如,要把數(shù)組billy中第3個(gè)元素的值賦給變量aa=注意數(shù)組billy的第3個(gè)元素為billy[2],因?yàn)樗饕?index)從0開(kāi)始,第1個(gè)元素是billy[0]2個(gè)元素是billy[1]3billy[2]。同樣的原因,最后一個(gè)元素是billy[4]。如果我們寫(xiě)billy[5],那么是在使用billy的第6個(gè)元素,因此會(huì)超出數(shù)組的長(zhǎng)在C+中對(duì)數(shù)組使用超出范圍的index是合法的,這就會(huì)產(chǎn)生問(wèn)題,因?yàn)樗粫?huì)產(chǎn)生誤。超出范圍的index之所以合法的原因我們?cè)诤竺鎸W(xué)習(xí)指針(pointer)的時(shí)候會(huì)了[]intbilly[5聲明新數(shù)組(以數(shù)據(jù)類(lèi)型名稱(chēng)開(kāi)頭billy[2]75billy[0]aabilly[a]=b=billy[a+2];billy[billy[a]]=billy[2]+5;//arrays#includeintbilly[]={16,2,77,40,intn,intmain()for(n=0;n<5;n++for(n=0;n<5;n++{result+=}cout<<return}intjimmy3維以上的時(shí)候并不多。但是考慮一下一個(gè)有很多維的數(shù)組所需要的內(nèi)存空charcentury這樣一個(gè)數(shù)組,需要消耗3000M的內(nèi)存。intjimmy3][5intjimmy[15];(3*5=的空間,這個(gè)空間有//multidimensionalarray#include<iostream.h>#defineWIDTH5#define的空間,這個(gè)空間有//multidimensionalarray#include<iostream.h>#defineWIDTH5#defineHEIGHTintjimmyintintmainfor(n=0;n<HEIGHT;{return}#defineWIDTH5#defineHEIGHTintjimmy[HEIGHT*intintmainfor(n=0;n++){for(m=0;m<WIDTH;jimmy[n*WIDTH+return}將數(shù)組的縱向由3return}將數(shù)組的縱向由3擴(kuò)大到4,只需要將代碼行:#defineHEIGHT#defineHEIGHT數(shù)組參數(shù)(Arraysas有時(shí)候我們需要將數(shù)組作為參數(shù)傳給函數(shù)。在C中將一整塊內(nèi)存中的數(shù)值作為參數(shù)voidprocedure(intintmyarrayprocedure//arraysas#includevoidprintarray(intarg[],intlength)for(intn=0;n<length;n++)cout<<arg[n]<<"}cout<<arg[n]<<"}cout<<}intmain()intfirstarray[]={5,10,intsecondarray[]={2,4,6,8,10};printarray(firstarray,3);printarrayreturn}5102468數(shù)中打印數(shù)組內(nèi)容的for循環(huán)才能知道需要檢查的數(shù)組范圍。)voidprocedure(intmyarray[3.2(Character前面基礎(chǔ)知識(shí)部分講C++變量類(lèi)型的時(shí)候,我們已經(jīng)提到過(guò)C++charjennycharjenny而且實(shí)際中常常如此。例如,jenny在程序的某一點(diǎn)可以只存儲(chǔ)字符串"Hello"或者"Merrychristmas"。因此,既然字符數(shù)組經(jīng)常被用于存儲(chǔ)短于其總長(zhǎng)的字符串,就形成了一種習(xí)慣在字符串的有效內(nèi)容的結(jié)尾處加一個(gè)空字符(nullcharacter)來(lái)表示字符結(jié)束,它的常量表示可寫(xiě)為0或'\0'。我們可以用下圖表示jenny20的字符數(shù)組存儲(chǔ)字符串"Hello和"MerryChristmas":注意在有效內(nèi)容結(jié)尾是如何用空字符nullcharacter0')charmystring[]={'H','e','l','l','o','\0'空字符(nullcharacter'\0')。"theresultis:號(hào)引起來(lái)的字符串末尾總是會(huì)被自動(dòng)加上一個(gè)空字符('\0')。charmystring[]charmystring[]={'H','e','l','l','o','\0'charmystring[]=在兩種情況下字符串或數(shù)組mystring都被定義為6個(gè)字符長(zhǎng)(元素類(lèi)型為字符char):Hello5個(gè)字符加上最后的空字符('\0')。在第二種用雙引號(hào)的情況下,空字符mystring="Hello";mystring[]="Hello";mystring={'H','e','l','l','o','\0'配的內(nèi)存塊的常量指針(constantpointer),數(shù)組自己不能夠被賦予任何數(shù)值,但我mystring[0]=mystring[1]=mystring[2]=mystring[3]=mystring[4]='o';字符序列賦值的方法是使用一些函數(shù),例如strcpy。strcpy(stringcopy)在函數(shù)庫(kù)strcpy(string1,這個(gè)函數(shù)將string2中的內(nèi)容拷貝給string1。string2可以是一個(gè)數(shù)組,一個(gè)指針,或一個(gè)字符串常量constantstring。因此用下面的代碼可以將字符串常量這個(gè)函數(shù)將string2中的內(nèi)容拷貝給string1。string2可以是一個(gè)數(shù)組,一個(gè)指針,或一個(gè)字符串常量constantstring。因此用下面的代碼可以將字符串常量"Hello"賦給strcpy(mystring,//settingvalueto#include<string.h>intmain()charszMyNamestrcp
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年企業(yè)聯(lián)盟:批量板材銷(xiāo)售協(xié)議
- 2024年化工實(shí)驗(yàn)室用品采購(gòu)協(xié)議
- 2024年份IDC數(shù)據(jù)中心租賃協(xié)議
- 2024年IT系統(tǒng)維護(hù)外包協(xié)議
- 2024年醫(yī)院監(jiān)控設(shè)備改造協(xié)議
- 2024年專(zhuān)用:房產(chǎn)買(mǎi)賣(mài)合同協(xié)議
- 2024年合作開(kāi)發(fā)項(xiàng)目協(xié)議
- 2024年雙方離婚無(wú)爭(zhēng)議撫養(yǎng)協(xié)議
- 2024年二手車(chē)股權(quán)收購(gòu)協(xié)議
- 2024年全面合作協(xié)議:創(chuàng)意與實(shí)施
- 年回收30萬(wàn)噸廢塑料PET破碎清洗線建設(shè)項(xiàng)目可行性研究報(bào)告
- 初中語(yǔ)文大單元匯報(bào)課件1
- MOOC 科技英語(yǔ)寫(xiě)作-西安電子科技大學(xué) 中國(guó)大學(xué)慕課答案
- 24春國(guó)家開(kāi)放大學(xué)《離散數(shù)學(xué)》大作業(yè)參考答案
- 鯊魚(yú)知識(shí)課件
- 2023-2024年天原杯全國(guó)初中學(xué)生化學(xué)競(jìng)賽復(fù)賽試題(含答案)
- (高清版)TDT 1047-2016 土地整治重大項(xiàng)目實(shí)施方案編制規(guī)程
- 自然教育行業(yè)的行業(yè)分析
- 《腫瘤學(xué)概論概論》課件
- 探析機(jī)械電子工程行業(yè)現(xiàn)狀分析及未來(lái)發(fā)展趨勢(shì)
- 機(jī)電一體化生涯發(fā)展報(bào)告
評(píng)論
0/150
提交評(píng)論