(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第2章--數(shù)據(jù)類(lèi)型與表達(dá)式_第1頁(yè)
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第2章--數(shù)據(jù)類(lèi)型與表達(dá)式_第2頁(yè)
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第2章--數(shù)據(jù)類(lèi)型與表達(dá)式_第3頁(yè)
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第2章--數(shù)據(jù)類(lèi)型與表達(dá)式_第4頁(yè)
(C++-面向?qū)ο蟪绦蛟O(shè)計(jì)-譚浩強(qiáng))第2章--數(shù)據(jù)類(lèi)型與表達(dá)式_第5頁(yè)
已閱讀5頁(yè),還剩29頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上第2章 數(shù)據(jù)類(lèi)型與表達(dá)式2.1 C+的數(shù)據(jù)類(lèi)型2.2 常量2.3 變量2.4 C+的運(yùn)算符2.5 算術(shù)運(yùn)算符與算術(shù)表達(dá)式2.6 賦值運(yùn)算符與賦值表達(dá)式2.7 逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式2.1 C+的數(shù)據(jù)類(lèi)型計(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ī)語(yǔ)言所允許使用的數(shù)據(jù)結(jié)構(gòu)是不同的處理同一類(lèi)問(wèn)題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會(huì)不同例如,對(duì)10個(gè)整數(shù)排序和對(duì)包含10個(gè)元素的整型數(shù)組排序的算法是不同的C+可以使

2、用的數(shù)據(jù)類(lèi)型如下:C+的數(shù)據(jù)包括常量與變量,常量與變量都具有類(lèi)型由以上這些數(shù)據(jù)類(lèi)型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)例如利用指針和結(jié)構(gòu)體類(lèi)型可以構(gòu)成表樹(shù)棧等復(fù)雜的數(shù)據(jù)結(jié)構(gòu)C+并沒(méi)有統(tǒng)一規(guī)定各類(lèi)數(shù)據(jù)的精度數(shù)值范圍和在內(nèi)存中所占的字節(jié)數(shù),各C+編譯系統(tǒng)根據(jù)自己的情況作出安排書(shū)中表2.1列出了Visual C+數(shù)值型和字符型數(shù)據(jù)的情況說(shuō)明:(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)制形式為,則在內(nèi)存中的存儲(chǔ)形式如圖2.1所示圖2.

3、1(3) 在整型符號(hào)int和字符型符號(hào)char的前面,可以加修飾符signed(表示“有符號(hào)”)或unsigned(表示“無(wú)符號(hào)”)如果指定為signed,則數(shù)值以補(bǔ)碼形式存放,存儲(chǔ)單元中的最高位(bit)用來(lái)表示數(shù)值的符號(hào)如果指定為unsigned,則數(shù)值沒(méi)有符號(hào),全部二進(jìn)制位都用來(lái)表示數(shù)值本身例如短整型數(shù)據(jù)占兩個(gè)字節(jié) ,見(jiàn)圖2.2圖2.2有符號(hào)時(shí),能存儲(chǔ)的最大值為215-1,即32767,最小值為-32768無(wú)符號(hào)時(shí),能存儲(chǔ)的最大值為216-1,即65535,最小值為0有些數(shù)據(jù)是沒(méi)有負(fù)值的,可以使用unsigned,它存儲(chǔ)正數(shù)的范圍比用signed時(shí)要大一倍(4) 浮點(diǎn)型(又稱實(shí)型)數(shù)據(jù)分

4、為單精度(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) 表中類(lèi)型標(biāo)識(shí)符一欄中,方括號(hào) 包含的部分可以省寫(xiě),如short和short int等效,unsigned int和unsigned等效常量的值是不能改變的,一般從其字面形式即可判別是否為常量常量包括兩大類(lèi),即數(shù)值型常量(即常數(shù))和字符型常量如12,0,-3為整型常量,4.6,-1.23為實(shí)型

5、常量,包含在兩個(gè)單撇號(hào)之間的字符為字符常量,如a,x這種從字面形式即可識(shí)別的常量稱為“字面常量”或“直接常量”2.2 常量2.2.1 什么是常量2.2.2 數(shù)值常量數(shù)值常量就是通常所說(shuō)的常數(shù)在C+中,數(shù)值常量是區(qū)分類(lèi)型的,從字面形式即可識(shí)別其類(lèi)型1. 整型常量(整數(shù))的類(lèi)型在上一節(jié)中已知道: 整型數(shù)據(jù)可分為int,short int,long int以及unsigned int,unsigned short,unsigned long等類(lèi)別整型常量也分為以上類(lèi)別為什么將數(shù)值常量區(qū)分為不同的類(lèi)別呢?因?yàn)樵谶M(jìn)行賦值或函數(shù)的參數(shù)虛實(shí)結(jié)合時(shí)要求數(shù)據(jù)類(lèi)型匹配那么,一個(gè)整型常量怎樣從字面上區(qū)分為以上的類(lèi)別

