C++基本數(shù)據(jù)類型_第1頁
C++基本數(shù)據(jù)類型_第2頁
C++基本數(shù)據(jù)類型_第3頁
C++基本數(shù)據(jù)類型_第4頁
C++基本數(shù)據(jù)類型_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++語言與面向?qū)ο蟮脑O(shè)計第3章C++的根本數(shù)據(jù)類型貴州大學(xué)計算機科學(xué)系數(shù)據(jù)類型是不同形式的信息在內(nèi)存中分配方式的根本約定,是構(gòu)造程序的根底。常量、變量甚至函數(shù)都具有各自己的數(shù)據(jù)類型。1五種根本數(shù)據(jù)類型整型〔說明符為int〕字符型〔說明符為char〕浮點型〔說明符為float〕雙精度型〔說明符為double〕空值型〔說明符為void〕3.1根本數(shù)據(jù)類型 除void類型外,其余四種根本類型的說明符之前還可以加上特定的修飾符形成擴展類型。整型和字符型前面可加上:signed〔有符號數(shù)〕或unsigned〔無符號數(shù)〕、long〔長型〕或short〔短型〕修飾,整型缺省為signed。當(dāng)整型前面有修飾符出現(xiàn)時,可省略關(guān)鍵字int。例如:long為長整型雙精度型前面可加上long來修飾。 float、double、longdouble統(tǒng)稱為浮點類型〔實型〕。

注意char和int比較: char型和int型有時可理解為同一類,但又不能完全一樣?2用修飾符形成的擴展類型答:因為字符在內(nèi)存中是以ASCII碼的形式存儲的,而ASCII碼值為整數(shù)〔一致〕,不一直在于所占的字節(jié)數(shù)。類型名字寬(字節(jié))范圍short[int]2–32768~32767signedshort[int]2–32768~32767unsignedshort[int]20~65535int4–2147483648~2147483647signed[int]4–2147483648~2147483647unsigned[int]40~4294967295long[int]4–2147483648~2147483647signedlong[int]4–2147483648~2147483647unsignedlong[int]40~4294967295char1–128~127signedchar1–128~127unsignedchar10~255float43.4E-38~3.4E+38(約7位有效數(shù)字)double81.7E-308~1.7E+308(約15位有效數(shù)字)longdouble103.4E-4932~1.1E+4932(約19位有效數(shù)字)void0無值表3.132位機上各根本類型的字寬及表示范圍3.2常量同C++中其它數(shù)據(jù)一樣,常量也具有一定的數(shù)據(jù)類型。常量的類型是由其書寫形式?jīng)Q定。例如,45.28是浮點類型,370是整型,‘p’是字符型等。3.2.1整型常量 除十進制外,整型常量還可以用八進制、十六進制來表示。

十進制整型常量沒有前綴,且不能以0打頭。如:12八進制整型常量必須以0打頭,其后由0~7之間的數(shù)字組成。如012、0375等。

