第2章 數據類型、運算符和表達式
2.1 C++語言的數據類型
C+ +中的數據類型大體可以分成三類,它們是:基本類型、導出類型和用戶定義類型。
1.基本類型
(1)邏輯型
邏輯型用關鍵字bool表示,因此又稱為bool型(布爾型)。邏輯型的取值范圍只包含true和false,它們都是C+ +關鍵字。
(2)字符型
字符型用關鍵字char表示,因此又稱為char型,即把字符作為一種數據進行操作。字符型的取值范圍是全部基本字符以及ASCII碼集或擴充ASCII碼集對應的全部符號。
(3)整型
整型用關鍵字int表示,因此又稱為int型,它是C+ +中最常用的數據類型,整型數據的取值范圍是計算機所能表示的所有整數。
(4)浮點型
浮點型包括單精度型和雙精度型兩種,單精度型用關鍵字float表示,又稱float型;雙精度型用關鍵字double表示,又稱double型。它們對應著數學中實數的概念,即帶有小數點的數。
浮點型數據的取值范圍原則上是任意大小和精度的小數,但實際上不可能是任意大小的,而是有一定范圍的。C+ +中的浮點數可以采用尾數加階碼的表示形式,表示的浮點數范圍是:單精度型-3.4E38~3.4E38,但不能超過7位有效數字;雙精度型-1.7977E308~1.7977E308 ,但不能超過15位有效數字。
(5)空值型
空值型用關鍵字void表示,因此又稱為void型?罩敌偷娜≈禐榭。C+ +中不存在void型的常量或變量。C+ +語言規定,所有函數說明都必須指明返回值類型,沒有返回值的函數應說明為void類型的函數;另外,void類型還可以用來聲明一個指針變量。
2.基本類型的派生類型
C+ +語言中,基本類型的字長及其取值范圍可以放大和縮小,改變后的類型就叫做基本類型的派生類型。派生類型聲明符是由基本類型關鍵字char、int、float、double前面加上類型修飾符組成的。類型修飾符包括:
short 短類型,縮短字長;
long長類型,加長字長;
signed有符號類型,取值范圍包括正負值;
unsigned無符號類型,取值范圍只包括正值;
2.2 常量
常量是指在程序執行過程中值不改變的量。常量有兩種表示形式,即字面常量和符號常量。字面常量的類型是根據書寫形式來區分的,它們的類型分別為:整型、浮點型、字符型、字符串型,每個字面常量的字面本身就是它的值。符號常量是一個標識符,在程序中必須遵循“先聲明,后使用”的原則。
1.邏輯常量
邏輯常量主要用在邏輯運算中,此外,由于邏輯值對應著整數1或0,所以它也能夠像其他整數一樣出現在表達式中,參與各種整數運算。
2.字符常量
字符常量簡稱字符,它以單引號作為起止符號,中間有一個或若干個字符。這是一般意義上的字符常量;除此之外還有一種特殊形式的字符常量,以“\”開頭的包括多個字符的字符序列也是符合規定的字符常量。但是,無論字符常量包含一個還是多個字符,每個字符常量只能表示一個字符,當字符常量的一對單引號內多于一個字符時,則將按照一定的規則解釋為一個字符。
計算機中常用的ASCII字符也是字符型的數據,因為ASCII碼值在0~127之間,正好落在字符型數據的取值范圍之內。ASCII字符集中的每一個顯示字符(個別字符除外)都可以作為一個字符常量。但是,對于一些特殊的字符,如回車、換行等具有控制功能的字符,或者像單引號、雙引號等作為特殊標記使用的字符,就無法直接采用單引號作為起止符號來表示。C+ +中引入了“轉義”字符的概念,其含義是:用反斜線“\”引導的下一個字符失去了原來的含義,而轉義為具有某種控制功能的字符。另外,還允許用反斜線引導一個具有1至3位的八進制整數或一個以字母x(大、小寫均可)作為開始標記的具有1至2位的十六進制整數,對應的字符就是以這個整數作為ASCII碼的字符。
3.整型常量
整型常量就是整型常數,簡稱整數,它有十進制、八進制和十六進制3種表示。
(1)十進制整數
十進制整數以正號(+)或負號(-)開頭,由首位非0的一串十進制數字組成。若以正號開頭則為正數,若以負號開頭則為負數,若省略正負號,則默認為正數。
當一個十進制整數大于等于-2 147 483 648(即231),同時小于等于2 147 483 647(即-231-1)時,則被系統看作是整型常量;當在2 147 483 648~4 294 967 295即232-1范圍之內時,則被看作是無符號整型常量;當超過上述兩個范圍時,則無法用C+ +整數類型表示,只有把它用實數(即帶小數點的數)表示才能夠被有效地存儲和處理。
(2)八進制整數
八進制整數以數字0開頭,后面接若干個八進制數字(借用十進制數字中的0~7)。八進制整數前面不帶正負號,全部默認為正數。
當一個八進制整數大于等于0同時小于等于017777777777時,則稱為整型常量,當大于等于020000000000同時小于等于037777777777時,則稱為無符號整型數量。不要使用超過上述兩個范圍的八進制整數,因為沒有與此相對應的C+ +整數類型。
(3)十六進制整數
十六進制整數以數字0和字母x(大、小寫均可)開頭,后面接若干個十六進制數字(借用十進制數字0~9,字母A~F或a~f)。
當一個十六進制整數大于等于0同時小于等于0x7FFFFFFF時,則稱為整型常量,當大于等于0x80000000同時小于等于0xFFFFFFFF時,則稱為無符號整型常量,與八進制整數類似,超過上述兩個范圍的十六進制整數也沒有與之相對應的C+ +整數類型,所以也不能使用它們。
C+ +中的整型數據除了一般表示方法之外,還允許給它們添加后綴u或l。對于任一種進制的整數,若后綴為字母u(大、小寫均可),則規定它為一個無符號整型(unsigned int)數,若后綴為字母l(大、小寫均可),則規定它為一個長整型(long int)數。在一個整數的末尾,可以同時使用u和l,并且對排列無要求。
4.實型常量
實型常量有十進制的定點和浮點兩種表示方法,但并不存在其他進制的表示,下面分別介紹這兩種表示方法。
(1)定點表示
定點表示的實數簡稱定點數,實際上是以小數形式表示實數。定點表示的實數是由一個正號或負號(正號可以省略)后接若干個十進制數字和一個小數點所組成,這個小數點可以處在任何一個數字位的前面或后面。
(2)浮點表示
浮點表示的實數簡稱浮點數,實際上是以指數形式表示實數。浮點表示的實數是由一個十進制整數或定點數后接一個字母E(大、小寫均可)和一個1至3位的十進制整數所組成,字母E之前的部分稱為該浮點數的尾數,之后的部分成為該浮點數的指數,該浮點數的值就是它的尾數乘以10的指數冪。
對于一個浮點數,若將它尾數中的小數點調整到最左邊第一個非零數字的后面,則稱它為規格化(或標準化)浮點數。
實型常量分為單精度(float)、雙精度(double)和長雙精度(long double)三類。一般float型數據在內存中占4個字節,提供7位有效數字;double型數據占8個字節,提供15位有效數字;long double型數據占10個字節,提供19位有效數字。對于一個定點數或浮點數,C+ +自動按一個雙精度數(double型)來存儲。若在一個定點數或浮點數之后加上字母F(大、小寫均可),則自動按一個單精度數來存儲。
5.枚舉常量
枚舉常量是枚舉類型中定義的值,即枚舉植。枚舉類型屬于用戶定義類型,用關鍵字enum表示,因此又稱為enum類型。用戶通常利用枚舉類型定義程序中需要使用的一組相關符號常量。聲明枚舉類型的語法格式為:
enum<類型名>{<枚舉值表>};
其中,enum是關鍵字,指出要定義的是枚舉類型。<類型名>是標識符,即由用戶給出的具體枚舉類型名。<枚舉值表>包含多個枚舉值,它們用逗號分隔開,每個枚舉值就是一個枚舉常量。枚舉值有兩種定義形式:一是<值名>;二是<值名>=<整型常量>。
關于enum類型有四點說明:
(1)一個enum類型實際上是int類型的一個子集,其每一個枚舉值代表一個整數。
(2)n個枚舉值全部未賦常量值時,它們自左至右分別與整數0,1…n-1對應。
(3)若第i個枚舉值賦常量值為m,則其未賦常量值的后續枚舉值分別與整數m+1,m+2…對應,直到下一個賦了值的枚舉值或結束。因此,為枚舉值所賦的整型常量值應從左至右遞增。
(4)枚舉類型的聲明也可作為成組聲明若干整型符號常量的方法。也就是說,把每個要聲明的符號常量作為一個枚舉值,將各個枚舉值合在一起定義成一個枚舉類型。
由于枚舉類型屬于用戶定義數據類型,一旦枚舉類型被定義后就可以使用它來定義變量。
2.3 變量
1.變量的定義
變量的定義是通過變量聲明語句來實現的,變量聲明語句的一般格式為:
[<存儲類>]<類型名><變量名>[=<初值表達式>],...;
<存儲類>有四種,它們分別是auto、register、static、extern。
<類型名>為已存在的一種數據類型名稱,如char,short,int,long,float,double等基本數據類型名,或者用戶定義的數據類型名。
<變量名>是用戶定義的一個標識符,用來表示一個變量,該變量可以通過后面的可選項賦予一個值,稱為給變量賦初值,也叫做對變量進行初始化。C+ +中標識符是區分大小寫的,也就是說,大寫字母和小寫字母被認為是不同的字母。
變量名的命名遵循如下規則:
(1) 不能是C+ +關鍵字;
(2)第一個字符必須是字母或下劃線;
(3)中間不能有空格;
(4)變量名中不能包括;,′″+-之類的特殊符號。
實際上變量名中除了能使用26個英文大小寫字母和數字外,只能使用下劃線“_”。
2變量的使用方式
(1)全局變量和局部變量
全局變量是在所有函數定義、類定義和程序塊之外聲明的變量。聲明全局變量時如果在程序中不對它進行專門的初始化,該變量會被系統自動初始化為0。在程序的任何一個函數、類或程序塊之內均可以訪問全局變量。
局部變量是在某個函數定義、類定義或程序塊之內聲明的變量。局部變量只能在聲明它的函數、類或程序塊中被訪問。
(2)生存期與作用域
生存期是指從一個變量被聲明且分配了內存開始,直到該變量聲明語句失效,它占用的內存空間被釋放為止。一個全局變量的生存期從它被聲明開始,直到程序結束;一個局部變量的生存期從它被聲明開始,直到包含它的最近的一個程序塊結束。
作用域是指變量名可以代表該變量存儲空間的使用范圍。
一般情況下,變量的作用域與其生存期一致,但由于C+ +語言允許在程序的不同部分為不同變量取同一名字,因此一個變量名的作用域可能小于其生存期。
(3)變量的存儲類屬性
在C+ +中變量還可以按存儲分配方式的不同被劃分為4種不同的存儲類別,它們分別是:
、賏uto變量:用關鍵字auto聲明的局部變量稱為自動變量。auto為變量聲明時的默認存儲類別,即在變量定義時,如果不顯式標明存儲類別,則系統自動按auto變量處理。auto變量所占用存儲空間的分配和釋放工作將由系統自動完成。
、趓egister變量:用關鍵字register聲明的局部變量稱為寄存器變量。register變量可能以寄存器作為其存儲空間。聲明寄存器變量時,關鍵字register的作用只能是建議(而不是強制)系統使用寄存器,原因是寄存器雖然存取速度快,但空間有限,當寄存器不夠用時,該變量仍然按自動變量處理。
③static變量:用關鍵字static聲明的變量稱為靜態變量。任何靜態變量的生存期將延續到整個程序的終止。與全局變量一樣,為靜態變量分配的存儲空間在整個程序運行過程中不再被釋放;如果靜態變量未被賦初值,系統將自動為其賦初值為0。
④extern變量:用關鍵字extern聲明的變量稱為外部變量。變量一旦被聲明為外部變量,系統就不必像一般變量那樣為其分配內存,因為該變量已在這一局部的外面被定義。外部變量一般用于多個文件組成的程序中,有些變量在多個文件中被聲明,但卻是指同一變量。標明某一變量為外部變量可以避免為其重復分配內存。
(4)typedef類型說明
使用關鍵字typedef可以為已有類型名定義一個新類型名。其語法格式為:
typedef<已有類型名><新類型名>
typedef類型說明并沒有真正地定義新的數據類型,它只是相當于給某個已有的數據類型起了一個別名。在規模較大的程序中為了提高代碼可讀性常采用這種形式。
3符號常量聲明語句
符號常量在使用之前必須先進行聲明。符號常量聲明語句同變量聲明語句類似,其語法格式為:
const<類型名><符號常量名><初值表達式>……;
其中,關鍵字const指明這是一條符號常量聲明語句,后面跟著符號常量的類型名,接著是符號常量名,它是一個用戶定義的標識符,符號常量名之后為一個賦值號和一個初值表達式。由此可見,必須在聲明符號常量的同時為其賦初值。該語句也可以聲明多個符號常量。
系統執行符號常量聲明語句時,需要依次為每個符號常量分配存儲單元并賦初值。一個符號常量被聲明后,它的值就是聲明所賦予的初值,作為常量,這個值以后將始終保持不變,因為系統只允許讀取它的值,而不允許再次向它賦值。另外,在符號常量聲明語句中,若<類型名>為int,則int可省略。
符號常量聲明語句既可以出現在函數體外,也可以出現在函數體內,這一點也跟變量定義語句相同。
C+ +關鍵字中的true和false就是系統預先定義的兩個符號常量,它們的值分別為1和0。使用符號常量往往可以提高程序的可讀性和可維護性。由于符號常量和變量同樣要求系統為其分配內存單元,所以可以把符號變量視為一種不允許賦值改變的或只讀不寫的變量,稱其為const變量。
4使用#define命令定義符號常量
# define命令是一條預處理命令,也可以用它來定義符號常量。其命令格式為:
#define<符號常量名><字符序列>
<符號常量名>是用戶定義的標識符,又稱為宏或宏標識符;<字符序列>也是由用戶給定的用來代替宏的一串字符序列,也稱為宏替換體,它可以是數值常量、可計算值的表達式或字符串。宏被該命令定義后就可以使用在其后的程序中。當程序被編譯時將把所有地方使用的宏標識符替換為對應的字符序列,并把宏命令刪除掉。
2.4 運算符和表達式
1運算符和表達式的概念
C+ +語言中的運算符又稱為操作符,是用來對數據進行運算的符號。
C+ +語言中的運算符可以根據其運算分量個數的多少分為單目(或一元)運算符、雙目(或二元)運算符和三目(或三元)運算符3類。
運算符可能是一個字符,也可能由兩個或三個字符組成,還有一些運算符是C+ +關鍵字。
2運算類型與運算符
C+ +包含多種不同種類的運算。每一種運算與其他運算的區別在于以下3個方面:
(1)參加運算的運算分量的數量和類型;
(2)運算結果的數據類型;
(3)運算的具體操作。
3賦值運算
賦值運算是一種雙目運算,其形式為:
<變量名>=<表達式>
右運算分量為一個表達式!=”為賦值運算符(與數學中的等號含義不同)。左運算分量為與右運算分量類型相同的變量。
賦值運算的具體操作為:先計算右端表達式的值,然后把該值賦給左端變量。
4算術運算符和算術表達式
算術運算是指int型、float型、double(也包括char型)的數值類數據計算后,得到同一類型數據的運算。算術運算中所使用的運算符稱為算術運算符。
單目算術運算符包括:-(單減)、+ +(增量)和- -(減量)。
單減運算的格式為:-<運算分量>
單減運算相當于對運算分量取相反數,例如:-a,-(x+y)。
增量運算有兩種形式。
前綴增量:+ +<運算分量>
后綴增量:<運算分量>+ +
雙目算術運算符包括:+(加)、-(減)、*(乘)、/(除)和%(取余)。它們的含義與數學上相同。該類運算的運算分量為任一種數值類型,即任一種整數類型和任一種實數類型。
由算術運算符(包括單目和雙目)連接運算分量而組成的式子稱為算術表達式。每個算術表達式的值為一個數值,其類型按照以下規則確定:
(1)當參加運算的兩個運算分量均為整型時(但具體類型可以不同,如一個為int型,另一個為char型),則運算結果為int型。
(2)當參加運算的兩個運算分量中至少有一個是單精度型,并且另一個不是雙精度型時,則運算結果為float型。
(3)當參加運算的兩個運算分量中至少有一個是雙精度型時,則運算結果為雙精度型。
5關系運算符和關系表達式
C+ +語言提供了6種關系運算符,它們是:
<(小于)、< =(小于等于)、>(大于)、> =(大于等于)、= =(等于)、! =(不等于)
這6種運算符都是雙目運算符,用來比較兩個運算分量的大小,運算結果為邏輯型值true或false(它們分別對應著整數1和0。由一個關系運算符連接前后兩個數值表達式而構成的式子稱為關系表達式,簡稱關系式。當一個關系式成立時,則計算結果為邏輯值是(true),否則為邏輯值假(false)
關系運算符的使用格式為:
<運算分量><關系運算符><運算分量>
6邏輯運算符和邏輯表達式
C+ +語言提供了3種邏輯運算符,它們是:
!(邏輯非)、&&(邏輯與)、(邏輯或)
其中,!為單目運算符,&&和為雙目運算符。
邏輯運算符的使用格式為:
<邏輯運算符!><運算分量>
<運算分量><邏輯運算符&&或><運算分量>
邏輯運算的具體操作步驟為:
(1)計算兩邊運算分量的值;
(2)若運算分量的值不是邏輯型,則自動轉換為邏輯型,即以0值為假(即false),非0值為真(即true);
(3)按不同邏輯運算符計算返回值。
7位運算
C+ +提供6種位運算符。
(1)“&”是按位與運算符,它將兩個運算分量的對應二進制位進行與操作;校0 和0與得0,0和1與得0,1和0與得0,1和1與得1。
(2)“|”是按位或運算符,它將兩個運算分量的對應二進制位進行或操作。其中,0和0或得0,0和1或得1,1和0或得1,1和1或得1。
(3)“^”是按位異或運算符,它將兩個運算分量的對應二進制位進行異或操作。其中,0和0異或得0,0和1異或得1,1和0異或得1,1和1異或得0。
(4)“>>”是按位右移運算符,由于右移的位數為右邊運算分量的值,所以右邊運算分量的值必須是一個整數。
(5)“<<”是按位左移運算符,由于左移的位數為右邊運算分量的值,所以右邊運算分量的值必須是一個整數。
(6)“~”是按位取反運算符,它將運算分量的對應二進制數的每一位進行取反操作。其中,0取反得1,1取反得0。
位運算符的使用格式:
<運算分量><雙目運算符><運算分量>
<單目運算符><運算分量>
8.其他運算
(1)條件運算符
條件運算是C+ +中唯一的三目運算,與其對應的運算符?:稱為條件運算符。條件運算符的使用格式為:
<表達式1>?<表達式2>:<表達式3>
當計算有條件運算符構成的表達式時,首先計算<表達式1>,若其值非0,則計算出<表達式2>的值,并用這個值作為整個表達式的值;若<表達式1>的值為0,則計算出<表達式3>的值,并用這個值作為整個表達式的值。
(2)逗號運算符
C+ +中使用逗號運算符指明對多個表達式進行順序求值。逗號運算符的使用格式為:
<表達式1>,<表達式2>,……<表達式n>
其中,每個逗號都稱為逗號運算符,整個式子稱為逗號表達式。上述逗號表達式的求值步驟為:從左向右依次計算<表達式1>、<表達式2>…<表達式n>的值;將<表達式n>(即最右端的表達式)的值作為整個逗號表達式的值。
(3)sizeof運算符
使用運算符sizeof可以進行字長提取操作,因此sizeof運算符又稱為字長提取符,它的使用格式為:
sizeof(<運算分量>)
其中,sizeof為關鍵字;<運算分量>既可以是一個類型名,也可以是一個表達式,當作為<運算分量>的表達式只包含一個變量名時,圓括號()可以省略。
字長提取運算的結果為一個整數,該整數表示指定的類型或變量的字節長度,即在內存中占用的字節(Byte)數。
(4)圓括號運算符
C+ +中不僅將圓括號()歸為運算符,而且根據不同的使用方式,可以對圓括號運算符的功能作出以下3種不同的解釋:
、賵A括號用于函數調用。其格式為:
<函數名>(<實參表>)
、趫A括號用于強制類型轉換。其格式為:
(<類型名>)<表達式>
、蹐A括號用于類型構造。其格式為:
<類型名>(<表達式>)
類型構造是指使用圓括號中<表達式>的值來構造一個具有目標數據類型的值,要構造的目標數據類型由<類型名>指定。
、軘到M下標運算符:[](下標)。
、葜羔樳\算符:*(取地址)和&(值引用)。
⑥動態存儲分配運算符:new(分配)和delete(釋放)。
、咦饔糜蛳薅ㄟ\算符:::(類域或全局域)
9.優先級和結合性
根據運算符的優先級和結合性,可以將表達式的計算順序規則總結為以下3條:
(1)優先計算帶有括號的子表達式;
(2)在沒有括號的部分,依照運算符優先級,由高到低進行計算;
(3)具有相同優先級的運算符,按照結合性規定,依次進行計算。
C+ +運算符分成17個優先級,優先級數字越小,表示運算符優先級越高。具有同一優先級數字的運算符,優先級相同。單目運算符、賦值運算符和復合賦值運算符是右結合的,其余所有運算符都是左結合的。
編輯推薦:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內蒙古 |