6、呢?(1) 一個(gè)整數(shù),如果其值在-32768+32767范圍內(nèi),認(rèn)為它是short int型,它可以賦值給short int型int型和long int型變量(2) 一個(gè)整數(shù),如果其值超過(guò)了上述范圍,而在-+范圍內(nèi),則認(rèn)為它是long int型,可以將它賦值給一個(gè)int或long int型變量(3) 如果某一計(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型變量(4) 常量無(wú)unsigned型但一個(gè)非負(fù)值的整數(shù)可以賦

7、值給unsigned整型變量,只要它的范圍不超過(guò)變量的取值范圍即可一個(gè)整型常量可以用3種不同的方式表示: (1) 十進(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í)參(2) 八進(jìn)制整數(shù)在常數(shù)的開(kāi)頭加一個(gè)數(shù)字0,就表示這是以八進(jìn)制數(shù)形式表示的常數(shù)如020表示這是八進(jìn)制數(shù)20,即(20)8,它相當(dāng)于十進(jìn)制數(shù)16(3) 十六進(jìn)制整數(shù)在常數(shù)的開(kāi)頭加一個(gè)數(shù)字0和一個(gè)英文字母X(或x),就表示這

8、是以十六進(jìn)制數(shù)形式表示的常數(shù)如0X20表示這是十六進(jìn)制數(shù)20,即(20)16,它相當(dāng)于十進(jìn)制數(shù)322. 浮點(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é)(

9、2) 指數(shù)形式(即浮點(diǎn)形式)一個(gè)浮點(diǎn)數(shù)可以寫(xiě)成指數(shù)形式,如3.14159可以表示為0.×101,3.14159×100,31.4159×10-1,314.159×10-2等形式在程序中應(yīng)表示為: 0.e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的數(shù)是以10為底的冪,如e12表示1012其一般形式為數(shù)符 數(shù)字部分 指數(shù)部分上面各數(shù)據(jù)中的0.,3.14159, 31.4159, 314.159 等就是其中的數(shù)字部分可以看到: 由于指數(shù)部分的存在,使得同一個(gè)浮點(diǎn)數(shù)可以用不同的指數(shù)形式來(lái)表示,數(shù)字部分中小數(shù)點(diǎn)的位置是浮

10、動(dòng)的例如: a=0.e1;a=3.14159e0;a=31.4159e-1;a=314.159e-2;以上4個(gè)賦值語(yǔ)句中,用了不同形式的浮點(diǎn)數(shù),但其作用是相同的在程序中不論把浮點(diǎn)數(shù)寫(xiě)成小數(shù)形式還是指數(shù)形式,在內(nèi)存中都是以指數(shù)形式(即浮點(diǎn)形式)存儲(chǔ)的例如不論在程序中寫(xiě)成314.159或314.159e0,31.4159e1,3.14159e2, 0.e3等形式,在內(nèi)存中都是以規(guī)范化的指數(shù)形式存放,如圖2.3所示圖2.3數(shù)字部分必須小于1,同時(shí),小數(shù)點(diǎn)后面第一個(gè)數(shù)字必須是一個(gè)非0數(shù)字,例如不能是0.因此314.159和314.159e0,31.4159e1,3.14159e2, 0.e3在內(nèi)存中表

11、示成0.×103存儲(chǔ)單元分為兩部分,一部分用來(lái)存放數(shù)字部分,一部分用來(lái)存放指數(shù)部分為便于理解,在圖2.3中是用十進(jìn)制表示的,實(shí)際上在存儲(chǔ)單元中是用二進(jìn)制數(shù)來(lái)表示小數(shù)部分,用2的冪次來(lái)表示指數(shù)部分的對(duì)于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理 2.2.3 字符常量1. 普通的字符常量用單撇號(hào)括起來(lái)的一個(gè)字符就是字符型常量如a,#,%,D都是合法的字符常量,在內(nèi)存中占一個(gè)字節(jié)注意: 字符常量只能包括一個(gè)字符,如AB 是不合法的字符常量區(qū)分大小寫(xiě)字母,如A和a是兩個(gè)不同的字符常量撇號(hào)()是定界符,而不屬于字符常量的一部分如cout<<a;輸出的是一個(gè)字母“a”,而不是3

12、個(gè)字符“a ”2. 轉(zhuǎn)義字符常量除了以上形式的字符常量外,C+還允許用一種特殊形式的字符常量,就是以 “”開(kāi)頭的字符序列例如,n代表一個(gè)“換行”符“cout<<n; ” 將輸出一個(gè)換行,其作用與“cout<<endl; ” 相同這種“控制字符”,在屏幕上是不能顯示的在程序中也無(wú)法用一個(gè)一般形式的字符表示,只能采用特殊形式來(lái)表示常用的以“”開(kāi)頭的特殊字符見(jiàn)書(shū)中表2.23. 字符數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形式及其使用方法將一個(gè)字符常量存放到內(nèi)存單元時(shí),實(shí)際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符相應(yīng)的ASCII代碼放到存儲(chǔ)單元中如果字符變量c1的值為a,c2的值為b,則在

13、變量中存放的是a的ASCII碼97,b 的ASCII碼98,如圖2.4(a)所示,實(shí)際上在內(nèi)存中是以二進(jìn)制形式存放的,如圖2.4(b)所示圖2.4既然字符數(shù)據(jù)是以ASCII碼存儲(chǔ)的,它的存儲(chǔ)形式就與整數(shù)的存儲(chǔ)形式類(lèi)似這樣,在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)算例2.1 將字符賦給整型變量#include <iostream>using namespace std;int main( ) int i,j; /i和j是整型變量i=A; /