十六進制整型常量以0x或0X打頭,其后由0~9之間的數(shù)字和英文字母A~Z〔或a~z〕組成。如0x32、0xA8等。 整型常量的后面可加上后綴,以區(qū)分各種不同類型的整數(shù)。具體如下: 后綴為L〔或l〕,表示該常量為長整數(shù)〔longint型〕,如8739L、-584l; 后綴為U〔或u〕,表示該整型常量為無符號整數(shù)〔unsignedint型〕,如85U、20u; 后綴為L〔或l〕和U〔或u〕的組合,表示該常量為無符號長整數(shù)〔unsignedlongint型〕如6397LU、765Lu、4325lU、07656lu〔無符號八進制長整數(shù)7656〕等。如果整型常量的后面沒有修飾符,C++編譯器會將其類型解釋為能存儲該數(shù)的最小整型。3.2.2浮點常量浮點常量可以采用小數(shù)法和科學(xué)記數(shù)法表示??茖W(xué)記數(shù)法常用于表示很大或很小的浮點數(shù)。如1.2E8〔即1.2×108〕、-5.7356E-9〔即-5.7356×10-9〕。浮點常量的整數(shù)局部和小數(shù)局部如果為零可以省去,但不可兩者都省去。例如.34456.5.E3.89E2都是合法的數(shù)據(jù)。浮點常量可帶后綴,以區(qū)分各種不同類型的實數(shù)。沒有后綴,表示該浮點常量為雙精度數(shù)〔double型〕,如75.23;后綴為F〔或f〕,表示該浮點常量為浮點數(shù)〔float型〕,如4.233F、-12.9f;后綴為L〔或l〕,表示該浮點常量為長雙精度數(shù)〔longdouble型〕,如8.5l、2.07L。字符常量用引號括起來的單個字符稱為字符常量。例如‘Y’、‘y’、‘6’、‘#’、‘’(空格)等。注意:其中的'Y'和'y'是兩個不同的字符常量。轉(zhuǎn)義序列〔escapesequences〕除了可顯示字符之外,還有一些不可顯示字符,用于產(chǎn)生某種控制操作,例如換行符、響鈴符等?!D(zhuǎn)義序列來表示。轉(zhuǎn)義序列有兩種形式。一,轉(zhuǎn)義字符,由一個反斜杠后跟一個字符來表示。二,是用一個反斜杠加上該字符的ASCII碼來構(gòu)成。其中字符的ASCII碼可采用三位八進制數(shù)〔形如\ddd〕或兩位十六進制數(shù)〔形如\xhh〕。例如,換行符的ASCII碼為10〔八進制為12,十六進制為0A〕,那么可表示為'\012'或'\x0A';轉(zhuǎn)義字符含義\a響鈴\n換行符\r回車符\t水平制表符(tab鍵)\v垂直制表符\b退格符(backspace鍵)\\反斜線\'單引號\"雙引號\?問號\f進頁符(走紙)\0空字符(null)表3.2C++預(yù)定義的常用轉(zhuǎn)義字符

3.2.4字符串常量字符串常量是用雙引號括起來的字符序列。例如:"Howareyou.""請輸入兩個整數(shù):"需要注意的是:雙引號:是字符串的定界符,因此字符串本身所包含的雙引號應(yīng)該用其轉(zhuǎn)義字符\"來表示。例如下面的語句:cout<<"\"Y\"or\"N\""<<endl;產(chǎn)生的輸出為?:反斜杠加字符的ASCII碼來表示的轉(zhuǎn)義序列:C++將按最長有效長度對轉(zhuǎn)義序列進行解釋。例如,語句 cout<<"x\x34y"<<endl;中,由于'\x34'是字符'4'的轉(zhuǎn)義序列,得到的輸出為:x4y〔書上有誤〕

"Y"or"N"字符常量可用字符型變量來存放,在內(nèi)存中只占一個字節(jié);字符串常量是用一維字符數(shù)組來存放,在內(nèi)存中占多個字節(jié)。每個字符串除給定的字符序列外,都有一個結(jié)束符'\0'〔即ASCII碼為0的“空字符”〕。A(a)'A'的存儲形式B\0(b)"A"的存儲形式ABC\0(c)"ABC"的存儲形式圖3.1字符常量與字符串常量的存儲形式

符號常量常量除可以直接以其字面形式來表示〔如3.14159〕外,還可以用一個標(biāo)識符來代替,用來代替常量的標(biāo)識符稱為符號常量。符號常量定義格式:1.用define定義:例:#definePI3.142.用const定義:const數(shù)據(jù)類型常量標(biāo)識符=常量表達式; const數(shù)據(jù)類型常量標(biāo)識符〔常量表達式〕;例如,下面這句constfloatpi=3.14159;或constfloatpi(3.14159);符號常量實際上是只讀變量,由保存字const規(guī)定了它的值在程序中不能被改變。例如,下面的語句是非法的:constintx=10;……x=20;//非法3.3變量 變量是盛數(shù)的容器。 計算機中的變量是內(nèi)存物理存儲單元的抽象。

