




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++程式設計第1章開始學習C++
1.1C++簡介C++是由AT&T貝爾實驗室的BjarneStroustrup博士在20世紀80年代發明並實現的。
C++的創始人BjarneStroustrup
BjarneStroustrup,C++語言的設計者和第一位實現者,被稱之為“C++之父”,1950年出生於丹麥奧爾胡斯市,在奧爾胡斯大學獲得碩士學位,在英國劍橋大學獲得博士學位。C++的創始人BjarneStroustrup現任美國德州農工大學(TexasA&MUniversity)電腦科學系教授,在此之前,一直擔任AT&T貝爾實驗室的大規模程式設計研究部門的主管,也是AT&T貝爾實驗室和AT&T公司的特別成員,ACM的特別成員和IEEE的高級會員。他的研究方向包括分佈式系統、操作系統、仿真、系統設計和程式設計。
BjarneStroustrup是The
C++ProgrammigLanguage(1985年第1版,1991年第2版,1997年第3版,2000年特別版)和TheDesignandEvolutionofC++的作者,前者自出版以來一直是C++語言領域最重要的著作之一,後者則以其對程式設計語言中思想和理想的碰撞、問題和現實約束的衝突的獨到論述而廣受關注。Bjarne已經發表了60多篇學術論文,同時,還擔任Addison-Wesley出版社的C++In-Depth系列書籍的顧問編輯。1.2編寫、編譯和運行C++程式
C++程式設計與運行的基本步驟包括:使用代碼編輯器編寫C++原始檔案;調用C++編譯器來生成可執行檔;通過命令行運行可執行檔,或者從集成開發環境程式的菜單運行程式。1.2.1C++編譯器簡介幾個公認的優秀C++編譯器和IDE
Visual
Studio
和
Visual
Studio.NET
2002、2003、2005以及2008
中帶的C++編譯器。由Microsoft公司研製。Borland
C++
Builder
X,其最大的特點是跨平臺,跨編譯器,多種Framework的集成,並且有一個WxWindows為基礎的GUI設計器,對於C++開發來說,從編譯器,到庫,到功能集成都是非常理想的。
GNU
C++,著名的開源C++編譯器,是GCC的一部分,GCC是GNU/Linux家族、BSD家族、MacOSX和NextStep等操作系統的標準編譯器。
Cygwin,是Windows下的GNU/Linux仿真環境,包括Vi、Shell、tar、XWindow等Linux應用程式,包括GCC、GDB等GNU開發工具集,還有MinGW(MinimalistGNUforWindows)包,可以與Windows的標準C運行庫msvcrt.dll一起工作,Cygwin遵守GNUGPL協議。1.2.1C++編譯器簡介1.2.1C++編譯器簡介DevC++,是Bloodshed公司推出的基於MingGW的C/C++IDE,是讓GCC運行在Windows下的工具,DevC++遵守GNUGPL協議。Emacs+GCC,Linux上開發者更傾向於使用Emacs來編輯C++的原始檔案,用Makefile來控制GCC作編譯,較複雜。IntelC++,Intel開發的編譯器,SpecialDesignforIntelx86,對Intelx86結構的CPU經過特別的優化,特別是數值計算等高性能應用,採用該編譯器編譯能大幅度地提高性能。
GNU的創始人Richard.M.Stallman
RichardMatthewStallman,簡稱RMS,GNU計畫以及自由軟體基金會(FreeSoftwareFoundation,FSF)的創立者,Stallman1953年出生於美國紐約,1971年進入哈佛大學學習,期間Stallman開發了Emacs和GNUC編譯器GCC軟體。Stallman於1983年9月發起GNU(GNU‘sNotUnix)計畫,目標是創建一套完全自由,和Unix類似的操作系統。併發表著名的GNU宣言(GNUManifesto),解釋為何發起該計畫,其中一個理由就是要“重現當年軟體界合作互助的團結精神”,從那時開始,許多程式員聚集起來共同開發一個自由的、高質量、易理解的軟體。
GNU的創始人Richard.M.Stallman
1985年,Stallman建立自由軟體基金會,為GNU計畫提供技術、法律以及財政支持。1989年,Stallman首創GNU通用公共協議證書(GNUGeneralPublicLicense,GNUGPL),創造性地提出“Copyleft”概念,GNUGPL是最廣為採用的自由軟體許可證:任何人在遵守GPL的條件下,可以免費使用和分發它,同時可以任意進行修改。1992年,Linux遵守GPL,Linux核心與來自GNU計畫的文字編輯器Emacs、C/C++語言編譯器GCC、程式庫和工具形成自由操作系統,稱為GNU/Linux或簡稱Linux,至此,完全自由的操作系統正式誕生,GNU計畫基本完成。1.2.2程式的編譯與執行C++程式可以由一個或多個函數組成,每個程式都必須包含一個main()
函數,運行程式時,操作系統通過調用main()函數開始執行程式,每個程式有且僅有一個main()函數,通用形式如下:
intmain(){…//完成函數功能的代碼置於此處
returun0;}return0表示返回一個值0給操作系統,並終止函數。返回值為0表示main()函數成功執行完畢,返回值非0意味著有錯誤出現。
【例1.1】輸出並顯示“HelloWorld!”。//"HelloWorld!"program#include<iostream>usingnamespacestd;intmain(){ cout<<"HelloWorld!"<<endl;
return0;}1.2.2程式的編譯與執行注:C++根源程式的擴展名為.cpp1.2.3MicrosoftVisualC++6.0集成開發環境1.建立工程2.創建控制臺程式的空工程3.創建C++根源程式檔4.編譯根源程式5.鏈接程式6.運行程式1.2.4“HelloWorld”程式詳解//"HelloWorld!"program2#include<iostream>3usingnamespacestd;4intmain(){5 cout<<"HelloWorld!"<<endl;6 return0;7}1.2.4“HelloWorld”程式詳解語句是程式的基本組成單元,程式由若干條語句組成,語句由單詞組成,單詞間用空白字元分隔,語句以分號結束。在編程時應該注意C++的書寫格式,基本原則是:一行寫一條語句,短語句可以一行寫多個,長語句可以一條寫多行,分行原則是不能將一個單詞分開。1.標準輸入與輸出對象C++語言沒有內建輸入或輸出語句,I/O操作由標準庫中的iostream庫提供。iostream對象功能默認設備發音cin標準輸入,從設備讀入數據。鍵盤讀作see-incout標準輸出,向設備輸出或寫數據,有緩衝。顯示器讀作see-outcerr非緩衝標準錯誤輸出,發送給它的內容立即被輸出。顯示器讀作see-errclog緩衝標準錯誤輸出,緩衝區滿時輸出。顯示器讀作see-log表1-2iostream中的4個流對象流是指要從某種I/O設備上讀入或寫出的字元序列,術語“流”試圖說明字元是隨著時間順序生成或消耗的。
1.標準輸入與輸出對象cin是用於從標準輸入中讀取的istream對象,默認輸入設備是鍵盤。cout用於寫入到標準輸出的ostream對象,用於程式的正常輸出。
1.標準輸入與輸出對象cerr綁定到標準錯誤輸出的ostream對象,輸出cerr不緩衝,用於輸出程式錯誤資訊。clog綁定到標準錯誤輸出的ostream對象,寫到clog時是帶緩衝的,用於將程式執行資訊寫入到日誌檔中。
1.標準輸入與輸出對象C++程式要使用標準庫或其他程式庫時,必須要包含該庫相應的頭檔,通過頭檔調用庫的功能。#include<iostream>//程式第2行
hello.cpp使用了標準輸出流cout,所以必須將iostream庫的頭檔包含進來,#include告訴編譯器要使用iostream庫。
2.插入運算符(<<)
cout<<"HelloWorld!"<<endl; //程式第2行
插入運算符(<<,發音為“putto”)接受兩個運算元,把右運算元寫到左運算元指定的輸出流,具有左結合性,可以鏈接在一起使用,第5行語句等價於:
(cout<<"HelloWorld!")<<endl;或:cout<<"HelloWorld!";cout<<endl;2.插入運算符(<<)endl(意思是“endline”)是一個特殊值,稱為控制符(manipulator),將它寫入輸出流時,具有刷新與設備相關聯的緩衝區(buffer),輸出當前行並換行的效果,通過刷新緩衝區,用戶可立即看到寫入到流中的所有待輸出內容。
2.插入運算符(<<)輸出連續顯示在螢幕同一行上:cout<<"Hi";cout<<"there";要將兩個單詞分別列印在兩行上:cout<<"Hi"<<endl;cout<<"there"<<endl;3.標準庫與名字空間C++標準委員會為std名字空間中的標準庫命名新的頭檔案名,命名規則是:
將現有C++頭檔案名中的.h去掉對於C語言頭檔,同樣去掉.h,並在每個名字前再添加一個c。但舊的C++頭檔如<iostream.h>,在未來幾年內將會繼續被支持,只是其不在名字空間std中。3.標準庫與名字空間#include<iostream> //程式第2行
usingnamespacestd; //程式第3行
標準庫使用std名字空間的副作用是:當使用標準庫中的名字時,必須顯式地表達出使用的是名字空間std下的名字:3.標準庫與名字空間由於iostream庫都包含在std裏面,所以iostream庫定義的cin、cout和endl等不可以直接使用,要使用cin、cout有3種方法:每次明確地以::(域操作符運算符)指定std::cout<<"HelloWorld!"<<std::endl;
將namespace內個別符號導入usingstd::cout;usingstd::endl;然後,程式中可以直接使用cout和endl:cout<<"HelloWorld!"<<endl;3.標準庫與名字空間將namespace內的所有符號導入:usingnamespacestd;這樣,名字空間std內定義的所有識別字都有效,表示這行代碼之後用到的cin、cout和endl等都是std這個名字空間內定義的,std裏面的函數和變數都可以直接調用,不需要通過域運算符“::”指定。4.注釋
注釋用於說明或解釋演算法,並不增加可執行程式的大小,編譯時,編譯器會忽略所有注釋。單行注釋用“//”表示注釋開始,從“//”開始並延續到該行程序結尾。
//"HelloWorld!"program成對注釋(/**/),以“/*”開頭,以“*/”結尾,編譯器把注釋對“/**/”之間的內容作為注釋。
/**"HelloWorld!"program*/2.1基本數據類型為什麼要區分數據類型?C++通過數據類型,告訴電腦數據是如何定義的。C++數據類型定義了該類型數據所占的記憶體空間大小、表示範圍和支持的運算。2.1.1關鍵字在C++中,有一些預定義的識別字,稱為關鍵字(keyword),也稱為保留字,關鍵字是C++語言用來構建程式的一些必需元素,每個關鍵字都具有系統預先定義好的作用,不能把它們再定義為變數的識別字。注意:關鍵字區分大小寫。2.1.1關鍵字關鍵字asmautoboolbreakcasecatchcharclassconstconst_castcontinuedefaultdeletedodoubledynamic_cast
elseenumexplicitexportextern
falsefloatforfriendgotoifinlineintlongmutablenamespacenewoperatorprivateprotectedpublicregisterreinterpret_castreturn
shortsignedsizeofstaticstatic_caststructswitchtemplatethisthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhile表2-2C++中的關鍵字2.1.2識別字識別字(identifier)是一個字元序列,用來標識常量名、變數名、函數名、類名、結構名、聯合名、對象名、類型名或者標號名。識別字只能由字母、數字、或下劃線組成;識別字的首字元必須是字母或下劃線,不能是數字,例如:2cat、8key是非法的識別字。在定義識別字時,雖然語法上允許用下劃線開頭,但是,由於標準庫裏的識別字一般以下劃線開頭,所以,最好避免使用下劃線作為自定義識別字的首字元;2.1.2識別字識別字區分大小寫,如:star、Star、sTar、stAr和STAR是互不相同的識別字;識別字不能和C++關鍵字或運算符替代名相同,識別字不能與關鍵字重名,但識別字中可以包含關鍵字,例如,intx,myclass
是合法的識別字;C++標準沒有限制識別字的長度,但編譯器的實現都會有限制,建議:在定義識別字時,一般不要超過32位。2.1.2識別字表2-4幾個正確和不正確的識別字實例正確和不正確的識別字正確不正確解釋Wiggles???$Z]**?、$、]和*都是非法字元hot_Tubhot-Tub-是非法字元taxRatetaxrate不能有空格_kcab-home-是非法字元my_Messagedon't'是非法字元smart5smart不能數字開頭_decisionBomb?有非法字元?key_boardkey.board有非法字元.2.1.3標點符號在C++程式中,標點符號對編譯器具有語法意義。標點符號標點符號說明,逗號,數據之間的分隔符號;分號,語句結束符:冒號,語句標號結束符或條件運算符'單引號,字元常量標記符"雙引號,字串常量標記符{左花括弧,複合語句開始標記符}右花括弧,複合語句結束標記符表2-5C++中的標點符號2.1.4分隔符號分隔符號用來分隔單詞或程式正文,表示某個程式實體的結束或者另一個程式實體的開始。分隔符號本身並不對程式的語法和語義產生任何影響,是一種不被編譯的符號。C++的分隔符號可以是一個或多個:空白字元、跳位字元、換行符或者注釋符。例如,下列兩個程式段等價:char
mybook
;char
mydocument;與char
mybook
;
char
mydocument;2.1.5C++的數據類型C++數據類型如圖2-1所示。
圖2-1C++數據類型2.1.5C++的數據類型基本數據類型及其表示範圍類型名字簡寫名字類型位元組表示範圍char——字元型1-128~127signedchar——有符號字元型(與字元型相同)1-128~127unsignedchar——無符號字元型10~255wchar_t——寬字元類型2擴展字元集shortintshort短整型2-32,768~32,767signedshortintsignedshort有符號短整型(同signedshort)2-32,768~32,767unsignedshortintunsignedshort無符號短整型20~65,535int——整型2-32,768~32,767signedintsigned有符號整型(與int相同)2-32,768~32,767unsignedintunsigned無符號整型20~65,535longintlong長整型4-2,147,483,648~2,147,483,647signedlongintsingnedlong有符號長整型(同longint)4-2,147,483,648~2,147,483,647unsignedlongintunsignedlong無符號長整型40~4,294,967,295float——浮點型43.4E+/-38(7位有效數字)double——雙精度型81.7E+/-308(15位有效數字)longdouble——長雙精度型101.2E+/-4932(19位有效數字)表2-6基本數據類型及其表示範圍2.2常量在C++程式中,數據以兩種形式表示:常量和變數。常量用於表示在程式運行的整個過程中始終保持不變的數據,如:圓周率π。變數用於表示在程式執行過程中值可以改變的數據,如:floatx=5.26;
中的x。
常量可以用兩種形式表示:字面值常量和符號常量。字面值常量也稱直接量(literal),在程式中直接按其書寫形式對待,如數字36、字串“Hello”。符號常量指給常量取一個名字,指定數據類型,並定義為const,因而符號常量也稱命名常量,在程式中通過常量名使用符號常量。
2.2.1整型字面值常量1.尾碼類型標識整型包括短整型(short)、長整型(long)、有符號型(int)和無符號型(unsigned
int),字面值整型常量的類型默認為int或long,其值適合int就是int類型,比int大的就是long類型。C++通過在整數後面添加尾碼字元,直接指定字面值整型常量的類型,u或U表示unsigned,l或L表示long,l或L與u或U的組合:ul、lu、uL、Lu、Ul、lU、UL或者LU,表示類型是unsignedlongint,類型簡寫為unsignedlong,如:128u //unsigned1024UL //unsignedlong1L //long8Lu //unsignedlong2.2.1整型字面值常量在C++中整型有三種表示形式:10進制、8進制和16進制,以非0開頭的數是10進制,以0開頭表示8進制,以0x或0X開頭表示16進制,例如:2.首碼類型標識50000L
//10進制長整數2002u
//無符號10進制整數123ul或123lu
//無符號10進制長整數0126
//8進制整數050000L
//8進制長整數0x12A
//16進制整數0x5a000L
//16進制長整數2.2.2浮點字面值常量浮點類型包括float、double和long
double,默認的浮點類型常量為double,如果要表達一個float或longdouble型常量,可以分別使用尾碼f(或F)或l(或L),具體地,浮點類型字面值常量,表示方式有定點數表示法和指數表示法。
定點表示法由整數和小數兩部分組成,中間用小數點隔開,例如:2.71828f //float2.36 //double,默認類型3.14159L //longdouble2.2.2浮點字面值常量指數表示法指數表示法(科學記數法)必須有尾數和指數兩部分,並且指數只能是整數,指數用e或者E表示,表示“10的X次方”,X是字元e後面跟的整數值,例如:3.6E2 //3.6×1026.02e23 //6.02×10231.6e-19 //1.6×10-192.2.3字元字面值常量1.字元常量字元類型常量包括普通字元常量和轉義字元常量。普通字元常量轉義字元常量可列印字元的字面值常量,可以用一對單引號括起單個字元的方式定義,例如:'a' 'A' '2' ',' ''不可列印的控制字元,如退格、回車和換行等,以及在C++中有特殊意義的字元,如單引號、雙引號和反斜線等,表示方法是:以轉義符‘\’開頭,後跟一個特定字母來表示。2.2.3字元字面值常量常用的轉義字元及其描述轉義字元序列描述轉義字元序列描述\a蜂鳴,響呤\b回退,向後退一格\r回車\n換行\t水準製錶\v垂直製錶\f換頁,進紙\\反斜線\\'單引號'\"雙引號"\0空字元\?問號?表2-7常用的轉義字元及其描述2.2.3字元字面值常量2.字元常量的通用ASCII碼表示在轉義符‘\’後面接8進制或16進制數,表示ASCII碼等於該值的字元。2.2.4布爾字面值在C++中,布爾類型(bool)用於描述“真”和“假”,bool類型取值只有兩個:true或false,分別對應“真”或“假”,bool字面值通過直接寫出bool值表示,直接寫:true或者false。bool類型通常作為條件運算式的計算結果,分別表示條件的滿足和不滿足,bool值也可以參加算術運算:true對應1、false對應0。同時,其他類型的數據可以轉換成bool型:0 false非0 true2.2.5字串字面值常量字串字面值常量簡稱字串,是由一對雙引號括起來的零個或多個字元,字串中可以包含空白字元、可列印字元和不可列印字元,其中不可列印字元用ASCII碼轉義序列表示。
"HelloWorld!" //字串字面值常量"" //空字元串"\nCC\toptions\tfile.[cC]\n" //含有換行和Tab的字串"2007\10\22" //字串常量2.2.5字串字面值常量C++中所有的字串字面值都由編譯器自動在末尾加上字串結束標誌‘\0’(空字元),而字元型常量不加‘\0’,所以字串字面值的長度是字串中字元的個數再加上1(‘\0’是轉義字元,占1位)。例如:"Hello" //雙引號:字串常量,長度6"A" //雙引號:字串常量,長度2'A' //單引號:字元常量,長度1圖2-2字串與字元的存儲方式2.2.6枚舉枚舉(enumeration)提供了一種語言級的支持,枚舉將變數或者對象可能的值一一列舉出來。1.枚舉的定義和初始化枚舉的定義包括關鍵字enum,其後是一個可選的枚舉類型名,以及花括弧內用逗號分隔的枚舉成員列表:enum
<枚舉類型名>
{<枚舉表>};或者不定義枚舉類型名,在枚舉定義的同時定義枚舉變數,格式如下:enum
{<枚舉表>}<變數名表>;2.2.6枚舉枚舉值對應著一個int型常量,可以在定義時指定初值,如不提供初值,第一個枚舉成員默認初始化為0,後面每個枚舉成員值依次比前面的大1,例如:enum
bool
{false,true};
//bool是C++預定義的枚舉,false默認初始化為0,true為1enumForms{shape=1,sphere,cylinder,polygon};
//shape=1、sphere=2…//point2d=2,point2w=3,point3d=3,point3w=4enumPoints{point2d=2,point2w,point3d=3,point3w};2.2.6枚舉2.枚舉類型的使用【例2.1】枚舉類型應用示例。#include<iostream>usingnamespacestd;intmain(){//定義一個weekDay枚舉類型enumweekDay{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};weekDayd1,d2,d3;//定義3個weekDay枚舉類型的變數d1=Thu;//d1只能賦“Mon、Tue、Wed、Thu、Fri、Sat、Sun”之一d2=Sat;d3=d2;cout<<"d1="<<d1<<"d2="<<d2<<"d3="<<d3<<endl;return0;}運行結果:d1=4d2=6d3=62.3變數變數聲明與定義的區別:在C++中,聲明(declaration)指將一個變數、函數或者類的類型名稱介紹給編譯器,定義(definition)指將細節資訊提供給編譯器,聲明與定義的區別在於聲明不分配存儲空間,無論是變數定義還是函數定義,編譯器都在定義處分配存儲空間。
變數是程式設計中的一個重要概念,在C++等高級程式設計語言中,程式通過變數引用記憶體單元,變數提供了程式可以操作的有名字的存儲區,程式通過變數名讀取或更改變數的值。2.3變數在程式中,使用變數主要有三個步驟:聲明和定義變數:指明變數的名字和數據類型;變數初始化;在程式中使用變數:變數賦值,操作變數中存儲的值。變數由4個部分組成:變數名、數據類型、記憶體地址以及變數值。變數名是一個識別字,數據類型決定了變數的記憶體大小和佈局、存儲在變數中的數據的取值範圍,以及變數所支持的操作集。1.變數的聲明和定義2.3變數變數定義的一般格式如下:類型名變數1,變數2,…;變數的非定義性聲明使用extern關鍵字,形式為:extern
類型名變數名;2.3變數2.變數的初始化定義變數的同時給變數賦初值稱為變數的初始化,定義變數並同時初始化的一般格式如下:類型名
變數1=初值1,變數2=初值2,…;或者類型名變數1(初值1),變數2(初值2),…;C++支持兩種變數初始化形式:複製初始化和直接初始化。複製初始化語法用等號(=),直接初始化是把初始化值放在括弧中:intival=1024;//複製初始化intival(1024);//直接初始化2.3變數下麵是幾個變數定義的例子:intmonth,day,year;//定義了3個整型變數,未賦初值intd(36); //定義整型變數d,並賦初值36longn; //定義了一個長整型變數n,未賦初值//定義變數a、b,a未賦初值,b賦初值為0.5doublea,b=0.5;//定義了一個std::string類型的變數,未賦初值std::stringaddress;2.3變數程式運行過程中,變數的值主要通過賦值運算改變。賦值運算由賦值運算符(=)將賦值運算式分為左、右兩邊:左邊一般是變數識別字,不能是常量、符號常量或某些運算式;右邊是一個可以計算出來的值,可以是常量、變數或者與變數經過若干運算後得出的值,統稱為運算式。賦值語句的作用就是將右邊的值求出並放入左邊變數名對應的存儲區域中。例如,對於以上聲明的變數ival,可以用賦值語句:ival=3*800;3.變數賦值2.3變數賦值運算:x=x+1;表示將變數x的值增加1,即先取出x的值,然後與1相加,最後,將相加的結果再放回與變數x相關聯的存儲區域中。經過運算後,變數x原來的值就丟失了。利用變數temp交換變數x和y的值:temp=x;x=y;y=temp;注意以上賦值運算的次序不能搞錯。2.3變數4.賦值不等於初始化初始化是給定義的變數賦個初值(通常是0),賦值則是根據程式需要重新給變數一個值。比如,要使得變數a內容置0,可以:inta;
//變數定義a=0;
//變數賦值或者inta=0;//變數定義並初始化(變數定義時使用=是初始化)2.4基本運算符2.4.1算術運算符
C++提供了7個算術運算符:+(正)、-(負)、+、-、*、/和%。算術運算符運算符功能用法+正號+expr-負號-expr*乘法expr1*expr2/除法expr1/expr2%求餘(也稱求模)expr1%expr2+加法expr1+expr2-減法expr1–expr2注:expr、expr1、expr2為運算式。表2-8算術運算符2.4.1算術運算符單目正號運算符返回運算元本身,對運算元不作任何修改,單目負號運算符將其運算元取負,例如:inti,k;i=+1024;k=-i;+、-、*運算符的功能分別與數學中的加法、減法和乘法的功能相同,分別計算兩個運算元的和、差、積。運算符/要求運算符右運算元不能為0,其功能是計算兩個運算元的商,當/運算符進行整除運算,如果商包含小數部分,則小數部分被截除,例如:15.3/3;
//普通除法運算,結果為5.121/7;
//整除運算,結果為321/6;
//整除運算,結果為3,小數部分被截除2.4.1算術運算符%運算符稱為“求餘”,求餘數也稱“求模”,%計算左運算元除以右運算元的餘數,以下是求餘操作的例子:inta=5%2;
//結果是:a等於1,即5除以2,餘數為1求餘運算的左右運算元只能為整型,包括bool、char、short、int和long類型,以及對應的unsigned類型,例如:intival=42;doubledval=3.14;ival%12;
//正確:求餘運算,結果為6ival%dval;
//錯誤:右運算元是float型2.4.1算術運算符如果左右運算元均為正,除法(/)和求餘(%)運算的結果是正數(或0),例如:21/6;
//321/7;
//321%6;
//321%7;
//0如果左右運算元均為負,/的結果為正數(或0),而%的結果則為負數(或0),例如:-21/-8; //2-21%-8; //-52.4.1算術運算符如果只有一個運算元為負數,除法(/)運算的值是負數(或0),例如:21/-5;
//-4如果只有一個運算元為負數,求餘(%)運算結果的符號取決於編譯器,若結果符號依分子(被除數)的符號,則結果向0一側取整,若結果符號依分母的符號,則結果向負無窮一側取整,例如:21%-5;
//1,在VisualC++6.0中2.4.2關係運算符關係運算符對兩個運算式進行比較,返回bool類型的值(true或false),C++語言提供了6個關係運算符:<、<=、>、>=、==和!=。
關係運算符運算符功能用法!邏輯非!expr<<=>>=小於小於等於大於大於等於expr1<expr2expr1<=expr2expr1>expr2expr1>=expr2==!=相等不等expr1==expr2expr1!=expr2注:優先順序順序(>、>=、<、<=)高於(==、!=),括弧中的優先順序相同,其中,expr、expr1、expr2為運算式。表2-9關係運算符2.4.2關係運算符3>5 //3不大於5,結果為
false3!=5 //3不等於5,結果為true【例2.2】測試程式。#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld!"<<endl;boolval1=true;if(val1==true){ cout<<"bool類型字面值true"<<endl;}intval2=10;if(val2==true){cout<<"int類型值10"<<endl;}return0;}運行結果:HelloWorld!bool類型字面值true2.4.3邏輯運算符邏輯運算符將其運算元視為條件運算式,根據運算式的值,計算運算元之間的邏輯關係,返回bool類型的值(true或false),C++語言提供3個邏輯運算符:!、&&、和||。邏輯運算符運算符功能用法&&邏輯與expr1&&expr2||邏輯或expr1||expr2!邏輯非!expr注:邏輯運算符的運算優先順序為:!
高於
&&
高於
||;expr、expr1、expr2為運算式。表2-10邏輯運算符2.4.3邏輯運算符邏輯與、邏輯或運算符對運算元求值:若結果為0,則條件為假(false),否則為真(true)。邏輯與(&&)運算符僅當左、右運算元都為true,其結果才得true。邏輯或(||)運算符,只要左、右運算元之一為true,結果就為true。
邏輯與和邏輯或運算符總是先計算其左運算元,然後再計算其右運算元,只有在僅靠左運算元的值無法確定整個運算式的結果時,才會求解其右運算元,這種求值策略稱為“短路求值”,給定以下形式:expr1&&expr2
//邏輯與expr1||expr2
//邏輯或2.4.3邏輯運算符在邏輯與運算式中,如果expr1的值為false,則無需求解expr2的值,結果為false;當expr1的值為true時,需要求解expr2。例如:a=0,b=2,c=3;
運算式a++&&b++&&c++
運算後,整個運算式的值為false(0),a的值為1,b的值為2,c的值為3。在邏輯或運算式中,如果expr1的值為true,則無需求解expr2的值,結果為true;當expr1的值為false時,需要求解expr2。例如:inta=0,b=2,c=3;
運算式a++||b++||c++
運算後,整個運算式的值為true(1),a的值為1,b的值為3,c的值為3。2.4.3邏輯運算符邏輯非運算符邏輯非(!)運算是對運算元進行取反運算,!將運算元視為條件運算式,產生與其運算元值相反的條件值,如果其運算元為非零值,則!運算後得false,!false得true。
2.4.4位運算符位運算符的運算元限定是整型數據類型,它將整型運算元視為二進位位的集合,支持對其二進制位的測試、設置、移位或邏輯運算,C++支持的位運算符有:~
、&、
^、|、<<和
>>。其中,左移運算符(<<),將運算元左移n個二進位位後,右邊移出的空位用0補齊。對於右移運算符(>>),如果運算元為負數,運算元右移n位後,左邊移出的空位用0還是符號位1補齊,與具體編譯器相關,由於不同編譯器如何處理符號位不確定,所以,建議位運算符使用unsigned整型運算元。2.4.4位運算符表2-11位運算符2.4.4位運算符2.4.4位運算符位運算符的優先順序從高到低依次為:~
、>>和<<、&
、^、|,其中>>和<<的優先順序相同,位運算符&和|的優先順序需要特別注意,運算式:a&b==7等價於:a&(b==7)2.4.5賦值運算符C++支持兩類賦值運算符,基本賦值運算符和複合賦值運算符,基本賦值運算符=。當同一個變數出現在賦值運算符的兩邊,對該變數做運算後,再將結果賦給該變數,C++支持用複合賦值運算符表示。複合賦值運算符的一般使用格式為:aop=b;
//op為具體的運算符每個複合賦值運算符本質上等價於:a=aopb;2.4.5賦值運算符C++支持的複合賦值運算符有:+=-=*=/=%=
//算術運算<<=>>=&=^=|= //位運算複合賦值運算符是一個整體,中間不能用空格隔開,例如:a*=6
//相當於a=a*6a%=6
//相當於a=a%6賦值運算符都是雙目運算符,運算符的優先順序是同級的,C++語言支持將這多個賦值操作寫在一個運算式中,賦值運算符的結合性是右結合,運算式的運算順序是從右至左,如:sum1=sum2=0,相當於sum1=(sum2=0),賦值運算式的值是其左運算元的值,結果的數據類型為左運算元的類型。
2.4.5賦值運算符C++語言要求賦值運算符的左運算元必須是非const的左值,例如:inti,j,ival;constintci=i; //定義並初始化ci,初始化不是賦值!1024=ival; //錯誤:字面值是右值i+j=ival; //錯誤:算術運算式結果是右值ci=ival; //錯誤:ci是const變數intx;x=3+5; //正確:x是左值x+3=5; //錯誤:x+3不是左值2.4.5賦值運算符數組名是不可修改的左值,因此,數組不可用作賦值操作的目標;數組下標運算符和解引用運算符都返回左值,因此,下標和解引用運算作用於非const數組時,其結果可作為賦值操作的左運算元:intia[10];ia[0]=0; //正確:下標運算返回左值*ia=0; //正確:解引用運算返回左值2.4.5賦值運算符賦值操作將右運算元的值賦給左運算元,賦值操作中,各對象的數據類型必須是相同類型或者可轉換為相同類型:intival;int*pval;ival=pval=0;//錯誤:不可將指針類型賦值給int類型strings1,s2;//正確:字串字面值轉換為string類型賦給s2,再將結果賦給s1s1=s2="OK";2.4.6sizeof運算符sizeof運算符用於測試某種數據類型或運算式的結果類型在內存中所占位元組數,返回值的類型為size_t,size_t是C++為了可移植性定義的數據類型,一般是unsignedint,或者unsignedlong。語法格式為:sizeof(類型聲明符/運算式)sizeof運算符有以下三種語法形式:sizeof(typename)sizeof(expr)sizeofexpr2.4.6sizeof運算符將sizeof應用在運算式上,可獲得該運算式的結果的類型長度,例如:sizeof(int)
//結果為4sizeof(3+3.6)//結果為8inti,*p;sizeof(i); //計算int型變數的類型長度sizeof*p; //計算指針的類型長度2.4.7逗號運算符逗號(,)既可以作為標點符號使用,也可以作為運算符用。逗號作為運算符時,功能是從左向右計算運算式的值,運算結果為最右邊運算式的值,此時逗號運算符稱為順序求值運算符,例如:int
i,j,k; //作標點符號用funx(x,y,z); //作標點符號用x=3+6,x*3,x+6; //作運算符用,其結果為15//輸出15,其中x是9cout<<(x=3+6,x*3,x+6)<<endl; cout<<x<<endl; //輸出9,x是92.4.8自增和自減運算符自增(++)和自減(--)運算符有前置和後置兩種使用形式,功能是實現加1或減1操作:++的前置形式,如:++i,運算元i先加1,返回加1後的值作為運算式運算結果;--的前置形式,如:--i,運算元i先減1,返回減1後的值作為運算式運算結果;++的後置形式,如:i++,運算元i加1,返回修改前的運算元i的值作為運算式運算結果;--的後置形式,運算元i減1,如:i--,返回修改前的運算元i的值作為運算式運算結果。2.4.8自增和自減運算符【例2.4】自增(++)和自減(--)運算符的運算示例。#include<iostream>usingnamespacestd;intmain(){ intx(2),y(2),z(3); y=x++-1;
//x=3,y=1,後置++,x先賦值給y,x再加1 cout<<"x="<<x<<'\t'<<"y="<<y<<endl; y=++x-1;//x=4,y=3,前置++,x加1後賦值給y,(此行x初值是上行x的終值x=3)
cout<<"x="<<x<<'\t'<<"y="<<y<<endl;
2.4.8自增和自減運算符y=z--+1;
//z=2,y=4 cout<<"z="<<z<<'\t'<<"y="<<y<<endl; y=--z+1;
//z=1,y=2,同理,(此行z初值是上行z的終值z=2)
cout<<"z="<<z<<'\t'<<"y="<<y<<endl;
return0;}在使用自增、自減運算符時,需要注意如下幾點:自增、自減運算符只能用於變數,不能用於常量或運算式;++和--運算符的結合方向是“自右至左”,它們的優先順序高於算術運算符的優先順序。2.4.9條件運算符條件運算符(?:)是C++中唯一的三元運算符,通過它可以將簡單的if-else判斷邏輯嵌入運算式中,條件運算符的語法格式為:cond?expr1:expr2cond是條件判斷運算式,expr1和expr2為運算式,條件運算符首先計算cond的值,若cond值非0,則條件為true,程式繼續執行expr1;若cond值為0,則條件為false,程式繼續執行expr2,expr1和expr2中只有一個運算式被計算。
2.4.9條件運算符inti=10,j=20,k=30;intmaxVal=i>j?i:j;等價於:if(i>j) maxVal=i;else maxVal=j;條件運算符的優先順序較低,但高於賦值運算符:e=a?b:c=d;等價於:e=(a?b:(c=d));2.4.9條件運算符當在語句中嵌入條件運算符時,通常需要用圓括號把條件運算符括起來,例如,經常使用條件運算符根據條件輸出不同的值:cout<<(i<j?i:j); //正確:輸出i、j中較小者cout<<(i<j)?i:j; //輸出1或0//語法錯,cout和int不可比較,等價於:(cout<<i)<j?i:j;cout<<i<j?i:j;cout<<(i<j);//輸出1或0//測試cout的返回結果,根據結果計算運算式i或者運算式jcout?i:j;
2.5類型轉換C++允許數據值從一種類型轉換成另一種類型。數據類型轉換有兩種方式:一種是隱式轉換(也稱自動轉換),另一種是顯式轉換(也稱強制類型轉換)。1.隱式類型轉換隱式類型轉換是由系統自動進行的,它是在運算時對轉換對象的運算值進行轉換,而不改變該對象在存貯單元中的內容和類型。隱式類型轉換遵循以下規則:若參與運算量的類型不同,則先轉換成同一類型,然後再進行運算。轉換按數據長度增加的方向進行,以保證精度不降低。即按照“向高看齊”的原則,對“較低”的類型進行提升。
2.5類型轉換橫向向左的箭頭表示運算時必定的轉換;縱向向上的箭頭表示當運算對象為不同類型時轉換的方向。注意:箭頭的方向只表示數據類型級別的高低,由低向高轉換。2.5類型轉換例如:int
i=6;char
ch='b';float
f=8.36f;
double
df=9.63;運算式ch*i+f*2-df的計算過程為:將ch轉換為int型,計算ch*i=98*6=588;將f轉換為double型,計算f*2=8.36*2=16.72;將ch*i轉換為double型,計算588+16.72=604.72;計算604.72–df=604.72-9.63=595.09。2.5類型轉換int
i;float
f=3.32f;//先計算f*2=3.32*2=6.64,然後取整數部分6賦給左值i
,i=6i=f*2在賦值運算式中,當左值運算式的類型與右值運算式的類型不同時,先計算出右值運算式的值,然後將其轉換為左值的類型後賦給左值。例如:2.5類型轉換2.強制類型轉換顯式類型轉換又叫強制類型轉換。C++提供了一種強制類型轉換運算符,可將一種類型的數據強制轉換為另一種類型的數據。強制類型轉換的格式為:(<類型>)<運算式>或<類型>(<運算式>)先求運算式值,然後將該值轉換為由類型名所指定的數據類型。2.5類型轉換例如:inta;floatx,y;(double)a //將整型變數a的值強制轉換成雙精度型int(x+y) //將實型變數x、y的和強制轉換成整型//將實型變數x、y的值轉換成整型後作求餘(%)運算(int)x%(int)y再看以下兩例://將整數5強制轉換為float型,然後再除以3,結果為1.66667
(float)5/3//先計算5/3=1,然後將1強制轉換為float型,再除以2,結果為0.5float(5/3)/2強制類型轉換運算符的優先順序高於算術運算符。2.5類型轉換說明:強制類型轉換是一種不安全的轉換。當高類型的數據轉換為低類型的數據時,數據精度會受到損失。例如:float
sum=8.96f;int
num;num=(int)sum; //num的值為8,精度受到損失
2.5類型轉換強制類型轉換也是在運算時對轉換對象的運算值進行轉換,而該對象在存貯單元中的內容和類型並沒有改變,即強制類型轉換是一種暫時的行為。例如:
double
width=2.36,height=5.5;int
area1;double
area2;area1=int(width)*int(heigth);//
area1的值為10
area2=width*height; //
area2的值為12.98
2.6運算式和語句1.運算式運算式由一個或多個運算元通過運算符組合而成,其目的是計算並求得一個結果值,運算元可以是常量、變數、函數,也就是說:變數、常量、函數和各種運算符組合構成運算式,例如,計算圓的面積:area=pi*r*r;2.6運算式和語句2.語句
運算式加上分號“;”構成語句,語句是C++程式的基本單元。運算式加上分號“;”都構成語句,有時候,連續的多條語句屬於同一控制範圍,這時,可用一對花括弧將這些語句括起來:{inta=100;intb=a*20;…}用一對花括弧括起來的所有語句,稱為一條複合語句,一條複合語句在語法功能上相當於一條語句。2.6運算式和語句3.運算式中不含運算符如果運算式中不包含運算符,則運算式的結果就是運算元本身的值(例如單個常量或變數構成的運算式):
6 //運算式的值為6當一個運算式用在需要使用其值的地方,則計算該運算式的值,例如:假設eval是一個運算式:if(eval) //計算運算式eval,並將其結果作為條件… //…2.6運算式和語句4.運算式中含有運算符對於含有運算符的運算式,其值是運算元運算的結果。5.複合運算式求值含有兩個或更多運算符的運算式稱為複合運算式,要計算複合運算式,需要考慮各個計算部分的運算優先順序,其中最基本的是“括弧優先,先乘除後加減”。3.1標準庫string類型3.1.1對象與變數一般情況下,為了與內置類型變數相區別,稱複雜數據類型的變數為對象(object),或稱某某數據類型對象。廣義講,常量、變數都稱為對象,狹義講,對象僅指複雜數據類型的變數,在本書中,沿用對象廣義概念,類變數稱為對象,基本數據類型的變數稱為對象,常量也稱為對象。
3.1.2string對象的定義和初始化為了在程式中使用string類型,必須包含string頭檔,並導入名字空間,如下:#include<string>usingstd::string;標準庫string是類類型,類類型對象通過構造函數初始化,構造函數是一個特殊的類成員函數,在類對象初始化的時候執行。3.1.2string對象的定義和初始化表3-1string的幾個常用構造函數string的幾個常用構造函數strings1;缺省構造函數,生成一個空字元串s1strings2(s1);拷貝構造函數,將s2初始化為s1的副本strings3("value");將s3初始化為一個字串字面值的副本strings4(n,'c');將s4初始化為包含n個'c'字元的字串3.1.3string對象的輸入輸出【例3.1】string對象的輸入和輸出操作。#include<iostream>#include<string>usingnamespacestd;//usingstd::string;intmain(){strings1,s2;//定義s1、s2,並初始化s1、s2為空字元串
//依次讀取字串一賦給s1,字串二賦給s2cin>>s1>>s2; cout<<s1<<s2<<endl; //輸出s1和s2return0;}3.1.4string對象的操作對象成員包括該數據類型定義的成員函數和內部數據成員,要調用一個對象的成員函數,或者引用一個對象的內部數據成員,通過“.”運算符,表示如下:對象名.數據成員或者對象名.成員函數名(參數表)前者引用的是數據成員,後者調用成員函數,這裏,“.”是一個運算符,功能是表示對象的成員。表3-2常用的string操作常用的string操作s.size()、s.length()返回s中字元的個數s.empty()如果s為空串,則返回true,否則返回falses.max_size()返回字元的可能最大個數s.capacity()返回重新分配之前的字元容量s.reserve()保留一定量記憶體以容納一定數量的字元==、!=、<、<=、>、>=、pare()按字典序比較字串=、s.assign()字串賦值s.erase()清空字元串s1+s2把s1和s2連接成一個新字串,返回新生成的字串+=、s.append()在尾部添加字元s[n]、s.at(n)存取s中位置為n的字元,位置從0開始計數find()、rfind()、substr()、find_first_of、find_first_not_of、find_last_of和find_last_not_of子串查找s.insert()插入字元s.replace()字串替換s.swap()交換兩個字串的內容>>、getline()從stream讀取某值s.c_str()將內容以c_string返回s.data()將內容以字元數組形式返回s.begin()、s.end()提供類似STL的迭代器支持s.rbegin()、s.rend()逆向迭代器s.get_allocator()返回配置器…………3.1.4string對象的操作1.string的大小和容量函數一個C++字串存在3種大小,相應的函數分別是:函數size()和length()等價,都返回string對象中字元個數。函數empty()判斷字串是否為空,判斷字串是否空也可以利用函數size()或者length(),將長度與0比較;函數max_size(),所獲取的大小是當前字串最多能容納的字元數,和機器本身的限制或者字串所在位置連續記憶體的大小有關系,例如,在某臺PC上:cout<<s.max_size()<<endl;輸出:4294967293;3.1.4string對象的操作函數capacity(),重新分配記憶體之前string所能包含的最大字符數,另一個相關的函數是reserve(),reserve()為string對象重新分配記憶體,重新分配的大小由其參數決定。3.1.4string對象的操作【例3.2】string的大小和容量函數的使用。#include<iostream>#include<string>usingnamespacestd;intmain(){ strings("HelloWorld!"); //s初始化為"HelloWorld!" cout<<s.length()<<endl; cout<<s.size()<<endl; cout<<s.capacity()<<endl; cout<<s.max_size()<<endl; if(s.empty()) cout<<"s是空串"<<endl; else cout<<"s長度是"<<s.size()<<endl; return0;}3.1.4string對象的操作2.string關係運算str1、str2比較,不失一般性,假設str1.length()<str2.length(),str2比str1長,如果str1與str2前面部分相同,則str1小於str2。如果str1和str2的字元不同,則比較第一個不匹配的字元。string類定義了常見的關係運算符(==、!=、<、<=、>、>=),關係運算符比較兩個string對象時採用大小寫敏感的字典序策略。3.1.4string對象的操作例如:stringsubStr="Hello"; stringphrase="HelloWorld";stringstr="Hi";如果兩兩比較,則subStr小於phrase,str大於subStr,str大於phrase。
3.1.4string對象的操作string類還支持比較成員函數compare(),compare()支持用索引值和長度定位子串來進行比較,返回一個整數,如:strings("abcd");strings2("ab");pare("abcd"); //將s("abcd")和"abcd"比較,相等,返回0pare("dcba"); //將s("abcd")和"dcba"比較,返回一個小於0的值pare(s2);
//將s("abcd")和s2("ab")比較,返回大於0的值pare(s);
//相等,返回0//將s(“abcd”)中“ab”和s(“abcd”)中“cd”比較,返回值小於0S.compare(0,2,s,2,2);//將s(“abcd”)中的“bc”和“bcx”中的”bc”比較,返回0S.compare(1,2,”bcx”,2);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高职体育教育教学改革的路径研究
- 2024年高升专模拟试题及参考答案详解【完整版】
- 2025年社区工作人员综合提升测试卷及完整答案详解一套
- 2023年度园林绿化作业人员考前冲刺练习题含答案详解(模拟题)
- 执业药师之《西药学专业一》强化训练题型汇编带答案详解(培优)
- 2025年海南省五指山市中考数学复习提分资料A4版附答案详解
- 绿色金融项目可行性研究与风险评估报告
- 合同协议委托培训合同4篇
- 2024自考专业(金融)常考点试卷附参考答案详解【达标题】
- 2025年自考专业(教育管理)测试卷含答案详解【培优B卷】
- 高压电气设备试验的基本知识
- 整理我的小书桌(课件)小学劳动二年级通用版
- 激光束传输与变换-第九讲课件
- 时空大数据讲义课件
- 2023年上海国企中远海运(上海)有限公司招聘笔试题库含答案解析
- 管工安全技术操作规程
- 曲臂车高空作业车施工方案
- 武汉某厂房设备基础施工方案
- 第4部分 质量经理-质量管理体系章节题-43题附有答案
- DL-T 736-2021 农村电网剩余电流动作保护器安装运行规程
- GB/T 3836.1-2021爆炸性环境第1部分:设备通用要求
评论
0/150
提交评论