14、將一個(gè)字符常量賦給整型變量ij=B; /將一個(gè)字符常量賦給整型變量jcout<<i<< <<j<<n; /輸出整型變量i和j的值,n 是換行符return 0;執(zhí)行時(shí)輸出 65 66i和j被指定為整型變量但在第5和第6行中,將字符A和B分別賦給i和j,它的作用相當(dāng)于以下兩個(gè)賦值語(yǔ)句:i=65;j=66;因?yàn)锳和B的ASCII碼為65和66在程序的第5和第6行是把65和66直接存放到i和j的內(nèi)存單元中因此輸出65和66可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的但是應(yīng)注意字符數(shù)據(jù)只占一個(gè)字節(jié),它只能存放0255范圍內(nèi)的整數(shù)例2.2 字符

15、數(shù)據(jù)與整數(shù)進(jìn)行算術(shù)運(yùn)算下面程序的作用是將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母#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 Ba的ASCII碼為97,而A的ASCII碼為65,b為98,B為66從ASCII代碼表中可以看到每一個(gè)小寫(xiě)字母比它相應(yīng)的大寫(xiě)字母的ASCII代碼大32C+符數(shù)據(jù)與數(shù)值直接進(jìn)行算術(shù)運(yùn)算,a-32得到整數(shù)65,b-

16、32得到整數(shù)66將65和66存放在c1,c2中,由于c1,c2是字符變量,因此用cout輸出c1,c2時(shí),得到字符A和B(A的ASCII碼為65,B的ASCII碼為66)4. 字符串常量用雙撇號(hào)括起來(lái)的部分就是字符串常量,如abc,Hello!,a+b,Liping都是字符串常量字符串常量abc在內(nèi)存中占4個(gè)字節(jié)(而不是3個(gè)字節(jié)),見(jiàn)圖2.5圖2.5編譯系統(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 是字符常

17、量前者占兩個(gè)字節(jié),后者占1個(gè)字節(jié)請(qǐng)分析下面的程序片段: char c;/定義一個(gè)字符變量c=a;/正確c=a; /錯(cuò)誤,c只能容納一個(gè)字符字符串常量要用字符數(shù)組來(lái)存放,見(jiàn)第5章請(qǐng)思考: 字符串常量abcn包含幾個(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)寫(xiě)為abcn,此時(shí)字符包括5個(gè)字符,即a,b,c,n如果有以下輸出語(yǔ)句:cou

18、t<<abcn<<endl;則會(huì)輸出: abc,然后換行同理執(zhí)行cout<<I say Thank you!n;的輸出是: I say Thank you!如果在一個(gè)字符串中最后一個(gè)字符為“”,則表示它是續(xù)行符,下一行的字符是該字符串的一部分,且在兩行字符串間無(wú)空格如cout<<We must study C/本行最后的“”后面的空格和換行均不起作用+ hard!;/本行的字符緊連在上一行最后的“”前面字符之后則輸出: We must study C+ hard!2.2.4 符號(hào)常量為了編程和閱讀的方便,在C+程序設(shè)計(jì)中,常用一個(gè)符號(hào)名代表一個(gè)常

19、量,稱為符號(hào)常量,即以標(biāo)識(shí)符形式出現(xiàn)的常量例2.3 符號(hào)常量的使用#define PRICE 30 /注意這不是語(yǔ)句,末尾不要加分號(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ù))

20、內(nèi)是不能改變的,也不能被賦值如用賦值語(yǔ)句“PRICE=40;”給PRICE賦值是錯(cuò)誤的 使用符號(hào)常量的好處是:(1) 含義清楚(2) 在需要改變一個(gè)常量時(shí)能做到“一改全改” 如#define PRICE 352.3 變量2.3.1 什么是變量其實(shí)在前面的例子中已經(jīng)多次用到了變量在程序運(yùn)行期間其值可以改變的量稱為變量一個(gè)變量應(yīng)該有一個(gè)名字,并在內(nèi)存中占據(jù)一定的存儲(chǔ)單元,在該存儲(chǔ)單元中存放變量的值請(qǐng)注意區(qū)分變量名和變量值這兩個(gè)不同的概念,見(jiàn)圖2.6圖2.62.3.2 變量名規(guī)則先介紹標(biāo)識(shí)符的概念和其他高級(jí)語(yǔ)言一樣,用來(lái)標(biāo)識(shí)變量符號(hào)常量函數(shù)數(shù)組類(lèi)型等實(shí)體名字的有效字符序列稱為標(biāo)識(shí)符(identifi

21、er)簡(jiǎn)單地說(shuō),標(biāo)識(shí)符就是一個(gè)名字變量名是標(biāo)識(shí)符的一種,變量的名字必須遵循標(biāo)識(shí)符的命名規(guī)則C+規(guī)定標(biāo)識(shí)符只能由字母數(shù)字和下劃線3種字符組成,且第一個(gè)字符必須為字母或下劃線下面列出的是合法的標(biāo)識(shí)符,也是合法的變量名:sum, average, total, day, month, Student_name, tan, BASIC, li_ling下面是不合法的標(biāo)識(shí)符和變量名:M.D.John, $123, #33, 3G64, Ling li, C+, Zhang-ling, U.S.A.注意,在C+中,大寫(xiě)字母和小寫(xiě)字母被認(rèn)為是兩個(gè)不同的字符因此,sum和SUM是兩個(gè)不同的變量名一般地,變量名