計算機變量的概念涉及以下四個方面:

變量名 變量類型 變量存儲地址 變量的值變量的定義在C++中,變量必須先定義、后使用。

例如,語句 intx,y; charch;聲明了兩個整型變量x、y,一個字符型變量ch。有關(guān)變量的重要概念:變量的類型——變量的長度〔字節(jié)數(shù)〕變量存儲地址變量名〔存儲單元首地址的映射〕變量的值——存儲單元中的內(nèi)容。xych20002004200810變量可以在定義時初始化,給變量賦一個初值。例如:

inta=3,b=-78;doublearea=67.34;上述變量聲明語句的執(zhí)行可以分解為兩個底層操作:

實例化+初始化C++提供另一種形式的初始化方法。例如,上面兩個語句可改寫為:

inta(3),b(-78);doublearea(67.34);

3.3.2變量的賦值變量值的改變通過賦值運算來完成?!?”是賦值運算符,它的左邊只能是變量標(biāo)識符,右邊可以是常量、變量或表達式等。例如,對于已聲明為int型的變量x,語句x=3+2*5;將表達式3+2*5的值13賦給x,即填入x的存儲區(qū)域中。

值得注意的是,賦值運算符是從右到左結(jié)合的。例如表達式x=y=5;相當(dāng)于y=5;x=y;3.4指針變量3.4.1指針的概念1.指針:即變量的內(nèi)存地址。2.指針變量指針變量是一種特殊的變量:它存放的不是數(shù)據(jù)的值,而是另一個變量的地址。指針變量常常直接簡稱為指針。

指針的類型就是它所指向的那個變量的類型,有時也稱為指針的基類型。指針本身通常是存放器變量,但也可以是存儲器變量。當(dāng)指針為存儲器變量時,編譯器也會為它分配一個內(nèi)存單元。這時指針也有自己的存儲地址。存放指針地址的變量稱為指針的指針。6AF31204x_ptrx39.4986AF312047B016582圖3.3指針與它所指向的變量……

指針的指針〔1〕.指針的定義和初始化指針同一般變量一樣,在使用之前必須先定義。定義時要指明指針的類型,并在指針名前加類型修飾符*。定義指針的聲明語句格式如下:類型*指針名;或者類型*指針名;其中,*是一個指針類型修飾符,不是變量名的一局部。例如:int*x_ptr;或者int*x_ptr; 定義了一個指向int型變量的指針x_ptr;而char*c_ptr;或者char*c_ptr; 定義了一個指向char型變量的指針c_ptr。需要注意的是,語句int*x,y;不是定義了兩個int型指針x和y,而是定義了一個int型指針x和一個int型變量y。從防止混淆的角度看,用另一種格式int*x,y;更為適宜。

一個指針在定義以后,并不具體地指向某個變量,而只是確定了類型??梢詫χ羔樳M行初始化,讓它指向某個具體的變量。

“&”是取地址運算符,用在一個存儲器操作數(shù)的前面,表示取存儲器操作數(shù)的地址值。例如:

floatsalary;float*salary_ptr=&salary;就將指針salary_ptr初始化為變量salary的地址值,也即指向了具體的salary。salary_ptrsalary圖3.4變量salary和指向salary的指針

〔2〕指針的賦值和引用

除了在指針定義時對它進行初始化外,還可以使用賦值運算來給指針賦以變量的地址值。例如:inta=-8978;int*p;p=&a;這里,p被賦值為變量a的地址。也可以將一個已被賦值的指針賦給另一個相同類型的指針。例如:doublea;double*x=&a,*y;y=x;這樣一來,y就與x指向同一個變量a。注意:只有同類型的指針才能相互賦值。例如,假定有intcount=78;floatallowance=3.45E+2;int*c_ptr;float*a_ptr;那么c_ptr=&count;//合法a_ptr=&allowance;//合法c_ptr=&allowance;//非法a_ptr=&count;//非法c_ptr=a_ptr;//非法a_ptr=c_ptr;//非法空指針:

