C++編程中的數(shù)據(jù)類型和常量學(xué)習(xí)教程
C++數(shù)據(jù)類型
計(jì)算機(jī)處理的對(duì)象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的(例如整數(shù)、浮點(diǎn)數(shù)、字符等形式)。不同的數(shù)據(jù)之間往往還存在某些聯(lián)系(例如由若干個(gè)整數(shù)組成一個(gè)整數(shù)數(shù)組)。數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式。例如,數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu)。不同的計(jì)算機(jī)語言所允許使用的數(shù)據(jù)結(jié)構(gòu)是不同的。處理同一類問題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會(huì)不同。例如,對(duì)10個(gè)整數(shù)排序和對(duì)包含10個(gè)元素的整型數(shù)組排序的算法是不同的。
C++的數(shù)據(jù)包括常量與變量,常量與變量都具有類型。由以上這些數(shù)據(jù)類型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。例如利用指針和結(jié)構(gòu)體類型可以構(gòu)成表、樹、棧等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。
C++并沒有統(tǒng)一規(guī)定各類數(shù)據(jù)的精度、數(shù)值范圍和在內(nèi)存中所占的字節(jié)數(shù),各C++編譯系統(tǒng)根據(jù)自己的情況作出安排。表2.1列出了Visual C++數(shù)值型和字符型數(shù)據(jù)的情況。
幾點(diǎn)說明:
1) 整型數(shù)據(jù)分為長(zhǎng)整型(long int)、一般整型(int)和短整型(short int)。在int前面加long和short分別表示長(zhǎng)整型和短整型。
2) 整型數(shù)據(jù)的存儲(chǔ)方式為按二進(jìn)制數(shù)形式存儲(chǔ),例如十進(jìn)制整數(shù)85的二進(jìn)制形式為1010101,則在內(nèi)存中的存儲(chǔ)形式如下圖所示。
3) 在整型符號(hào)int和字符型符號(hào)char的前面,可以加修飾符signed(表示“有符號(hào)”)或unsigned(表示“無符號(hào)”)。如果指定為signed,則數(shù)值以補(bǔ)碼形式存放,存儲(chǔ)單元中的最高位(bit)用來表示數(shù)值的符號(hào)。如果指定為unsigned,則數(shù)值沒有符號(hào),全部二進(jìn)制位都用來表示數(shù)值本身。例如短整型數(shù)據(jù)占兩個(gè)字節(jié) ,
有符號(hào)時(shí),能存儲(chǔ)的最大值為215-1,即32767,最小值為-32768。無符號(hào)時(shí),能存儲(chǔ)的最大值為216-1,即65535,最小值為0。有些數(shù)據(jù)是沒有負(fù)值的,可以使用unsigned,它存儲(chǔ)正數(shù)的范圍比用signed時(shí)要大一倍。
4) 浮點(diǎn)型(又稱實(shí)型)數(shù)據(jù)分為單精度(float)、雙精度(double)和長(zhǎng)雙精度(long double)3種,在Visual C++ 6.0中,對(duì)float提供6位有效數(shù)字,對(duì)double提供15位有效數(shù)字,并且float和double的數(shù)值范圍不同。對(duì)float分配4個(gè)字節(jié),對(duì)double和long double分配8個(gè)字節(jié)。
5) 表中類型標(biāo)識(shí)符一欄中,方括號(hào)[ ]包含的部分可以省寫,如short和short int等效,unsigned int和unsigned等效。
常量的值是不能改變的,一般從其字面形式即可判別是否為常量。常量包括兩大類,即數(shù)值型常量(即常數(shù))和字符型常量。如12, 0, -3為整型常量,4.6, -1.23為實(shí)型常量,包含在兩個(gè)單撇號(hào)之間的字符為字符常量,如′a′, ′x′。這種從字面形式即可識(shí)別的常量稱為“字面常量”或“直接常量”。
C++常量(C++數(shù)值常量、字符串常量、符號(hào)常量)
數(shù)值常量
數(shù)值常量就是通常所說的常數(shù)。在C++中,數(shù)值常量是區(qū)分類型的,從字面形式即可識(shí)別其類型。
整型常量(整數(shù))的類型
在上一節(jié)中已知道:整型數(shù)據(jù)可分為int, short int,long int以及unsigned int, unsigned short, unsigned long等類別。整型常量也分為以上類別。為什么將數(shù)值常量區(qū)分為不同的類別呢?因?yàn)樵谶M(jìn)行賦值或函數(shù)的參數(shù)虛實(shí)結(jié)合時(shí)要求數(shù)據(jù)類型匹配。
那么,一個(gè)整型常量怎樣從字面上區(qū)分為以上的類別呢?
一個(gè)整數(shù),如果其值在-32768~+32767范圍內(nèi),認(rèn)為它是short int型,它可以賦值給short int型?int型和long int型變量。
一個(gè)整數(shù),如果其值超過了上述范圍,而在-2147483648~+2147483647范圍內(nèi),則認(rèn)為它是long int型,可以將它賦值給一個(gè)int或long int型變量。
如果某一計(jì)算機(jī)系統(tǒng)的C++版本(例如Visual C++)確定int與long int型數(shù)據(jù)在內(nèi)存中占據(jù)的長(zhǎng)度相同,則它們能夠表示的數(shù)值的范圍相同。因此,一個(gè)int型的常量也同時(shí)是一個(gè)long int型常量,可以賦給int型或long int型變量。
常量無unsigned型。但一個(gè)非負(fù)值的整數(shù)可以賦值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可。
一個(gè)整型常量可以用3種不同的方式表示:
十進(jìn)制整數(shù)。如1357, -432, 0等。在一個(gè)整型常量后面加一個(gè)字母l或L,則認(rèn)為是long int型常量。例如123L, 421L, 0L等,這往往用于函數(shù)調(diào)用中。如果函數(shù)的形參為long int,則要求實(shí)參也為long int型,此時(shí)用123作實(shí)參不行,而要用123L作實(shí)參。
八進(jìn)制整數(shù)。在常數(shù)的開頭加一個(gè)數(shù)字0,就表示這是以八進(jìn)制數(shù)形式表示的常數(shù)。如020表示這是八進(jìn)制數(shù)20,即(20)8,它相當(dāng)于十進(jìn)制數(shù)16。
十六進(jìn)制整數(shù)。在常數(shù)的開頭加一個(gè)數(shù)字0和一個(gè)英文字母X(或x),就表示這是以十六進(jìn)制數(shù)形式表示的常數(shù)。如0X20表示這是十六進(jìn)制數(shù)20,即(20)16,它相當(dāng)于十進(jìn)制數(shù)32。
浮點(diǎn)數(shù)的表示方法
一個(gè)浮點(diǎn)數(shù)可以用兩種不同的方式表示:
1) 十進(jìn)制小數(shù)形式。如21.456, -7.98等。它一般由整數(shù)部分和小數(shù)部分組成,可以省略其中之一(如78.或.06, .0),但不能二者皆省略。C++編譯系統(tǒng)把用這種形式表示的浮點(diǎn)數(shù)一律按雙精度常量處理,在內(nèi)存中占8個(gè)字節(jié)。如果在實(shí)數(shù)的數(shù)字之后加字母F或f,表示此數(shù)為單精度浮點(diǎn)數(shù),如1234F, -43f,占4個(gè)字節(jié)。如果加字母L或l,表示此數(shù)為長(zhǎng)雙精度數(shù)(long double),在GCC中占12個(gè)字節(jié),在Visual C++ 6.0中占8個(gè)字節(jié)。
2) 指數(shù)形式(即浮點(diǎn)形式)。一個(gè)浮點(diǎn)數(shù)可以寫成指數(shù)形式,如3.14159可以表示為0.314159×101, 3.14159×100, 31.4159×10-1, 314.159×10-2等形式。在程序中應(yīng)表示為:0.314159e1, 3.14159e0, 31.4159e-1, 314.159e-2,用字母e表示其后的數(shù)是以10為底的冪,如e12表示1012。其一般形式為:
數(shù)符 數(shù)字部分 指數(shù)部分
上面各數(shù)據(jù)中的0.314159, 3.14159, 31.4159, 314.159 等就是其中的數(shù)字部分??梢钥吹剑河捎谥笖?shù)部分的存在,使得同一個(gè)浮點(diǎn)數(shù)可以用不同的指數(shù)形式來表示,數(shù)字部分中小數(shù)點(diǎn)的位置是浮動(dòng)的。例如:
a=0.314159e1; a=3.14159e0; a=31.4159e-1; a=314.159e-2;
以上4個(gè)賦值語句中,用了不同形式的浮點(diǎn)數(shù),但其作用是相同的。
在程序中不論把浮點(diǎn)數(shù)寫成小數(shù)形式還是指數(shù)形式,在內(nèi)存中都是以指數(shù)形式(即浮點(diǎn)形式)存儲(chǔ)的。例如不論在程序中寫成314.159或314.159e0, 31.4159e1, 3.14159e2, 0.314159e3等形式,在內(nèi)存中都是以規(guī)范化的指數(shù)形式存放,
數(shù)字部分必須小于1,同時(shí),小數(shù)點(diǎn)后面第一個(gè)數(shù)字必須是一個(gè)非0數(shù)字,例如不能是0.0314159。因此314.159和314.159e0, 31.4159e1, 3.14159e2, 0.314159e3在內(nèi)存中表示成0.314159×103。存儲(chǔ)單元分為兩部分,一部分用來存放數(shù)字部分,一部分用來存放指數(shù)部分。為便于理解,在圖2.3中是用十進(jìn)制表示的,實(shí)際上在存儲(chǔ)單元中是用二進(jìn)制數(shù)來表示小數(shù)部分,用2的冪次來表示指數(shù)部分的。
對(duì)于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理。
字符常量
1) 普通的字符常量
用單撇號(hào)括起來的一個(gè)字符就是字符型常量。如'a', '#', '%', 'D'都是合法的字符常量,在內(nèi)存中占一個(gè)字節(jié)。注意:
字符常量只能包括一個(gè)字符,如'AB' 是不合法的。
字符常量區(qū)分大小寫字母,如'A'和'a'是兩個(gè)不同的字符常量。
撇號(hào)(')是定界符,而不屬于字符常量的一部分。如cout<<'a';輸出的是一個(gè)字母"a",而不是3個(gè)字符"'a' "。
2) 轉(zhuǎn)義字符常量
除了以上形式的字符常量外,C++還允許用一種特殊形式的字符常量,就是以 "\"開頭的字符序列。例如,'\n'代表一個(gè)"換行"符。"cout<<'\n'; " 將輸出一個(gè)換行,其作用與"cout<<endl; " 相同。這種"控制字符",在屏幕上是不能顯示的。在程序中也無法用一個(gè)一般形式的字符表示,只能采用特殊形式來表示。
3) 字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式及其使用方法
將一個(gè)字符常量存放到內(nèi)存單元時(shí),實(shí)際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符相應(yīng)的ASCII代碼放到存儲(chǔ)單元中。如果字符變量c1的值為'a',c2的值為'b',則在變量中存放的是'a'的ASCII碼97,'b' 的ASCII碼98,如圖2.4(a)所示,實(shí)際上在內(nèi)存中是以二進(jìn)制形式存放的,
既然字符數(shù)據(jù)是以ASCII碼存儲(chǔ)的,它的存儲(chǔ)形式就與整數(shù)的存儲(chǔ)形式類似。這樣,在C++中字符型數(shù)據(jù)和整型數(shù)據(jù)之間就可以通用。一個(gè)字符數(shù)據(jù)可以賦給一個(gè)整型變量,反之,一個(gè)整型數(shù)據(jù)也可以賦給一個(gè)字符變量。也可以對(duì)字符數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,此時(shí)相當(dāng)于對(duì)它們的ASCII碼進(jìn)行算術(shù)運(yùn)算。
【例】將字符賦給整型變量。
#include <iostream> using namespace std; int main( ) { int i, j; //i和j是整型變量 i='A'; //將一個(gè)字符常量賦給整型變量i j='B'; //將一個(gè)字符常量賦給整型變量j cout<<i<<' '<<j<<'\n'; //輸出整型變量i和j的值,'\n' 是換行符 return 0; }
執(zhí)行時(shí)輸出
65 66
i和j被指定為整型變量。但在第5和第6行中,將字符'A'和'B'分別賦給i和j,它的作用相當(dāng)于以下兩個(gè)賦值語句:
i=65;j=66;
因?yàn)?A'和'B'的ASCII碼為65和66。在程序的第5和第6行是把65和66直接存放到i和j的內(nèi)存單元中。因此輸出65和66。
可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的。但是應(yīng)注意字符數(shù)據(jù)只占一個(gè)字節(jié),它只能存放0~255范圍內(nèi)的整數(shù)。
【例】字符數(shù)據(jù)與整數(shù)進(jìn)行算術(shù)運(yùn)算。下面程序的作用是將小寫字母轉(zhuǎn)換為大寫字母。
#include <iostream> using namespace std; int main( ) { char c1,c2; c1='a'; c2='b'; c1=c1-32; c2=c2-32; cout<<c1<<' '<<c2<<endl; return 0; }
運(yùn)行結(jié)果為
A B
'a'的ASCII碼為97,而'A'的ASCII碼為65,'b'為98,'B'為66。從ASCII代碼表中可以看到每一個(gè)小寫字母比它相應(yīng)的大寫字母的ASCII代碼大32。C++符數(shù)據(jù)與數(shù)值直接進(jìn)行算術(shù)運(yùn)算,'a'-32得到整數(shù)65,'b'-32得到整數(shù)66。將65和66存放在c1,c2中,由于c1,c2是字符變量,因此用cout輸出c1,c2時(shí),得到字符A和B(A的ASCII碼為65,B的ASCII碼為66)。
字符串常量
用雙撇號(hào)括起來的部分就是字符串常量,如"abc","Hello!","a+b","Li ping"都是字符串常量。字符串常量"abc"在內(nèi)存中占4個(gè)字節(jié)(而不是3個(gè)字節(jié)),見圖。
編譯系統(tǒng)會(huì)在字符串最后自動(dòng)加一個(gè)'\0'作為字符串結(jié)束標(biāo)志。但'\0'并不是字符串的一部分,它只作為字符串的結(jié)束標(biāo)志。如
cout<<"abc"<<endl;
輸出3個(gè)字符abc,而不包括'\0'。
注意: "a"和'a'代表不同的含義,"a"是字符串常量,'a' 是字符常量。前者占兩個(gè)字節(jié),后者占1個(gè)字節(jié)。請(qǐng)分析下面的程序片段:
char c; //定義一個(gè)字符變量 c='a'; //正確 c="a"; //錯(cuò)誤,c只能容納一個(gè)字符
請(qǐng)思考:字符串常量"abc\n"包含幾個(gè)字符?不是5個(gè)而是4個(gè)字符,其中"\n"是一個(gè)轉(zhuǎn)義字符。但它在內(nèi)存中占5個(gè)字節(jié)(包括一個(gè)"\0"字符) 。編譯系統(tǒng)遇到"\"時(shí)就會(huì)把它認(rèn)作轉(zhuǎn)義字符的標(biāo)志,把它和其后的字符一起作為一個(gè)轉(zhuǎn)義字符。
如果"\"后面的字符不能與"\"組成一個(gè)合法的轉(zhuǎn)義字符(如"\c"),則在編譯時(shí)顯示出錯(cuò)信息。如果希望將"\"字符也作為字符串中的一個(gè)字符,則應(yīng)寫為"abc\\n",此時(shí)字符包括5個(gè)字符,即a,b,c,\,n。如果有以下輸出語句:
cout<<"abc\\\n"<<endl;
則會(huì)輸出:
abc\ (然后換行)
同理執(zhí)行
cout<<"I say \"Thank you!\"\n";
的輸出是:
I say "Thank you!"
如果在一個(gè)字符串中最后一個(gè)字符為"\",則表示它是續(xù)行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格。如
cout<<"We must study C\ //本行最后的"\"后面的空格和換行均不起作用 ++ hard!"; //本行的字符緊連在上一行最后的"\"前面字符之后
則輸出:
We must study C++ hard!
符號(hào)常量
為了編程和閱讀的方便,在C++程序設(shè)計(jì)中,常用一個(gè)符號(hào)名代表一個(gè)常量,稱為符號(hào)常量,即以標(biāo)識(shí)符形式出現(xiàn)的常量。
【例】符號(hào)常量的使用。
#include <iostream> using namespace std; #define PRICE 30 //注意這不是語句,末尾不要加分號(hào) int main ( ) { int num,total; num=10; total=num * PRICE; cout<<"total="<<total<<endl; return 0; }
程序中用預(yù)處理命令#define指定PRICE在本程序單位中代表常量30,此后凡在本程序單位中出現(xiàn)的PRICE都代表30,可以和常量一樣進(jìn)行運(yùn)算,程序運(yùn)行結(jié)果為
total=300
請(qǐng)注意符號(hào)常量雖然有名字,但它不是變量。它的值在其作用域(在本例中為主函數(shù))內(nèi)是不能改變的,也不能被賦值。如用賦值語句"PRICE=40;"給PRICE賦值是錯(cuò)誤的。 使用符號(hào)常量的好處是:含義清楚,在需要改變一個(gè)常量時(shí)能做到"一改全改"。 如:
#define PRICE 35
相關(guān)文章
使用UDP協(xié)議實(shí)現(xiàn)單詞翻譯服務(wù)器
這篇文章主要為大家詳細(xì)介紹了如何使用UDP協(xié)議實(shí)現(xiàn)英文單詞翻譯服務(wù)器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-08-08C語言實(shí)現(xiàn)的排列組合問題的通用算法、解決方法
這篇文章主要介紹了C語言實(shí)現(xiàn)的排列組合問題的通用算法、解決方法,本文使用C語言實(shí)現(xiàn)在程序中解決這個(gè)問題,需要的朋友可以參考下2014-08-08Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明
這篇文章主要介紹了Qt圖形圖像開發(fā)曲線圖表模塊QChart庫基本用法、各個(gè)類之間的關(guān)系說明,需要的朋友可以參考下2020-03-03VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程
這篇文章主要介紹了VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程,涉及VC針對(duì)系統(tǒng)進(jìn)程的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05基于C語言編寫簡(jiǎn)易的英文統(tǒng)計(jì)和加密系統(tǒng)
這篇文章主要介紹如何基于C語言編寫一個(gè)簡(jiǎn)易的英文統(tǒng)計(jì)和加密系統(tǒng),實(shí)際上就是對(duì)字符數(shù)組的基本操作的各種使用,感興趣的可以了解一下2023-05-05C語言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理軟件
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理軟件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05