22、用小寫(xiě)字母表示,與人們?nèi)粘A?xí)慣一致,以增加可讀性應(yīng)注意變量名不能與C+的關(guān)鍵字系統(tǒng)函數(shù)名和類(lèi)名相同在國(guó)外軟件開(kāi)發(fā)工作中,常習(xí)慣在變量前面加一個(gè)字母以表示該變量的類(lèi)型,如iCount表示這是一個(gè)整型變量,cSex表示這是一個(gè)字符型變量C+沒(méi)有規(guī)定標(biāo)識(shí)符的長(zhǎng)度(字符個(gè)數(shù)),但各個(gè)具體的C編譯系統(tǒng)都有自己的規(guī)定有的系統(tǒng)取32個(gè)字符,超過(guò)的字符不被識(shí)別2.3.3 定義變量在C+語(yǔ)言中,要求對(duì)所有用到的變量作強(qiáng)制定義,也就是必須“先定義,后使用”,如例2.2和例2.3那樣定義變量的一般形式是 變量類(lèi)型 變量名表列;變量名表列指的是一個(gè)或多個(gè)變量名的序列如float a,b,c,d,e;定義a,b,c,d

23、,e為單精度型變量,注意各變量間以逗號(hào)分隔,最后是分號(hào)可以在定義變量時(shí)指定它的初值如 float a=83.5,b,c=64.5,d=81.2,e; /對(duì)變量a,c,d指定了初值,b和d未指定初值C語(yǔ)言要求變量的定義應(yīng)該放在所有的執(zhí)行語(yǔ)句之前,而C+則放松了限制,只要求在第一次使用該變量之前進(jìn)行定義即可也就是說(shuō),它可以出現(xiàn)在語(yǔ)句的中間,如int a;/定義變量a(在使用a之前定義)a=3; /執(zhí)行語(yǔ)句,對(duì)a賦值float b; /定義變量b(在使用b之前定義)b=4.67; /執(zhí)行語(yǔ)句,對(duì)b賦值char c; /定義變量c(在使用c之前定義)c=A; /執(zhí)行語(yǔ)句 ,對(duì)c賦值C+要求對(duì)變量作強(qiáng)制

24、定義的目的是:(1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確例如,如果在聲明部分寫(xiě)了int student;而在執(zhí)行語(yǔ)句中錯(cuò)寫(xiě)成statent如statent=30;在編譯時(shí)檢查出statent未經(jīng)定義,作為錯(cuò)誤處理輸出“變量statent未經(jīng)聲明”的信息,便于用戶發(fā)現(xiàn)錯(cuò)誤,避免變量名使用時(shí)出錯(cuò)(2) 每一個(gè)變量被指定為一確定類(lèi)型,在編譯時(shí)就能為其分配相應(yīng)的存儲(chǔ)單元如指定a和b為int型,一般的編譯系統(tǒng)對(duì)其各分配4個(gè)字節(jié),并按整數(shù)方式存儲(chǔ)數(shù)據(jù)(3) 指定每一變量屬于一個(gè)特定的類(lèi)型,這就便于在編譯時(shí),據(jù)此檢查該變量所進(jìn)行的運(yùn)算是否合法例如,整型變量a和b,可以進(jìn)行求余運(yùn)

25、算:a%b%是“求余”(見(jiàn)2.4 節(jié)),得到a/b的余數(shù)如果將a和b指定為實(shí)型變量,則不允許進(jìn)行“求余”運(yùn)算,在編譯時(shí)會(huì)給出有關(guān)的出錯(cuò)信息2.3.4 為變量賦初值 允許在定義變量時(shí)對(duì)它賦予一個(gè)初值,這稱為變量初始化初值可以是常量,也可以是一個(gè)有確定值的表達(dá)式如float a,b=5.78*3.5,c=2*sin(2.0);表示定義了a,b,c為單精度浮點(diǎn)型變量,對(duì)b初始化為5.78*3, 對(duì)c初始化為2*sin(2.0),在編譯連接后,從標(biāo)準(zhǔn)函數(shù)庫(kù)得到正弦函數(shù)sin(2.0)的值,因此變量c有確定的初值變量a未初始化如果對(duì)變量未賦初值,則該變量的初值是一個(gè)不可預(yù)測(cè)的值,即該存儲(chǔ)單元中當(dāng)時(shí)的內(nèi)容

26、是不知道的例如,若未對(duì)a和b賦值,執(zhí)行輸出語(yǔ)句cout<<a<< <<b<< <<c<<endl;輸出結(jié)果可能為1.48544e-38 15 1.81858(各次運(yùn)行情況可能不同)初始化不是在編譯階段完成的(只有在第4章中介紹的靜態(tài)存儲(chǔ)變量和外部變量的初始化是在編譯階段完成的),而是在程序運(yùn)行時(shí)執(zhí)行本函數(shù)時(shí)賦予初值的,相當(dāng)于執(zhí)行一個(gè)賦值語(yǔ)句例如,int a=3;相當(dāng)于以下兩個(gè)語(yǔ)句 :int a; / 指定a為整型變量a=3;/ 賦值語(yǔ)句,將3賦給a 對(duì)多個(gè)變量賦予同一初值,必須分別指定,不能寫(xiě)成float a=b=c=4.

27、5;而應(yīng)寫(xiě)成 float a=4.5,b=4.5,c=4.5;或float a,b,c=4.5;a=b=c;2.3.5 常變量在定義變量時(shí),如果加上關(guān)鍵字const,則變量的值在程序運(yùn)行期間不能改變,這種變量稱為常變量(constant variable)例如,const int a=3; /用const來(lái)聲明這種變量的值不能改變,指定其值始終為3在定義常變量時(shí)必須同時(shí)對(duì)它初始化(即指定其值),此后它的值不能再改變常變量不能出現(xiàn)在賦值號(hào)的左邊例如上面一行不能寫(xiě)成const int a;a=3; /常變量不能被賦值可以用表達(dá)式對(duì)常變量初始化,如const int b=3+6,c=3*cos(1.

28、5);/b的值被指定為9,c的值被指定為3*cos(1.5)但應(yīng)注意,由于使用了系統(tǒng)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)cos,必須將包含該函數(shù)有關(guān)的信息的頭文件“cmath”(或math.h)包含到本程序單位中來(lái),可以在本程序單位的開(kāi)頭加上以下#include命令:#include <cmath> 或 #include <math.h>變量的值應(yīng)該是可以變化的,怎么值是固定的量也稱變量呢?其實(shí),從計(jì)算機(jī)實(shí)現(xiàn)的角度看,變量的特征是存在一個(gè)以變量名命名的存儲(chǔ)單元,在一般情況下,存儲(chǔ)單元中的內(nèi)容是可以變化的對(duì)常變量來(lái)說(shuō),無(wú)非在此變量的基礎(chǔ)上加上一個(gè)限定: 存儲(chǔ)單元中的值不允許變化因此常變量又稱為只