空指針是值為零的指針。 許多C++系統(tǒng)的函數(shù)庫(如iostream.h、string.h)中都將空指針定義為名字NULL。除了“&”之外,C++還有一個關(guān)于指針的運算符“*”?!?”是取內(nèi)容運算符,用在指針變量的前面,表示取指針?biāo)赶虻拇鎯卧闹怠@?,假設(shè)有inta=90;int*a_ptr=&a;intx;那么x=*a_ptr;將把a_ptr所指的存儲區(qū)域的內(nèi)容,即變量a的值賦給x,那么變量x值為90。而*a_ptr=98;將98填入a_ptr所指的存儲區(qū)域,即a的值被填為98。同理*a_ptr=*a_ptr+1;將a_ptr所指的存儲區(qū)域的值加1,即a的值被加了1,與語句a=a+1;的效果一樣。應(yīng)當(dāng)注意,指針變量的聲明語句int*a_ptr=&a;與賦值語句*a_ptr=98;中的“*”的含義是不同的。聲明語句中的:“*”是指針類型修飾符,用來說明a_ptr是指針變量;賦值語句中的“*”是取內(nèi)容運算符,用來取指針變量的內(nèi)容。二者不可混淆。而且,C++的乘法運算符也是“*”,與前面兩者的含義也不相同。例3.2一個關(guān)于指針的例子。

#include<iostream.h>voidmain(){intx=50;int*x_ptr=&x;//x_ptr指向xcout<<"x="<<x<<endl;//輸出x的值cout<<"*x_ptr="<<*x_ptr<<endl; //輸出x_ptr所指單元的值cout<<"x_ptr="<<x_ptr<<endl; //輸出x_ptr的值*x_ptr=100;cout<<"x="<<x<<endl;cout<<"*x_ptr="<<*x_ptr<<endl;cout<<"x_ptr="<<x_ptr<<endl;}程序的輸出為:x=50*x_ptr=50x_ptr=0x0065FDF4x=100*x_ptr=100*x_ptr=0x0065FDF4#include<iostream.h>//例:給出程序的運行結(jié)果voidmain(){

inta;

int*aPtr;a=24; aPtr=&a;

cout<<"Theaddressofais"<<&a<<endl;cout<<"ThevalueofaPtris"<<aPtr<<endl; cout<<"Thevalueofais"<<a<<endl;cout<<"Thevalueof*aPtris"<<*aPtr<<endl<<endl; cout<<"&*aPtr="<<&*aPtr<<endl;cout<<"*&aPtr="<<*&aPtr<<endl; cout<<"*aPtr="<<&aPtr<<endl;}Thevalueofais24Thevalueof*aPtris24&*aPtr=0063FE00*&aPtr=0063FE00Theaddressofais0063FE00ThevalueofaPtris0063FE00&aPtr=0065FDF424…0063FE00……0063FE00aPtra0065FDF43.4.2指針運算除了前面介紹的“&”、“*”運算和賦值運算外,指針只能進行兩種運算。一種是與整數(shù)相加或相減,另一種是在一定條件下,比方兩個指針都指向同一個數(shù)組時,兩個指針可以相減或相比較。關(guān)于后一種情況,將在下一節(jié)介紹數(shù)組時討論。指針與整數(shù)進行的加、減運算,代表著指針在內(nèi)存空間上、下移動。具體上移或下移的字節(jié)數(shù)與其類型密切相關(guān)。例如,假設(shè)在某字長為32的計算機中,一個int型數(shù)據(jù)占4個字節(jié),如果有inta=78;int*x=&a;x初始化為指向變量a。在語句x=x+1;執(zhí)行后,x中存放的地址值被加了4,指向變量a下面一個整數(shù)。同理,語句

