




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
面向對象編程技術與方法(C++)
第2章C++編程基礎第2章C++編程基礎第2章
C++編程基礎
2.1C++的詞法規則
2.1.1字符集
2.1.2單詞
2.2C++的數據類型
2.2.1基本數據類型
2.2.2常量與變量
2.2.3自定義數據類型
2.2.4擴展數據類型
2.2.5類型轉換
2.2.6typedef與typeid 2.3表達式與語句
2.3.1表達式
2.3.2語句
2.4預處理命令
2.4.1宏定義命令
2.4.2文件包含命令
2.4.3條件編譯命令
2.5名字空間
2.5.1名字空間聲明
2.5.2使用名字空間
2.5.3標準名字空間std 2.6小結第2章C++編程基礎2.1C++的詞法規則
2.2C++的數據類型
2.3表達式與語句
2.4預處理命令
2.5名字空間2.6小結第2章C++編程基礎2.1C++的詞法規則—字符集、單詞2.1.1字符集
大小寫的英文字母:A~Z,a~z
數字字符:0~9
特殊字符:基本ASCII碼是美國標準信息交換碼,把128個字符與7位二進制數碼對應。C++把字符和它的碼值同等看待,字符對應的數值就是該字符的ASCII碼。參見例2-1。運行結果:
ch=Aa=65第2章C++編程基礎2.1.2單詞
關鍵字:預定義的單詞,表達特定的含義,不允許重定義標識符:是程序員聲明的單詞,例如函數名、類名、對象名等。要求:1)以字母或者下劃線開始;2)由字母、數字或者下劃線組成。區分大/小寫,且不能使用預定義的關鍵字。運算符:如+、-、*、/等。是預定義的函數的名字。分隔符:用于分割各個單詞或者程序正文。如:空格、制表、換行、逗號、冒號、分號、圓括號、花括號、注釋符等。文字:在程序中直接表示常量值,包括數字、字符、字符串和布爾文字。第2章C++編程基礎2.1C++的詞法規則
2.2C++的數據類型
2.3表達式與語句
2.4預處理命令
2.5名字空間2.6小結第2章C++編程基礎2.2C++數據類型基本數據類型,或稱為內置數據類型,包括:布爾型(bool)、字符型(char)、整型(int)、浮點型(float,double)、空類型(void)。可用signed、unsigned修飾字符型和整型,long可用來修飾整型和雙精度浮點型,short可以修飾整型。用戶自定義數據類型:在基本數據類型或者已定義的數據類型基礎上,用戶根據自己的需要,構造出的新類型。如:枚舉、聯合、結構、類等。將數據與操作數據的算法/函數封裝在一起所建立的類型,被稱作抽象數據類型,即類類型。擴展數據類型:在已定義的數據類型基礎上,結合某些修飾符(如[]、*、&、())或者關鍵字(如const),可以得到擴展數據類型,如數組、指針、引用等。第2章C++編程基礎2.2C++數據類型
2.2.1基本數據類型
2.2.2常量與變量 2.2.3自定義數據類型 2.2.4擴展數據類型 2.2.5類型轉換 2.2.6typedef與typeid第2章C++編程基礎2.2.1基本數據類型 布爾型(bool),或邏輯型,占用1個字節,其值只能是真(true)或假(false)兩種情況,一般用“1”表示true,用“0”表示false字符型(char),表示單個ASCII字符或者相應的整數值,占用1個字節,在內存中以ASCII碼值的形式存儲。整型(int),修飾符short、long、signed、unsigned浮點型(float,double),即實數,單精度、雙精度和長雙精度空類型(void),表示函數無返回值、或指針所指對象的類型不明確第2章C++編程基礎基本數據類型所占用的內存情況參見表2-3。第2章C++編程基礎可以通過運算符sizeof,測試在自己的機器環境下某種數據類型或對象所占用的內存大小。第2章C++編程基礎2.2C++數據類型2.2.1基本數據類型
2.2.2常量與變量
2.2.3自定義數據類型 2.2.4擴展數據類型 2.2.5類型轉換 2.2.6typedef與typeid第2章C++編程基礎2.2.2常量與變量 1.文字常量:在程序運行過程中,其值不可改變。包括:文字、宏定義的符號常量、const常量等。變量:在程序運行過程中,其值可以改變。布爾文字,true,false整型文字,例如,-1000L表示長整數,1000UL表示無符號長整數,U和L不分前后。八進制表示0767L,十六進制表示0x76fL等。浮點型文字,12.5,.65F,2.5E-3,1e+5F,.28E12L字符文字,(1)‘A’,‘4’;(2)用八進制或十六進制的ASCII碼值表示:如‘A’又可以表示為‘\101’,或者‘\x41’;(3)如‘\n’表示換行符,參見表2-4。字符串文字,‘’a‘’,‘‘book’’,以字符‘\0’結尾。因此,字符'a'占一個字節,而字符串''a''占兩個字節。第2章C++編程基礎2.2.2常量與變量 2.變量與對象變量(或對象)一般具有名稱(通過new創建的對象沒有名稱)、類型、數值、地址這四個要素。定義變量時,系統會在內存中為該變量分配一塊連續區域,變量的地址就是該區域的首地址。C語言習慣使用“變量”這個術語。C++中的對象,強調的是分配好的、具體的一塊內存區域,并且具有唯一的地址。每個對象都與一個特定的數據類型相關聯,這個類型決定了相關內存的大小、布局、能夠存儲在該區域的值的范圍以及可以對該區域進行哪些操作等。數據類型不僅包括基本數據類型,更重要的是抽象數據類型。第2章C++編程基礎2.變量與對象--對象的聲明和定義標識符(如對象名、類名、函數名等)在使用之前要先進行聲明或定義。聲明是告訴編譯器“這個標識符在某處進行了定義”。定義是說“在這里創建對象、函數等”,并分配相應的存儲空間。多數情況下對象聲明也就是定義(對全局對象進行extern聲明時例外)。
floatf1,f2,f3,f4;floatf=2.5;或者floatf(2.5);類對象通過調用構造函數進行初始化。2.2.2常量與變量 第2章C++編程基礎2.變量與對象--標識符的作用域和可見性①作用域指標識符在程序正文中的有效范圍,例如程序塊域、函數域、類域、名字空間域、文件域等。可見性討論的是標識符能否被使用。在具有包含關系的局部作用域中,同名的內層對象將屏蔽外層對象,這時外層對象的標識符是不可見的。在同一作用域中不能對同一個標識符多次定義。2.2.2常量與變量 第2章C++編程基礎2.變量與對象--標識符的作用域和可見性②在函數、類等之外定義的對象,默認情況下的作用范圍具有全局性,即在整個程序運行期間起作用,所以稱之為全局對象。在局部作用域內,同名的局部對象將屏蔽全局對象。如果想在局部作用域內使用全局對象,則應利用作用域運算符“::”。參見例2-4。如果一個程序包含多個編譯單元,那么在一個編譯單元中定義的全局對象,不僅在該編譯單元可用,在其他編譯單元也可以使用,但要先進行extern聲明。參見例2-5。對于包含多個編譯單元的程序,如果想使全局對象只在定義它的編譯單元中起作用,則可以在定義時聲明它為static。參見例2-6。2.2.2常量與變量 第2章C++編程基礎第2章C++編程基礎2.變量與對象—對象的生存期程序中的對象,一般在需要時被創建,不需要時則從內存中刪除。在創建和刪除之間所經歷的時間稱為對象的生存期。一般,局部對象的生存期與它的作用域同在,全局對象的生存期與程序的整個執行過程同在。如果想使一個對象在整個程序執行過程中都存在,同時又不希望像全局對象那樣存在安全隱患,這時可聲明static局部對象。聲明靜態局部對象時,一般要進行初始化。參見例2-7。2.2.2常量與變量 第2章C++編程基礎運行結果:
4,
5第2章C++編程基礎關于作用域與生存期的總結:一般局部對象的作用域從對象的定義點開始,到它所在的程序塊結束為止;生存期與作用域同在。靜態局部對象的作用域與一般局部對象相同;生存期與整個程序同在。一般全局對象在程序的任意地方都可以使用;生存期與整個程序同在。靜態全局對象具有文件作用域;生存期與整個程序同在。用new建立的堆對象,其作用域和生存期由用戶確定。第2章C++編程基礎2.變量與對象—對象的存儲定義對象時,auto、register、static、extern是影響對象存儲類型的幾個關鍵字。存儲區域類型:(1)靜態存儲區,全局對象、靜態對象和函數一般存儲于該區域,存儲區在程序開始執行之前分配,在程序的整個運行期間都存在。(2)棧區(stack),程序執行期間進行內存分配。一般局部變量存于棧區。(3)堆區(heap),也稱為動態存儲區。程序運行時用new申請內存,由程序員負責何時用delete釋放內存。不同存儲類型的對象,被分配在不同的內存區域參見例2-8。2.2.2常量與變量 第2章C++編程基礎第2章C++編程基礎第2章C++編程基礎3.常量在C++標準化之前,當需要用符號表示常量時,常用#define宏命令來定義,例如:
#definePI3.14159標準C++中用const定義常量,與定義變量的語法類似,只是在前面多了一個關鍵字const。
constdoublepi=3.14159;常量必須進行初始化,而且常量的值不能改變。全局const量,默認具有文件作用域,這一點與一般全局對象不同。如果想使一個const在整個程序可用,那么定義時就要帶extern聲明。2.2.2常量與變量 第2章C++編程基礎4.
volatilevolatile的語法與const類似。關鍵字const告訴編譯器“不要改變我”,而關鍵字volatile則告訴編譯器“我可能會改變”。當編譯器不進行優化時,volatile不起作用;但當優化代碼時,用該關鍵字則可以防止出現錯誤。2.2.2常量與變量 第2章C++編程基礎2.2C++數據類型2.2.1基本數據類型 2.2.2常量與變量
2.2.3自定義數據類型
2.2.4擴展數據類型 2.2.5類型轉換 2.2.6typedef與typeid第2章C++編程基礎2.2.3自定義數據類型 在基本數據類型基礎上,用戶可以根據需要構造出新的數據類型,如枚舉、聯合、結構、類等,這些都可以稱為自定義數據類型。一旦定義了一種新的數據類型,我們就可以像使用int一樣使用這種新類型。第2章C++編程基礎1.枚舉枚舉類型是若干個有名字的整型常量的集合,如:
enumShape{CIRCLE=-10,SQUARE=0,RECTANGLE=10};花括號內的標識符是枚舉常量,之間用逗號分隔;枚舉常量的類型為Shape,具有整數值,可用來初始化或更新Shape類型的對象:
Shapesh=SQUARE;//對象sh初值為SQUAREsh=RECTANGLE;//sh值改為RECTANGLE枚舉常量的值,最前邊的一個默認為為0,其后的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個值的基礎上加1,如下面BLACK值為0,GREEN值為1,RED值為5,YELLOW值為6:
enumColor{BLACK,GREEN,BLUE=4,RED,YELLOW}2.2.3自定義數據類型 第2章C++編程基礎2.聯合聯合類型對象的每個成員都存儲在同一位置,最大存儲空間的需要量由需要存儲空間最大的成員決定。2.2.3自定義數據類型
sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=8union
UnionX
{ inta; doubleb;};UnionXA;//A為對象第2章C++編程基礎3.結構結構類型由其他類型的數據成員組成,如可以把學生的學號、姓名、年齡、成績等放在一起,定義一種結構類型。2.2.3自定義數據類型
sizeof(A.a)=4 sizeof(A.b)=8 sizeof(A)=12struct
StructX{ inta; doubleb;};StructXA;//A為對象第2章C++編程基礎3.類在上面的結構類型中,我們把不同類型的數據封裝在一起。那么對于使用這些數據的算法(一般通過函數實現),我們是否也能封裝到一起?通過關鍵字class,可以定義一種新的數據類型,即類,例如:2.2.3自定義數據類型第2章C++編程基礎struct與classstruct類型中也可以封裝成員函數。struct類型與class類型的區別是:默認情況下class中的成員具有private訪問屬性,而struct中的成員具有public訪問屬性。可以把枚舉enum、聯合union和結構struct看作是類class的特殊情況。第2章C++編程基礎4.類模板為了減少程序員的重復勞動,對于功能相同而成員類型不同的類,允許聲明一個通用的類模板。通過類模板可以生成不同的類。第8章介紹類模板的定義與使用。C++標準庫為我們定義了很多可供直接使用的類(模板),如string、pair、complex、valarray、流類、容器類、迭代器等,使用時只要包含相應的頭文件即可。2.2.3自定義數據類型第2章C++編程基礎2.2C++數據類型2.2.1基本數據類型 2.2.2常量與變量 2.2.3自定義數據類型
2.2.4擴展數據類型
2.2.5類型轉換 2.2.6typedef與typeid第2章C++編程基礎2.2.4擴展數據類型在基本數據類型或者自定義數據類型基礎上,結合運用修飾符(如[]、*、&、())或者關鍵字(如const),可以得到擴展數據類型,如數組、指針、引用等。1.數組數組是數目固定、類型相同的若干個對象的有序集合,這些對象稱為數組的元素。數組定義形式:
類型數組名[維1][維2]…={{初值表},{初值表}…};inta[5]={2,1,3,5,6};intb[2][3]={{1,0,2},{3,6,5}};ClassXobj[2][3];第2章C++編程基礎數組元素的各維下標都從0開始;數組名對應數組的起始地址,是常量;而數組元素一般是變量;各元素在內存中按下標的升序連續存放,如:
inta[3];//a[0],a[1],a[2];元素個數:sizeof(a)/sizeof(a[0])intb[2][2];//b[0][0],b[0][1],b[1][0],b[1][1]b[0]表示含2個元素b[0][0]、b[0][1]的一維數組,b[1]表示含2個元素b[1][0]、b[1][1]的一維數組使用數組時,不能對數組名進行直接拷貝和比較。如果想把一個數組拷貝到另一個中去,可以采用拷貝每個元素的方法。見例2-11。C++沒有提供對數組元素下標進行范圍檢查的手段。采用標準庫中的容器vector,可以生成類似數組的對象,且能夠進行拷貝、自動調整大小等。參見例2-12。運行結果:
0.5第2章C++編程基礎2.2.4擴展數據類型2.指針指針是指能夠存放對象地址的對象。一個類型為T*的指針能夠保存T類型對象的地址。指針本身也是一個對象,占據一定的內存空間,具有自己的名字、值和地址。不同的是,指針的值是所指對象的地址,因此我們常說某指針“指向”某個對象。
例如:
inta=102;
int*
pa=&a;可以通過指針修改它所指向的對象的值。如:*pa=100;//通過pa修改a的值也可以定義指向類對象的指針,例如:
ClassXobj; ClassX*p=&obj;雖然在聲明指針時可以不進行初始化,但這樣的指針是懸空的,使用時容易出現錯誤。因此應該養成定義時進行初始化的習慣。第2章C++編程基礎指針與數組在C++程序中,數組名對應數組的起始地址,數組名和指針名經常可以互換使用。參見例2-13。但是,數組和指針是不同的。數組名所指內存區的地址和容量在數組生命期內是不變的。可用sizeof(數組名)算出數組所占的字節數。而指針一般是變量,可以指向類型匹配的任意對象(即不同的內存區)。我們無法知道指針所指內存區的大小,如用sizeof(指針名),得到的是指針本身所占的字節數,而不是所指內存的字節數。也可以定義元素為指針的數組,稱為指針數組:
doublef1=1.8,f2=2.8; double*p[2]={&f1,&f2};
第2章C++編程基礎指向常量的指針與常量型指針①定義指針時,如用關鍵字const修飾所指對象的數據類型,這時的指針就稱為指向常量的指針。指向常量的指針可以保存變量或者常量的地址,并且限制指針的訪問方式為“只讀”,即不能通過指針修改所指對象的值。 intv1=3; //變量v1 constintmax=100; //常量max,初始化! constint*p1=&v1;//指向常量的指針
*p1=5; //錯誤! p1=&max; //將常量max的地址賦給p1 *p1=10; //錯誤!第2章C++編程基礎指向常量的指針與常量型指針②定義指針時,如果在指針名前加關鍵字const修飾,則該指針是常量型指針。常量型指針必須進行初始化,然后指針的值不再改變,即指針的指向不變。但如果常量型指針所指的是變量,則可以通過該指針修改所指變量的值。intv1=10,v2=20; //兩變量constintmax=100; //常量maxint*constpv1=&v1; //常量型指針指向v1pv1=&v2; //錯誤!指向不能再改變*pv1=v2; //正確!int*constpv2=&max;//錯誤!第2章C++編程基礎指向常量的指針與常量型指針③定義指針時,如果對數據類型和指針名都用了關鍵字const修飾,則這樣的指針稱為指向常量的常量型指針。這意味著定義之后,指針的值和所指對象的值都不能改變。 intv1=10,v2=20; //兩個變量 constintmax=100; //常量max constint*constpv1=&v1; constint*constpv2=&max; pv1=&v2; //錯誤!
*pv1=v2; //錯誤!第2章C++編程基礎2.2.4擴展數據類型3.引用引用可以理解為對象的別名,其聲明形式如下:
數據類型&引用名=被引用的對象名; intm=0;
int&n=m;//n是int型變量m的引用 n=n+5;//結果m=5 ClassXobj;
ClassX&newname=obj; 聲明引用時必須進行初始化,初值一般必須是對象名;const引用也可用常量或表達式的值初始化。引用一旦被初始化,就不能再指代其他對象。不過一個對象可以有多個引用。
第2章C++編程基礎2.2.4擴展數據類型引用和指針的區別指針用來保存對象的地址,引用相當于對象的別名;聲明指針時要分配內存(引用型除外),而聲明引用時不分配內存;聲明引用時必須初始化,聲明指針時可以不初始化;指針可作數組元素,引用不能作數組元素;可以有指向void型的指針,而沒有void型引用;可以聲明指針的引用,而沒有指向引用的指針。
第2章C++編程基礎2.2.4擴展數據類型引用和指針的區別 intm1=0,m2=5; int*p1=&m1; //p1指向m1
int*&p2=p1; //p2是指針p1的引用,也指向m1 *p2=m2; //將m2的值5賦給p2所指向的對象即m1 int&n1=m1; //n1是m1的引用 int&*n2=n1; //錯誤!
第2章C++編程基礎2.2.4擴展數據類型4.字符串字符串是若干有效字符的序列。字符串常量由雙引號括起來,如"x+y=10"。字符串可以放在一個字符數組中,結束位置用符號‘\0’表示。定義字符數組時,可以逐個字符初始化,也可以用一個字符串常量初始化。例如: charstr1[]={'x','+','y','=','1','0','\0'}; charstr2[]="x+y=10"; //數組含7個元素
第2章C++編程基礎可以通過指向字符的指針管理字符串,例如:
charstr1[]={'x','+','y','=','1','0','\0'};char*cp=str1;//cp保存字符串str1的起始地址對字符指針可以用字符串常量初始化,但不能以數組元素形式初始化,因為cp只存放一個地址值。例如:
char*cp1="x+y=10"; //cp1保存串的起始地址
char*cp2={'x','+','y','=','1','0','\0'};//錯誤!定義字符串時,最好使用標準庫中的類string,該類封裝了字符串的基本特性和各種典型操作,如賦值、連接、比較、查找等。參見例2-14。第2章C++編程基礎運行結果:x+y=10,size=6第2章C++編程基礎2.2C++數據類型2.2.1基本數據類型 2.2.2常量與變量 2.2.3自定義數據類型 2.2.4擴展數據類型
2.2.5類型轉換
2.2.6typedef與typeid第2章C++編程基礎2.2.5類型轉換1.隱式轉換隱式轉換由編譯器自動完成,運算規則是從低類型向高類型提升。從高類型向低類型轉換會給出警告。inta=3.541+3;//結果a的值為6C++可以將某種指針類型(指向非const型)自動轉換成void*型,反過來則不行。inta=0;int*p1=&a;void*pv=p1;//OK.隱式轉換int*p2=pv;//錯誤!void*不能隱式轉換成int*constint*pci=&a;pv=pci;//錯誤!constint*不能隱式轉換成void*第2章C++編程基礎2.2.5類型轉換2.顯式轉換顯式轉換一般要通過類型轉換運算符強制實現類型轉換,因此也稱為強制轉換。可以通過強制類型轉換運算符實現類型的顯式轉換:
inta=1;doubleb=3.1415;a=(int)b; //C風格的顯式轉換
a=int(b); //早期C++風格的顯式轉換標準C++顯式轉換方式:
static_cast<T>(Expr);const_cast<T>(Expr);dynamic_cast<T>(Expr);reinterpret_cast<T>(Expr);第2章C++編程基礎2.2.5類型轉換用戶定義的轉換轉換構造函數可以將某種類型的對象轉換成當前類類型。類型轉換函數可以將當前類型的對象轉換成指定的類型。typedef可以為某種數據類型聲明一個新名字。使用運算符typeid可以得到一個對象的數據類型。第2章C++編程基礎運行結果:classClassXclassClassXdouble第2章C++編程基礎2.1C++的詞法規則
2.2C++的數據類型
2.3表達式與語句
2.4預處理命令
2.5名字空間2.6小結第2章C++編程基礎2.3表達式與語句2.3.1表達式:由運算符和操作數組成,按一定求值規則我們可以求出表達式的值;其中操作數可以是常量、變量或另一個表達式。算術運算符與表達式;關系運算符與表達式;邏輯運算符與表達式;位運算符與表達式;賦值運算符與表達式;三元條件運算符與表達式;逗號運算符與表達式;動態內存分配與釋放運算符2.3.2語句:程序由語句組成,語句以“;”結束。
簡單語句,復合語句,控制語句(選擇語句、循環語句、跳轉語句),判斷表達式的使用第2章C++編程基礎2.3.1表達式根據功能,運算符可分為算術運算符、關系運算符、邏輯運算符、位運算符、賦值運算符及特殊運算符。根據所需操作數的個數,運算符可分為一元運算符、二元運算符和三元運算符。一元運算符只需要一個操作數,二元運算符需要兩個操作數,三元運算符則需要三個操作數,C++只有一個三元運算符即“?:”。一個表達式可以包含多個運算符,運算順序由各運算符的優先級和結合性決定。C++運算符的功能和優先級參見表2-5。第2章C++編程基礎2.3.1表達式算術表達式由算術運算符和操作數組成,結果是算術值,值的類型與操作數的類型有關。基本算術運算符:二元算術運算符如+、-、*、/、%(int型);一元算術運算符如-(取負)、+(取正)等。其中一元運算符優先級高于二元運算符。++和--,是兩個一元運算符,操作數必須是變量,分前綴和后綴,優先級較高,結合性自右向左。1.算術運算符與表達式第2章C++編程基礎前綴“++”可以理解為“先增1后使用”,而前綴“--”可以理解為“先減1后使用”。后綴“++”可以理解為“先使用后增1”,后綴“--”可以理解為“先使用后減1”。
inta1=1,c1=0;
c1=++a1; //a1=a1+1;c1=a1;inta2=1,c2=0;
c2=a2++; //c2=a2;a2=a2+1;前綴方式與后綴方式的區別:第2章C++編程基礎2.3.1表達式關系表達式由關系運算符和操作數組成,用來對兩個操作數進行比較,結果為bool類型的值。如果關系為真,則結果為true;如果關系為假,則結果為false。關系運算符包括:等于(==),不等于(!=),小于(<),小于等于(<=),大于(>),大于等于(>=)。后四種的優先級高于前兩種。例如:設a=1,b=2,則表達式(a>b)的值為false,表達式(a<2)的值為true。2.關系運算符與表達式第2章C++編程基礎2.3.1表達式邏輯表達式由邏輯運算符和操作數組成,結果為bool類型的值。邏輯運算符包括:邏輯或(||)、邏輯與(&&)和邏輯非(!)“邏輯或”表示當兩個操作數只要其中一個為真,結果就為true;“邏輯與”表示當兩個操作數都為真時,結果才為true;“邏輯非”表示取操作數的邏輯相反值。參見表2-6。3.邏輯運算符與表達式第2章C++編程基礎2.3.1表達式位運算表達式由位運算符和操作數組成,可以對整型數按二進制位進行操作。位運算符包括:按位或(|),按位異或(^),按位與(&),按位求反(~),左移(<<),右移(>>)。“按位異或”運算的規則是:對應位不同為1,相同為0。例如:unsignedinta=8; //二進制為00001000unsignedintc=a^10;//c=00000010unsignedintb=a<<1;//b=000100004.位運算符與表達式第2章C++編程基礎2.3.1表達式賦值表達式由賦值運算符與操作數組成,作用是將等號右邊表達式的值賦給等號左邊的對象,表達式值的類型與左邊對象的類型一致。是二元運算符,結合性自右至左,優先級僅高于逗號運算符。簡單賦值(=),復合賦值(+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=)。例如:
a=b=5;//先將5賦給b,再賦給aa+=3; //等價于a=a+35.賦值運算符與表達式第2章C++編程基礎2.3.1表達式C++唯一的一個三元運算符是“?:”,具有簡單的選擇功能,其格式為:
a1?a2:a3其中a1具有bool類型,a2和a3可以是任何類型,表達式的類型取決于a2和a3中類型高的一個。上式的運算過程是,若a1為true則表達式值為a2的值,否則表達式值為a3的值。例如求a和b中較大的值,并將該值賦給c,結果c的值為5:
inta=3,b=5,c=0;c=(a>b)?a:b;6.三元條件運算符與表達式第2章C++編程基礎2.3.1表達式逗號也是一個運算符,作用是將多個表達式連成一個表達式。計算時從左至右計算每一個表達式的值,逗號表達式的值與最后一個表達式的值相同。例如:
a=2*3,a*5;//表達式相當于(a=2*3),a*5上述表達式中,逗號前面賦值表達式的值為6,a*5的值為30,則逗號表達式的值為30。逗號運算符的優先級最低,使用較少。7.逗號運算符與表達式第2章C++編程基礎2.3.1表達式new運算符建立動態對象,并分配內存空間;delete運算符刪除動態對象,即釋放內存空間。new和delete必須配對使用。由new創建的堆對象沒有名字,只能通過地址進行訪問,這一點與普通對象不同。例如:
int*p1=newint;int*p2=newint(10); int*p3=newint[10]; deletep1; deletep2; delete[]p3; 8.動態內存分配與釋放運算符第2章C++編程基礎2.3.2語句簡單語句:空語句,定義語句,表達式語句復合語句:多個簡單語句用一對花括號括住。控制語句:可以改變程序的流程。包括選擇語句(if-else,switch)循環語句(while,do-while,for)跳轉語句(break,continue,goto)第2章C++編程基礎2.3.2語句常用選擇語句包括if-else語句和switch語句。if-else語句的兩種形式(應用參見例2-16):1.選擇語句第2章C++編程基礎第2章C++編程基礎if-else語句嵌套使用可以實現多路分支,但比較繁瑣,而用switch語句比較簡單。語法:switch(表達式){ case常量表達式1:語句1;break; case常量表達式2:語句2;break; …… case常量表達式n:語句n;break; default:語句n+1;}第2章C++編程基礎2.3.2語句C++中可使用三種循環語句:while循環、do-while循環和for循環。2.循環語句第2章C++編程基礎第2章C++編程基礎運行結果:2550第2章C++編程基礎2.3.2語句跳轉語句包括break語句、continue語句和goto語句。由于goto語句存在較大的安全隱患,盡量不用。break語句可用于switch和循環結構中,作用是退出switch或循環體。continue語句一般只能用于循環結構中,作用是結束本次循環,進入下一次循環。3.跳轉語句運行結果:10,12,14,16,18,2010第2章C++編程基礎2.3.2語句當表達式值為非0,被認為是true;只有當表達式的值等于0時,才認為是false。簡化代碼:如果表達式expr的值為布爾型、整型、指針值等,與0比較時都可以采用下列方式:expr 相當于expr!=0 !expr 相當于expr==0 if(a-b) 相當于if((a-b)!=0)while(p&&!q)相當于while(p!=0&&q==0)實數在計算和存儲時會有微小的誤差,因此一般不能用“==”或“!=”進行判斷。應設法轉化為“>=”和“<=”的形式。假設x為浮點型變量,則它與零值比較的if形式為:if((x>=-ε)&&(x<=ε))//ε為很小的正數
4.判斷表達式的使用第2章C++編程基礎2.1C++的詞法規則
2.2C++的數據類型
2.3表達式與語句
2.4預處理命令
2.5名字空間2.6小結第2章C++編程基礎2.4預處理命令使用預處理命令的目的是為了改善程序的組織和管理。預處理命令以字符“#”開頭,它不是語句,后面不帶分號。下面介紹常用的預處理命令: 宏定義命令 文件包含命令 條件編譯命令第2章C++編程基礎2.4預處理命令2.4.1宏定義命令最簡單的宏定義命令是用一個標識符代替另一種符號表示:
#definePI3.14159//定義宏PI C語言中常用這種方式定義宏常量,或者用帶參數的宏來描述簡單的函數,例如:
#definef(x)2*x//定義帶參數的宏f(x)宏定義只是符號的簡單替換,在編譯之前執行,不能進行語法檢查,存在安全隱患。在C++中,用const定義常量、用inline定義內嵌函數。#undef與#define配合使用,作用是取消宏定義
#undefPI //取消宏名PI第2章C++編程基礎2.4預處理命令2.4.2文件包含命令#include命令的作用是,在編譯之前把指定文件的內容嵌入到該命令所在的位置。文件包含命令一般放在程序的開頭,例如:
#include<iostream>#include“myhead.h”其中,include為關鍵字,括號或引號中的文件名是被包含文件的全名,可以給出盤符和目錄路徑。上面第一種形式,一般用于C++系統提供的頭文件,這些文件存放在C++系統目錄下的include子目錄下。第二種形式,一般用于程序員自己建立的頭文件或其他源文件。第2章C++編程基礎2.4預處理命令2.4.3條件編譯命令條件編譯命令是用來限制某些內容要在滿足一定條件時才參與編譯,否則不參與編譯。條件編譯命令的結構與if選擇結構非常相似。三種形式:形式一:若“標識符”被定義過,則編譯程序段1;否則編譯程序段2,或者直接執行#endif后面的程序。#ifndef
標識符程序段1#else
程序段2#endif或者:#ifndef
標識符程序段1#endif
形式二:若“標識符”未被定義過,則編譯程序段1;否則編譯程序段2,或者直接執行#endif后面的程序。
形式三:若常量表達式i(i=1,…,n)的值為真,則編譯程序段i;若所有表達式都為假,則編譯程序段n+1。形式三:
#if
常量表達式1
程序段1#elif
常量表達式2
程序段2 …#elif
常量表達式n
程序段n#else
程序段n+1#endif第2章C++編程基礎第2章C++編程基礎避免重復包含://head1.h //如果沒有設置該文件被包含的標志HEAD1_H//則設置該標志,并且之后的代碼參與編譯#ifndefHEAD1_H #defineHEAD1_H
intaddint(inta,intb);//函數聲明doubled=0.8; //全局變量定義#endif//HEAD1_H第2章C++編程基礎2.1C++的詞法規則
2.2C++的數據類型
2.3表達式與語句
2.4預處理命令
2.5名字空間2.6小結第2章C++編程基礎2.5名字空間雖然標識符可以具有函數域、類域,可以通過static使函數和對象具有文件域,但全局性的對象名、函數名以及類名還在同一個全局名字空間中。一個大型軟件往往由多人完成,一旦對全局性的名字缺乏控制就會出現名字沖突。名字空間(namespace)是C++的新特性之一。可以把來自不同編程人員的全局性標識符歸屬不同的名字空間,從而解決程序開發中常見的同名沖突問題。名字空間聲明,使用名字空間,標準名字空間std。第2章C++編程基礎2.5名字空間2.5.1名字空間聲明namespacecalculator{ doubled=0.5; voidPrint(doublex){cout<<x<<endl;} classX{};//此處分號不能少!}//此處可以沒有分
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 健康促進工作培訓課件
- T/ZHCA 106-2023人參提取物稀有人參皂苷Rh2
- 垂花柱設計思路解析
- 中華優傳統文化 課件 第六章 中國傳統史學
- 2025遼寧廣告職業學院輔導員考試試題及答案
- 2025貴州航天職業技術學院輔導員考試試題及答案
- 2025紅河衛生職業學院輔導員考試試題及答案
- 《鋼鐵是怎樣練成的》讀后感字
- 體育與衛生健康融合知識
- 秦漢時期的藝術設計
- 2024年江蘇省寶應縣事業單位公開招聘緊缺人才37名筆試題帶答案
- 保險公司保全試題及答案
- 交通過程中的大數據應用試題及答案
- 2024危重癥患兒管飼喂養護理-中華護理學會團體標準解讀
- 家庭醫生簽約基本服務包清單(試行)2025
- 2024年美睫技術考核試題及答案
- 實施質量管理體系的好處
- 中國化的馬克思主義(毛澤東思想)概論知到課后答案智慧樹章節測試答案2025年春上海思博職業技術學院
- 醫院B超室工作制度
- 民航綜合測試題及答案
- 2025年蘇州社工考試試題及答案
評論
0/150
提交評論