29、讀變量(read-only-variable)請(qǐng)區(qū)別用#define命令定義的符號(hào)常量和用const定義的常變量符號(hào)常量只是用一個(gè)符號(hào)代替一個(gè)字符串,在預(yù)編譯時(shí)把所有符號(hào)常量替換為所指定的字符串,它沒(méi)有類(lèi)型,在內(nèi)存中并不存在以符號(hào)常量命名的存儲(chǔ)單元而常變量具有變量的特征,它具有類(lèi)型,在內(nèi)存中存在著以它命名的存儲(chǔ)單元,可以用sizeof運(yùn)算符測(cè)出其長(zhǎng)度與一般變量惟一的不同是指定變量的值不能改變用#define命令定義符號(hào)常量是C語(yǔ)言所采用的方法,C+把它保留下來(lái)是為了和C兼容C+的程序員一般喜歡用const定義常變量雖然二者實(shí)現(xiàn)的方法不同,但從使用的角度看,都可以認(rèn)為用了一個(gè)標(biāo)識(shí)符代表了一個(gè)常量

30、有些書(shū)上把用const定義的常變量也稱為定義常量,但讀者應(yīng)該了解它和符號(hào)常量的區(qū)別2.4 C+的運(yùn)算符C+的運(yùn)算符十分豐富,使得C+的運(yùn)算十分靈活方便例如把賦值號(hào)(=)也作為運(yùn)算符處理,這樣,a=b=c=4就是合法的表達(dá)式,這是與其他語(yǔ)言不同的C+提供了以下運(yùn)算符:(1) 算術(shù)運(yùn)算符 +(加)-(減) *(乘) /(除) %(整除求余)+(自加) -(自減)(2) 關(guān)系運(yùn)算符>(大于)<(小于) =(等于)>=(大于或等于)<=(小于或等于)!=(不等于)(3) 邏輯運(yùn)算符 &&(邏輯與) |(邏輯或) !(邏輯非)(4) 位運(yùn)算符 <<(按

31、位左移) >>(按位右移) &(按位與) |(按位或) (按位異或) (按位取反)(5) 賦值運(yùn)算符 (=及其擴(kuò)展賦值運(yùn)算符)(6) 條件運(yùn)算符 (?:)(7) 逗號(hào)運(yùn)算符 (,)(8) 指針運(yùn)算符 (*)(9)引用運(yùn)算符和地址運(yùn)算符 (&)(10) 求字節(jié)數(shù)運(yùn)算符(sizeof)(11) 強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符( (類(lèi)型) 或類(lèi)型( )(12) 成員運(yùn)算符 (.)(13) 指向成員的運(yùn)算符 (->)(14) 下標(biāo)運(yùn)算符 ( )(15) 其他 (如函數(shù)調(diào)用運(yùn)算符()2.5 算術(shù)運(yùn)算符與算術(shù)表達(dá)式2.5.1 基本的算術(shù)運(yùn)算符在本章中主要介紹算術(shù)運(yùn)算符與算術(shù)表達(dá)式,賦

32、值運(yùn)算符與賦值表達(dá)式,逗號(hào)運(yùn)算符與逗號(hào)表達(dá)式,其他運(yùn)算符將在以后各章中陸續(xù)介紹+(加法運(yùn)算符,或正值運(yùn)算符如3+5,+3)-(減法運(yùn)算符,或負(fù)值運(yùn)算符如5-2,-3)* (乘法運(yùn)算符如3*5)/(除法運(yùn)算符如5/3)%(模運(yùn)算符,或稱求余運(yùn)算符,%兩側(cè)均應(yīng)為整型數(shù)據(jù),如7%4的值為3)需要說(shuō)明,兩個(gè)整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果值為1,舍去小數(shù)部分但是,如果除數(shù)或被除數(shù)中有一個(gè)為負(fù)值,則舍入的方向是不固定的例如,-5/3在有的C+系統(tǒng)上得到結(jié)果-1,有的C+系統(tǒng)則給出結(jié)果-2多數(shù)編譯系統(tǒng)采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠攏如果參加+, -, *

33、, / 運(yùn)算的兩個(gè)數(shù)中有一個(gè)數(shù)為float型數(shù)據(jù),則運(yùn)算的結(jié)果是double型,因?yàn)镃+在運(yùn)算時(shí)對(duì)所有float型數(shù)據(jù)都按double型數(shù)據(jù)處理2.5.2 算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)與結(jié)合性用算術(shù)運(yùn)算符和括號(hào)將運(yùn)算對(duì)象(也稱操作數(shù))連接起來(lái)的符合C+語(yǔ)法規(guī)則的式子,稱C+算術(shù)表達(dá)式運(yùn)算對(duì)象包括常量變量函數(shù)等例如,下面是一個(gè)合法的C+算術(shù)表達(dá)式:a*b/c-1.5+aC+語(yǔ)言規(guī)定了運(yùn)算符的優(yōu)先級(jí)和結(jié)合性在求解表達(dá)式時(shí),先按運(yùn)算符的優(yōu)先級(jí)別高低次序執(zhí)行,例如先乘除后加減如有表達(dá)式a-b*c,b的左側(cè)為減號(hào),右側(cè)為乘號(hào),而乘號(hào)優(yōu)先于減號(hào),因此,相當(dāng)于a-(b*c)如果在一個(gè)運(yùn)算對(duì)象兩側(cè)的運(yùn)算符的優(yōu)先