x=x–1;執(zhí)行后,x指向了上一個整數(shù)。其它類型的指針也一樣。假定一個double型數(shù)據(jù)占8個字節(jié),指針ptr已聲明為double型變量,那么語句

ptr=ptr+2;執(zhí)行以后,ptr中存放的值被加了16,ptr指向了原來所指數(shù)據(jù)之后的第二個數(shù)據(jù)。 在將指針加1或減1時,也可以使用C++的增1運算符++和減1運算符––。它們分別表示把變量的值加1和減1。 增1運算符〔或減1〕運算符的前綴形式和后綴形式的區(qū)別。 以增1運算符為例,后綴++是先取變量的值然后再將變量的值加1;前綴++是先將變量的值加1然后再取變量的值。所以有: intx=7,y=3,z; z=x++;//執(zhí)行后,z=7,x=8 z=++y;//執(zhí)行后,z=4,y=4 使用C++的增〔減〕1運算符,涉及與指針有關(guān)的操作時,應(yīng)注意加減是發(fā)生在地址上還是發(fā)生在內(nèi)容上。 例如:int*P;p++;//相當(dāng)于p=p+1;地址加1,P指向下一個整型數(shù)據(jù);而*p++;//相當(dāng)于*p=*p+1;內(nèi)容加1。 當(dāng)++或––與*同時作用于指針時,同樣應(yīng)該注意運算的順序。 例如:x=*p++;相當(dāng)于x=*(p++);即先從當(dāng)前地址中取值,然后將指針指向下一個數(shù)據(jù)。 又如:x=*++p;相當(dāng)于x=*(++p);

先將地址加1,再取地址中的數(shù)據(jù)賦給x。 而x=++*p;

相當(dāng)于x=++(*p);

表示先取p所指向的單元內(nèi)的數(shù)據(jù)值,再將數(shù)據(jù)值加1后賦給x。#include<iostream.h>//例:給出程序的運行結(jié)果voidmain(){ inta[3]={24,30,8};

int*p; p=a; intx; x=*p++; cout<<x<<","<<*p<<endl; x=*++p; cout<<x<<","<<*p<<endl; x=++*p; cout<<x<<","<<*p<<endl;}24,308,89,93.5類型轉(zhuǎn)換類型轉(zhuǎn)換分為兩種,一種是隱式轉(zhuǎn)換,一種是強制轉(zhuǎn)換。3.5.1隱式轉(zhuǎn)換這是一種由系統(tǒng)自動進行的類型轉(zhuǎn)換。⑴對于賦值運算,當(dāng)賦值運算符“=”左、右兩邊的操作數(shù)為不同類型時,總是將右邊表達式的類型轉(zhuǎn)換為左邊變量的類型,然后再賦給左邊的變量。例如,對于以下語句:inta=89;doubleb=3.5;a=b;cout<<"a="<<a<<"b="<<b<<"\n";編譯器先將b的值轉(zhuǎn)換為int型,再賦值給a。但b的值在轉(zhuǎn)換為int型時小數(shù)局部將丟掉,因此將導(dǎo)致警告信息。以上程序段的輸出為:a=3b=3.5類型轉(zhuǎn)換并不改變b本身的類型,b仍然為double型。例3.3分析下面程序的運行結(jié)果。

#include<iostream.h>voidmain(){intx; charch='a';//字符'a'的ASCII碼為97x=ch+200; cout<<"x="<<x<<"\n";cout<<"ch="<<ch<<"\n";cout<<"ch+200="<<ch+200<<"\n";}