34、級(jí)別相同,如a-b+c,則按規(guī)定的“結(jié)合方向”處理C+規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性),算術(shù)運(yùn)算符的結(jié)合方向?yàn)椤白宰笾劣摇?即先左后右,因此b先與減號(hào)結(jié)合,執(zhí)行a-b的運(yùn)算,再執(zhí)行加c的運(yùn)算“自左至右的結(jié)合方向”又稱“左結(jié)合性”,即運(yùn)算對(duì)象先與左面的運(yùn)算符結(jié)合以后可以看到有些運(yùn)算符的結(jié)合方向?yàn)椤白杂抑磷蟆?即右結(jié)合性(例如賦值運(yùn)算符)關(guān)于“結(jié)合性”的概念在其他一些高級(jí)語(yǔ)言中是沒(méi)有的,是C和C+的特點(diǎn)之一,希望能弄清楚附錄B列出了所有運(yùn)算符以及它們的優(yōu)先級(jí)別和結(jié)合性2.5.3 表達(dá)式中各類(lèi)數(shù)值型數(shù)據(jù)間的混合運(yùn)算在表達(dá)式中常遇到不同類(lèi)型數(shù)據(jù)之間進(jìn)行運(yùn)算,如10+a+1.5-8765.1234*

35、b在進(jìn)行運(yùn)算時(shí),不同類(lèi)型的數(shù)據(jù)要先轉(zhuǎn)換成同一類(lèi)型,然后進(jìn)行運(yùn)算轉(zhuǎn)換的規(guī)則按圖2.7所示圖2.7假設(shè)已指定i為整型變量,f為float變量,d為double型變量,e為long型,有下面表達(dá)式:10+a+i*f-d/e運(yùn)算次序?yàn)? 進(jìn)行10+a的運(yùn)算,先將a轉(zhuǎn)換成整數(shù)97,運(yùn)算結(jié)果為107進(jìn)行i*f的運(yùn)算先將i與f都轉(zhuǎn)換成double型,運(yùn)算結(jié)果為double型整數(shù)107與i*f的積相加先將整數(shù)107轉(zhuǎn)換成雙精度數(shù)(小數(shù)點(diǎn)后加若干個(gè)0,即107.00000),結(jié)果為double型將變量e轉(zhuǎn)換成double型,d/e結(jié)果為double型將10+a+i*f的結(jié)果與d/e的商相減,結(jié)果為double型

36、上述的類(lèi)型轉(zhuǎn)換是由系統(tǒng)自動(dòng)進(jìn)行的2.5.4 自增和自減運(yùn)算符在C和C+中,常在表達(dá)式中使用自增(+)和自減(-)運(yùn)算符,他們的作用是使變量的值增1或減1,如+i(在使用i之前,先使i的值加1,如果i的原值為3,則執(zhí)行j=+i后,j的值為4)-i (在使用i之前,先使i的值減1,如果i的原值為3,則執(zhí)行j=-i后,j的值為2)i+ (在使用i之后,使i的值加1,如果i的原值為3,則執(zhí)行j=i+后,j的值為3,然后i變?yōu)?)i-(在使用i之后,使i的值減1,如果i的原值為3,則執(zhí)行j=i-后,j的值為3,然后i變?yōu)?)+i是先執(zhí)行i=i+1后,再使用i的值;而i+是先使用i的值后,再執(zhí)行i=i+1

37、正確地使用+和-,可以使程序簡(jiǎn)潔清晰高效請(qǐng)注意:(1) 自增運(yùn)算符(+)和自減運(yùn)算符(-)只能用于變量,而不能用于常量或表達(dá)式(2) +和-的結(jié)合方向是“自右至左”,見(jiàn)附錄B(3) 自增運(yùn)算符(+)和自減運(yùn)算符(-)使用十分靈活,但在很多情況下可能出現(xiàn)歧義性,產(chǎn)生“意想不到”的副作用(4) 自增(減)運(yùn)算符在C+程序中是經(jīng)常見(jiàn)到的,常用于循環(huán)語(yǔ)句中,使循環(huán)變量自動(dòng)加1也用于指針變量,使指針指向下一個(gè)地址2.5.5 強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符在表達(dá)式中不同類(lèi)型的數(shù)據(jù)會(huì)自動(dòng)地轉(zhuǎn)換類(lèi)型,以進(jìn)行運(yùn)算有時(shí)程序編制者還可以利用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符將一個(gè)表達(dá)式轉(zhuǎn)換成所需類(lèi)型例如:(double)a (將a轉(zhuǎn)換成dou

38、ble類(lèi)型)(int)(x+y) (將x+y的值轉(zhuǎn)換成整型)(float)(5%3) (將5%3的值轉(zhuǎn)換成float型)強(qiáng)制類(lèi)型轉(zhuǎn)換的一般形式為(類(lèi)型名)(表達(dá)式)注意: 如果要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的對(duì)象是一個(gè)變量,該變量可以不用括號(hào)括起來(lái)如果要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換的對(duì)象是一個(gè)包含多項(xiàng)的表達(dá)式,則表達(dá)式應(yīng)該用括號(hào)括起來(lái)如果寫(xiě)成 (int)x+y則只將x轉(zhuǎn)換成整型,然后與y相加以上強(qiáng)制類(lèi)型轉(zhuǎn)換的形式是原來(lái)C語(yǔ)言使用的形式,C+把它保留了下來(lái),以利于兼容C+還增加了以下形式: 類(lèi)型名(表達(dá)式)如int(x) 或 int(x+y)類(lèi)型名不加括號(hào),而變量或表達(dá)式用括號(hào)括起來(lái)這種形式類(lèi)似于函數(shù)調(diào)用但許多人仍習(xí)慣

39、于用第一種形式,把類(lèi)型名包在括號(hào)內(nèi),這樣比較清楚需要說(shuō)明的是在強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí),得到一個(gè)所需類(lèi)型的中間變量,但原來(lái)變量的類(lèi)型未發(fā)生變化例如:(int)x如果x原指定為float型,值為3.6,進(jìn)行強(qiáng)制類(lèi)型運(yùn)算后得到一個(gè)int型的中間變量,它的值等于3,而x原來(lái)的類(lèi)型和值都不變例2.4 強(qiáng)制類(lèi)型轉(zhuǎn)換#include <iostream>using namespace std;int main( ) float x; int i; x=3.6; i=(int)x; cout<<x=<<x<<,i=<< i<<endl; retu

40、rn 0;運(yùn)行結(jié)果如下:x=3.6,i=3x的型仍為float型,值仍等于3.6由上可知,有兩種類(lèi)型轉(zhuǎn)換,一種是在運(yùn)算時(shí)不必用戶指定,系統(tǒng)自動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換,如3+6.5第二種是強(qiáng)制類(lèi)型轉(zhuǎn)換當(dāng)自動(dòng)類(lèi)型轉(zhuǎn)換不能實(shí)現(xiàn)目的時(shí),可以用強(qiáng)制類(lèi)型轉(zhuǎn)換此外,在函數(shù)調(diào)用時(shí),有時(shí)為了使實(shí)參與形參類(lèi)型一致,可以用強(qiáng)制類(lèi)型轉(zhuǎn)換運(yùn)算符得到一個(gè)所需類(lèi)型的參數(shù)2.6 賦值運(yùn)算符與賦值表達(dá)式2.6.1 賦值運(yùn)算符賦值符號(hào)“=”就是賦值運(yùn)算符,它的作用是將一個(gè)數(shù)據(jù)賦給一個(gè)變量如“a=3”的作用是執(zhí)行一次賦值操作(或稱賦值運(yùn)算)把常量3賦給變量a也可以將一個(gè)表達(dá)式的值賦給一個(gè)變量2.6.2 賦值過(guò)程中的類(lèi)型轉(zhuǎn)換如果賦值運(yùn)算符兩