⑵short型、signedshort型、和所有的char型的數(shù)據(jù)在運算前將無條件轉(zhuǎn)換成int型的數(shù)據(jù)。例3.3中,在做加法時,ch先被轉(zhuǎn)換成int型數(shù)據(jù)97,再與200相加。此程序的輸出為:

x=297ch=ach+200=297例3.4分析下面程序的運行結(jié)果。#include<iostream.h>voidmain(){charstring[]="hello";char*p=string;cout<<string<<endl;cout<<p<<endl;cout<<*p<<*(p+1)<<*(p+2)<<*(p+3)<<*(p+4)<<endl;cout<<*p<<*p+1<<*p+2<<*p+3<<*p+4<<endl;}程序的輸出為:hellohellohello在最后一個輸出語句中,*p的值是字符'h',但在作加法之前將會先轉(zhuǎn)換為int型,即字符'h'的ASCII碼104,因此*p+1的值為105,依此類推。//特例:指針指向字符串首地址時的輸出⑶除以上⑴、⑵種情況外,如果一個二元運算符左、右兩邊的操作數(shù)的類型不同,那么將值域〔即取執(zhí)范圍〕較小的類型向值域較大的類型轉(zhuǎn)換。值域較小者稱為低類型,值域較大者稱為高類型。運算結(jié)果的類型同高類型一樣。類型按由高到低的順序依此是:int、unsigned、long、unsignedlong、float、double、longdouble例如,下面程序段intx=5; doubley=89.6;cout<<"x+y="<<x+y<<"\n";中,二元運算符+號左邊的int型的x將先被轉(zhuǎn)換為double型的值,再與右邊的double型的y相加。程序段的輸出是:x+y=94.6⑷在函數(shù)調(diào)用時,實參總是先轉(zhuǎn)換成形參的類型;在函數(shù)有返回執(zhí)值的調(diào)用中,假設(shè)return后面的表達式的類型與該函數(shù)的類型不一致,那么總是將此表達式強制轉(zhuǎn)換為函數(shù)的類型。需要指出的是,由于隱式轉(zhuǎn)換是由編譯器完成的,在程序中反映不出來,有時侯喪失數(shù)據(jù)也不易覺察,因此應(yīng)盡量防止隱式轉(zhuǎn)換。在需要用不同類型的數(shù)據(jù)進行混合運算時,最好使用強制轉(zhuǎn)換。隱式轉(zhuǎn)換舉例如果有inti,j;charch;floata,b;doublex,y;longdoublew;那么有:表達式表達式的類型i+a*bx*(b/j+i)ch+ix=ch+i(x+y+j)–w/xch+'a'floatdoubleintdoublelongdoubleint3.5.2強制轉(zhuǎn)換強制轉(zhuǎn)換是指在程序中將某種類型的數(shù)據(jù)強制性地轉(zhuǎn)換為另一類型,而不必遵循隱式轉(zhuǎn)換中的規(guī)那么。強制類型轉(zhuǎn)換的形式有如下兩種:類型名(表達式)或者(類型名)表達式例如:(float)i或float(i)將把變量i轉(zhuǎn)換成float型。強制轉(zhuǎn)換舉例假設(shè)同前面一樣,有inti,j;charch;floata,b;doublex,y;longdoublew;那么有:表達式表達式的類型(int)(a+w)(int)a+w+b(double)ch–ij*(float)x/y這里需要注意的是,表達式(int)a+w是將a的值轉(zhuǎn)換為int型后與w相加,而(int)(a+w)是將表達式a+w的值轉(zhuǎn)換成int型。intlongdoubledoubledouble3.5.3類型轉(zhuǎn)換時要注意的問題在進行類型轉(zhuǎn)換時一定要特別小心,否那么可能會出現(xiàn)預(yù)料之外的結(jié)果,比方以下幾種情況:⑴高類型轉(zhuǎn)換為低類型時。這時數(shù)據(jù)的精度要受到損失,是不平安的轉(zhuǎn)換。請看下例例3.5工資在原有根底

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論