41、側(cè)的類(lèi)型不一致,但都是數(shù)值型或字符型時(shí),在賦值時(shí)會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換(1) 將浮點(diǎn)型數(shù)據(jù)(包括單雙精度)賦給整型變量時(shí),舍棄其小數(shù)部分(2) 將整型數(shù)據(jù)賦給浮點(diǎn)型變量時(shí),數(shù)值不變,但以指數(shù)形式存儲(chǔ)到變量中(3) 將一個(gè)double型數(shù)據(jù)賦給float變量時(shí),要注意數(shù)值范圍不能溢出(4) 字符型數(shù)據(jù)賦給整型變量,將字符的ASCII碼賦給整型變量 (5) 將一個(gè)intshort或long型數(shù)據(jù)賦給一個(gè)char型變量,只將其低8位原封不動(dòng)地送到char型變量(發(fā)生截?cái)?例如short int i=289;char c;c=i;/將一個(gè)int型數(shù)據(jù)賦給一個(gè)char型變量賦值情況見(jiàn)圖2.8為方便起見(jiàn),以一

42、個(gè)int型數(shù)據(jù)占兩個(gè)字節(jié)(16位)的情況來(lái)說(shuō)明圖2.8(6) 將signed(有符號(hào))型數(shù)據(jù)賦給長(zhǎng)度相同的unsigned(無(wú)符號(hào))型變量,將存儲(chǔ)單元內(nèi)容原樣照搬(連原有的符號(hào)位也作為數(shù)值一起傳送)例2.5 將有符號(hào)數(shù)據(jù)傳送給無(wú)符號(hào)變量#include <iostream>using namespace std;int main( ) unsigned short a; short int b=-1; a=b; cout<<a=<<a<<endl; return 0;運(yùn)行結(jié)果為65535賦給b的值是-1,怎么會(huì)得到65535呢?請(qǐng)看圖2.9所示的

43、賦值情況圖2.9-1的補(bǔ)碼形式為11111(即全部16個(gè)二進(jìn)制位均為1),將它傳送給a,而a是無(wú)符號(hào)型變量,16個(gè)位全1是十進(jìn)制的65535如果b為正值,且在032767之間,則賦值后數(shù)值不變不同類(lèi)型的整型數(shù)據(jù)間的賦值歸根結(jié)底就是一條:按存儲(chǔ)單元中的存儲(chǔ)形式直接傳送C和C+使用靈活,在不同類(lèi)型數(shù)據(jù)之間賦值時(shí),常常會(huì)出現(xiàn)意想不到的結(jié)果,而編譯系統(tǒng)并不提示出錯(cuò),全靠程序員的經(jīng)驗(yàn)來(lái)找出問(wèn)題這就要求編程人員對(duì)出現(xiàn)問(wèn)題的原因有所了解,以便迅速排除故障2.6.3 復(fù)合的賦值運(yùn)算符在賦值符“=”之前加上其他運(yùn)算符,可以構(gòu)成復(fù)合的運(yùn)算符如果在“=”前加一個(gè)“+”運(yùn)算符就成了復(fù)合運(yùn)算符“+=”例如,可以有 a+

44、=3 等價(jià)于 a=a+3 x*=y+8等價(jià)于 x=x*(y+8) x%=3 等價(jià)于 x=x%3以“a+=3”為例來(lái)說(shuō)明,它相當(dāng)于使a進(jìn)行一次自加3的操作即先使a加3,再賦給a同樣,“x*=y+8”的作用是使x乘以(y+8),再賦給x為便于記憶,可以這樣理解: a+= b(其中a為變量,b為表達(dá)式) a+= b (將有下劃線的“a+”移到“=”右側(cè)) a = a + b (在“=”左側(cè)補(bǔ)上變量名a)注意,如果b是包含若干項(xiàng)的表達(dá)式,則相當(dāng)于它有括號(hào)如 x %= y+3 x %= (y+3) x = x%(y+3)(不要錯(cuò)認(rèn)為x=x%y+3)凡是二元(二目)運(yùn)算符,都可以與賦值符一起組合成復(fù)合賦值符C+可以使用以下幾種復(fù)合賦值運(yùn)算符:+=,-=,*=,/=,%=,<<=,>>=,&=,=,|=其中后5種是有關(guān)位運(yùn)算的C+之所以采用這種復(fù)合運(yùn)算符,一是為了簡(jiǎn)化程序,使程序精煉,二是為了提高編譯效率(這樣寫(xiě)法與“逆波蘭”式一致,有利于編譯,能產(chǎn)生質(zhì)量較高的目標(biāo)代碼)專業(yè)的程序員在程序中常用復(fù)合運(yùn)算符,初學(xué)者可能不習(xí)慣,也可以不用或少用2.6.4 賦值表達(dá)式由賦值運(yùn)算符將一個(gè)變量和一個(gè)表達(dá)式連接起來(lái)的式子稱為“賦值表達(dá)式”它的一般形式為<變量> <賦值運(yùn)算符&g

溫馨提示

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

評(píng)論

0/150

提交評(píng)論