譚浩強(qiáng)《C++程序設(shè)計》課件 第2章.ppt
《譚浩強(qiáng)《C++程序設(shè)計》課件 第2章.ppt》由會員分享,可在線閱讀,更多相關(guān)《譚浩強(qiáng)《C++程序設(shè)計》課件 第2章.ppt(72頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第2章 數(shù)據(jù)類型與表達(dá)式,2.1 C++的數(shù)據(jù)類型 2.2 常量 2.3 變量 2.4 C++的運(yùn)算符 2.5 算術(shù)運(yùn)算符與算術(shù)表達(dá)式 2.6 賦值運(yùn)算符與賦值表達(dá)式 2.7 逗號運(yùn)算符與逗號表達(dá)式,計算機(jī)處理的對象是數(shù)據(jù),而數(shù)據(jù)是以某種特定的形式存在的(例如整數(shù)、浮點(diǎn)數(shù)、字符等形式)。不同的數(shù)據(jù)之間往往還存在某些聯(lián)系(例如由若干個整數(shù)組成一個整數(shù)數(shù)組)。數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)的組織形式。例如,數(shù)組就是一種數(shù)據(jù)結(jié)構(gòu)。不同的計算機(jī)語言所允許使用的數(shù)據(jù)結(jié)構(gòu)是不同的。處理同一類問題,如果數(shù)據(jù)結(jié)構(gòu)不同,算法也會不同。例如,對10個整數(shù)排序和對包含10個元素的整型數(shù)組排序的算法是不同的。 C++可以使用的數(shù)
2、據(jù)類型如下:,2.1 C++的數(shù)據(jù)類型,數(shù)據(jù)類型基本類型整型短整型(short int) 整型(int) 長整型(long int) 字符型(char) 浮點(diǎn)型單精度型(float) 雙精度型(double) 長雙精度型(long double) 布爾型(bool) 構(gòu)造類型枚舉類型(enum) 數(shù)組類型 結(jié)構(gòu)體類型(struct) 共用體類型(union) 類類型(class) 指針類型 引用類型 空類型(void) 布爾型就是邏輯型,空類型就是無值型。,,,,,,C++的數(shù)據(jù)包括常量與變量,常量與變量都具有類型。由以上這些數(shù)據(jù)類型還可以構(gòu)成更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。例如利用指針和結(jié)構(gòu)體類型可以構(gòu)成
3、表、樹、棧等復(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ù)的情況。,說明: (1) 整型數(shù)據(jù)分為長整型(long int)、一般整型(int)和短整型(short int)。在int前面加long和short分別表示長整型和短整型。 (2) 整型數(shù)據(jù)的存儲方式為按二進(jìn)制數(shù)形式存儲,例如十進(jìn)制整數(shù)85的二進(jìn)制形式為1010101,則在內(nèi)存中的存儲形式如圖2.1所示。 圖2.1,(3) 在整型符號int和字符型符號char的前面,可以加修飾符signed(表示“
4、有符號”)或unsigned(表示“無符號”)。如果指定為signed,則數(shù)值以補(bǔ)碼形式存放,存儲單元中的最高位(bit)用來表示數(shù)值的符號。如果指定為unsigned,則數(shù)值沒有符號,全部二進(jìn)制位都用來表示數(shù)值本身。例如短整型數(shù)據(jù)占兩個字節(jié) ,見圖2.2。 圖2.2,有符號時,能存儲的最大值為215-1,即32767,最小值為-32768。無符號時,能存儲的最大值為216-1,即65535,最小值為0。有些數(shù)據(jù)是沒有負(fù)值的,可以使用unsigned,它存儲正數(shù)的范圍比用signed時要大一倍。 (4) 浮點(diǎn)型(又稱實型)數(shù)據(jù)分為單精度(float)、雙精度(double)和長雙精度(lon
5、g double)3種,在Visual C++ 6.0中,對float提供6位有效數(shù)字,對double提供15位有效數(shù)字,并且float和double的數(shù)值范圍不同。對float分配4個字節(jié),對double和long double分配8個字節(jié)。 (5) 表中類型標(biāo)識符一欄中,方括號 包含的部分可以省寫,如short和short int等效,unsigned int和unsigned等效。,常量的值是不能改變的,一般從其字面形式即可判別是否為常量。常量包括兩大類,即數(shù)值型常量(即常數(shù))和字符型常量。如12,0,-3為整型常量,4.6,-1.23為實型常量,包含在兩個單撇號之間的字符為字符常量,如
6、a,x。這種從字面形式即可識別的常量稱為“字面常量”或“直接常量”。,2.2 常量 2.2.1 什么是常量,數(shù)值常量就是通常所說的常數(shù)。在C++中,數(shù)值常量是區(qū)分類型的,從字面形式即可識別其類型。 1. 整型常量(整數(shù))的類型 在上一節(jié)中已知道: 整型數(shù)據(jù)可分為int,short int,long int以及unsigned int,unsigned short,unsigned long等類別。整型常量也分為以上類別。為什么將數(shù)值常量區(qū)分為不同的類別呢?因為在進(jìn)行賦值或函數(shù)的參數(shù)虛實結(jié)合時要求數(shù)據(jù)類型匹配。 那么,一個整型常量怎樣從字面上區(qū)分為以上的類別呢?,2.2.2 數(shù)值常量,(1) 一
7、個整數(shù),如果其值在-32768+32767范圍內(nèi),認(rèn)為它是short int型,它可以賦值給short int型、int型和long int型變量。 (2) 一個整數(shù),如果其值超過了上述范圍,而在-2147483648+2147483647范圍內(nèi),則認(rèn)為它是long int型,可以將它賦值給一個int或long int型變量。 (3) 如果某一計算機(jī)系統(tǒng)的C++版本(例如Visual C++)確定int與long int型數(shù)據(jù)在內(nèi)存中占據(jù)的長度相同,則它們能夠表示的數(shù)值的范圍相同。因此,一個int型的常量也同時是一個long int型常量,可以賦給型或long int型變量。 (4) 常量無u
8、nsigned型。但一個非負(fù)值的整數(shù)可以賦值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可。,一個整型常量可以用3種不同的方式表示: (1) 十進(jìn)制整數(shù)。如1357,-432,0等。在一個整型常量后面加一個字母l或L,則認(rèn)為是long int型常量。例如123L,421L,0L等,這往往用于函數(shù)調(diào)用中。如果函數(shù)的形參為long int,則要求實參也為long int型,此時用123作實參不行,而要用123L作實參。 (2) 八進(jìn)制整數(shù)。在常數(shù)的開頭加一個數(shù)字0,就表示這是以八進(jìn)制數(shù)形式表示的常數(shù)。如020表示這是八進(jìn)制數(shù)20,即(20)8,它相當(dāng)于十進(jìn)制數(shù)16。 (3) 十六
9、進(jìn)制整數(shù)。在常數(shù)的開頭加一個數(shù)字0和一個英文字母X(或x),就表示這是以十六進(jìn)制數(shù)形式表示的常數(shù)。如0X20表示這是十六進(jìn)制數(shù)20,即(20)16,它相當(dāng)于十進(jìn)制數(shù)32。,2. 浮點(diǎn)數(shù)的表示方法 一個浮點(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個字節(jié)。如果在實數(shù)的數(shù)字之后加字母F或f,表示此數(shù)為單精度浮點(diǎn)數(shù),如1234F,-43f,占4個字節(jié)。如果加字母L或l,表示此數(shù)為長雙精度數(shù)(lo
10、ng double),在GCC中占12個字節(jié),在Visual C++ 6.0中占8個字節(jié)。,(2) 指數(shù)形式(即浮點(diǎn)形式) 一個浮點(diǎn)數(shù)可以寫成指數(shù)形式,如3.14159可以表示為0.314159101,3.14159100,31.415910-1,314.15910-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ù)字部分??梢钥?/p>
11、到: 由于指數(shù)部分的存在,使得同一個浮點(diǎn)數(shù)可以用不同的指數(shù)形式來表示,數(shù)字部分中小數(shù)點(diǎn)的位置是浮動的。例如:,a=0.314159e1; a=3.14159e0; a=31.4159e-1; a=314.159e-2; 以上4個賦值語句中,用了不同形式的浮點(diǎn)數(shù),但其作用是相同的。 在程序中不論把浮點(diǎn)數(shù)寫成小數(shù)形式還是指數(shù)形式,在內(nèi)存中都是以指數(shù)形式(即浮點(diǎn)形式)存儲的。例如不論在程序中寫成314.159或314.159e0,31.4159e1,3.14159e2, 0.314159e3等形式,在內(nèi)存中都是以規(guī)范化的指數(shù)形式存放,如圖2.3所示。 圖2.3,數(shù)字部分必須小于1,同時,小數(shù)點(diǎn)后面第
12、一個數(shù)字必須是一個非0數(shù)字,例如不能是0.0314159。因此314.159和314.159e0,31.4159e1,3.14159e2, 0.314159e3在內(nèi)存中表示成0.314159103。存儲單元分為兩部分,一部分用來存放數(shù)字部分,一部分用來存放指數(shù)部分。為便于理解,在圖2.3中是用十進(jìn)制表示的,實際上在存儲單元中是用二進(jìn)制數(shù)來表示小數(shù)部分,用2的冪次來表示指數(shù)部分的。 對于以指數(shù)形式表示的數(shù)值常量,也都作為雙精度常量處理。,1. 普通的字符常量 用單撇號括起來的一個字符就是字符型常量。如a,#,%,D都是合法的字符常量,在內(nèi)存中占一個字節(jié)。注意: 字符常量只能包括一個字符,如AB
13、是不合法的。字符常量區(qū)分大小寫字母,如A和a是兩個不同的字符常量。撇號()是定界符,而不屬于字符常量的一部分。如cout<
14、儲形式及其使用方法 將一個字符常量存放到內(nèi)存單元時,實際上并不是把該字符本身放到內(nèi)存單元中去,而是將該字符相應(yīng)的ASCII代碼放到存儲單元中。如果字符變量c1的值為a,c2的值為b,則在變量中存放的是a的ASCII碼97,b 的ASCII碼98,如圖2.4(a)所示,實際上在內(nèi)存中是以二進(jìn)制形式存放的,如圖2.4(b)所示。 圖2.4,既然字符數(shù)據(jù)是以ASCII碼存儲的,它的存儲形式就與整數(shù)的存儲形式類似。這樣,在C++中字符型數(shù)據(jù)和整型數(shù)據(jù)之間就可以通用。一個字符數(shù)據(jù)可以賦給一個整型變量,反之,一個整型數(shù)據(jù)也可以賦給一個字符變量。也可以對字符數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,此時相當(dāng)于對它們的ASCII碼 15、進(jìn)行算術(shù)運(yùn)算。 例2.1 將字符賦給整型變量。 #include using namespace std; int main( ) int i,j; //i和j是整型變量 i=A; //將一個字符常量賦給整型變量i j=B; //將一個字符常量賦給整型變量j cout<
16、把65和66直接存放到i和j的內(nèi)存單元中。因此輸出65和66。 可以看到:在一定條件下,字符型數(shù)據(jù)和整型數(shù)據(jù)是可以通用的。但是應(yīng)注意字符數(shù)據(jù)只占一個字節(jié),它只能存放0255范圍內(nèi)的整數(shù)。,例2.2 字符數(shù)據(jù)與整數(shù)進(jìn)行算術(shù)運(yùn)算。下面程序的作用是將小寫字母轉(zhuǎn)換為大寫字母。 #include using namespace std; int main( ) char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2-32; cout< 17、從ASCII代碼表中可以看到每一個小寫字母比它相應(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時,得到字符A和B(A的ASCII碼為65,B的ASCII碼為66)。,4. 字符串常量 用雙撇號括起來的部分就是字符串常量,如abc,Hello!,a+b,Liping都是字符串常量。字符串常量abc在內(nèi)存中占4個字節(jié)(而不是3個字節(jié)),見圖2.5。 圖2.5 編譯系統(tǒng)會在字符串最后自動加一個0作為字符串結(jié)束標(biāo)志。但0并不是字符串的一部分,它只作 18、為字符串的結(jié)束標(biāo)志。如 cout< 19、后面的字符不能與“”組成一個合法的轉(zhuǎn)義字符(如c),則在編譯時顯示出錯信息。如果希望將“”字符也作為字符串中的一個字符,則應(yīng)寫為abcn,此時字符包括5個字符,即a,b,c,,n。如果有以下輸出語句: cout< 20、; //本行的字符緊連在上一行最后的“”前面字符之后 則輸出: We must study C++ hard!,為了編程和閱讀的方便,在C++程序設(shè)計中,常用一個符號名代表一個常量,稱為符號常量,即以標(biāo)識符形式出現(xiàn)的常量。 例2.3 符號常量的使用。 #define PRICE 30 //注意這不是語句,末尾不要加分號 int main ( ) int num,total; num=10; total=num * PRICE; cout< 21、位中代表常量30,此后凡在本程序單位中出現(xiàn)的PRICE都代表30,可以和常量一樣進(jìn)行運(yùn)算,程序運(yùn)行結(jié)果為 total=300 請注意符號常量雖然有名字,但它不是變量。它的值在其作用域(在本例中為主函數(shù))內(nèi)是不能改變的,也不能被賦值。如用賦值語句“PRICE=40;”給PRICE賦值是錯誤的。 使用符號常量的好處是: (1) 含義清楚。 (2) 在需要改變一個常量時能做到“一改全改”。 如 #define PRICE 35,其實在前面的例子中已經(jīng)多次用到了變量。在程序運(yùn)行期間其值可以改變的量稱為變量。一個變量應(yīng)該有一個名字,并在內(nèi)存中占據(jù)一定的存儲單元,在該存儲單元中存放變量的值。請注意區(qū)分變 22、量名和變量值這兩個不同的概念,見圖2.6。 圖2.6,2.3 變量 2.3.1 什么是變量,先介紹標(biāo)識符的概念。和其他高級語言一樣,用來標(biāo)識變量、符號常量、函數(shù)、數(shù)組、類型等實體名字的有效字符序列稱為標(biāo)識符(identifier)。簡單地說,標(biāo)識符就是一個名字。變量名是標(biāo)識符的一種,變量的名字必須遵循標(biāo)識符的命名規(guī)則。 C++規(guī)定標(biāo)識符只能由字母、數(shù)字和下劃線3種字符組成,且第一個字符必須為字母或下劃線。下面列出的是合法的標(biāo)識符,也是合法的變量名: sum, average, total, day, month, Student_name, tan, BASIC, li_ling 下面是不合法 23、的標(biāo)識符和變量名:,2.3.2 變量名規(guī)則,M.D.John, $123, #33, 3G64, Ling li, C++, Zhang-ling, U.S.A. 注意,在C++中,大寫字母和小寫字母被認(rèn)為是兩個不同的字符。因此,sum和SUM是兩個不同的變量名。一般地,變量名用小寫字母表示,與人們?nèi)粘A?xí)慣一致,以增加可讀性。應(yīng)注意變量名不能與C++的關(guān)鍵字、系統(tǒng)函數(shù)名和類名相同。在國外軟件開發(fā)工作中,常習(xí)慣在變量前面加一個字母以表示該變量的類型,如iCount表示這是一個整型變量,cSex表示這是一個字符型變量。 C++沒有規(guī)定標(biāo)識符的長度(字符個數(shù)),但各個具體的C編譯系統(tǒng)都有自己的規(guī)定。 24、有的系統(tǒng)取32個字符,超過的字符不被識別。,在C++語言中,要求對所有用到的變量作強(qiáng)制定義,也就是必須“先定義,后使用”,如例2.2和例2.3那樣。定義變量的一般形式是 變量類型 變量名表列; 變量名表列指的是一個或多個變量名的序列。如 float a,b,c,d,e; 定義a,b,c,d,e為單精度型變量,注意各變量間以逗號分隔,最后是分號。 可以在定義變量時指定它的初值。如 float a=83.5,b,c=64.5,d=81.2,e; //對變量a,c,d指定了初值,b和d未指定初值,2.3.3 定義變量,C語言要求變量的定義應(yīng)該放在所有的執(zhí)行語句之前,而C++則放松了限制,只要求在 25、第一次使用該變量之前進(jìn)行定義即可。也就是說,它可以出現(xiàn)在語句的中間,如 int a; //定義變量a(在使用a之前定義) a=3; //執(zhí)行語句,對a賦值 float b; //定義變量b(在使用b之前定義) b=4.67; //執(zhí)行語句,對b賦值 char c; //定義變量c(在使用c之前定義) c=A; //執(zhí)行語句 ,對c賦值 C++要求對變量作強(qiáng)制定義的目的是:,(1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確。例如,如果在聲明部分寫了 int student; 而在執(zhí)行語句中錯寫成statent。如 statent=30; 在編譯時 26、檢查出statent未經(jīng)定義,作為錯誤處理。輸出“變量statent未經(jīng)聲明”的信息,便于用戶發(fā)現(xiàn)錯誤,避免變量名使用時出錯。 (2) 每一個變量被指定為一確定類型,在編譯時就能為其分配相應(yīng)的存儲單元。如指定和為int型,一般的編譯系統(tǒng)對其各分配4個字節(jié),并按整數(shù)方式存儲數(shù)據(jù)。,(3) 指定每一變量屬于一個特定的類型,這就便于在編譯時,據(jù)此檢查該變量所進(jìn)行的運(yùn)算是否合法。例如,整型變量a和b,可以進(jìn)行求余運(yùn)算: a%b 是“求余”(見24 節(jié)),得到a/b的余數(shù)。如果將a和b指定為實型變量,則不允許進(jìn)行“求余”運(yùn)算,在編譯時會給出有關(guān)的出錯信息。,允許在定義變量時對它賦予一個初值,這稱為變量初 27、始化。初值可以是常量,也可以是一個有確定值的表達(dá)式。如 float a,b=5.78*3.5,c=2*sin(2.0); 表示定義了a,b,c為單精度浮點(diǎn)型變量,對b初始化為5.78*3, 對c初始化為2*sin(2.0),在編譯連接后,從標(biāo)準(zhǔn)函數(shù)庫得到正弦函數(shù)sin(2.0)的值,因此變量c有確定的初值。變量a未初始化。 如果對變量未賦初值,則該變量的初值是一個不可預(yù)測的值,即該存儲單元中當(dāng)時的內(nèi)容是不知道的。例如,若未對a和b賦值,執(zhí)行輸出語句,2.3.4 為變量賦初值,cout<
28、(各次運(yùn)行情況可能不同) 初始化不是在編譯階段完成的(只有在第4章中介紹的靜態(tài)存儲變量和外部變量的初始化是在編譯階段完成的),而是在程序運(yùn)行時執(zhí)行本函數(shù)時賦予初值的,相當(dāng)于執(zhí)行一個賦值語句。例如, int a=3; 相當(dāng)于以下兩個語句 : int a; // 指定為整型變量 a=3; // 賦值語句,將賦給,對多個變量賦予同一初值,必須分別指定,不能寫成 float a=b=c=4.5; 而應(yīng)寫成 float a=4.5,b=4.5,c=4.5; 或 float a,b,c=4.5; a=b=c;,在定義變量時,如果加上關(guān)鍵字const,則變量的值在程序運(yùn)行期間不能改變,這種變量稱 29、為常變量(constant variable)。例如, const int a=3; //用const來聲明這種變量的值不能改變,指定其值始終為3 在定義常變量時必須同時對它初始化(即指定其值),此后它的值不能再改變。常變量不能出現(xiàn)在賦值號的左邊。例如上面一行不能寫成 const int a; a=3; //常變量不能被賦值 可以用表達(dá)式對常變量初始化,如,2.3.5 常變量,const int b=3+6,c=3*cos(1.5); //b的值被指定為9,c的值被指定為3*cos(1.5) 但應(yīng)注意,由于使用了系統(tǒng)標(biāo)準(zhǔn)數(shù)學(xué)函數(shù)cos,必須將包含該函數(shù)有關(guān)的信息的頭文件“c 30、math”(或math.h)包含到本程序單位中來,可以在本程序單位的開頭加上以下#include命令: #include 或 #include 變量的值應(yīng)該是可以變化的,怎么值是固定的量也稱變量呢?其實,從計算機(jī)實現(xiàn)的角度看,變量的特征是存在一個以變量名命名的存儲單元,在一般情況下,存儲單元中的內(nèi)容是可以變化的。對常變量來說,無非在此變量的基礎(chǔ)上加上一個限定: 存儲單元中的值不允許變化。因此常變量又稱為只讀變量(read-only-variable)。,請區(qū)別用#define命令定義的符號常量和用const定義的常變量。符號常量只是用一個符號代替一個字符串,在預(yù)編譯時把所有符號常量替換為所指定 31、的字符串,它沒有類型,在內(nèi)存中并不存在以符號常量命名的存儲單元。而常變量具有變量的特征,它具有類型,在內(nèi)存中存在著以它命名的存儲單元,可以用sizeof運(yùn)算符測出其長度。與一般變量惟一的不同是指定變量的值不能改變。用#define命令定義符號常量是C語言所采用的方法,C++把它保留下來是為了和C兼容。C++的程序員一般喜歡用const定義常變量。雖然二者實現(xiàn)的方法不同,但從使用的角度看,都可以認(rèn)為用了一個標(biāo)識符代表了一個常量。有些書上把用const定義的常變量也稱為定義常量,但讀者應(yīng)該了解它和符號常量的區(qū)別。,C++的運(yùn)算符十分豐富,使得C++的運(yùn)算十分靈活方便。例如把賦值號(=)也作為運(yùn)算符 32、處理,這樣,a=b=c=4就是合法的表達(dá)式,這是與其他語言不同的。C++提供了以下運(yùn)算符: (1) 算術(shù)運(yùn)算符 +(加)-(減) *(乘) /(除) %(整除求余)++(自加) --(自減) (2) 關(guān)系運(yùn)算符 (大于)(小于) (等于)(大于或等于)(小于或等于)!(不等于),2.4 C++的運(yùn)算符,() 邏輯運(yùn)算符 (邏輯與) ||(邏輯或) !(邏輯非) () 位運(yùn)算符 (按位右移) (按位與) |(按位或) (按位異或) (按位取反) () 賦值運(yùn)算符 (及其擴(kuò)展賦值運(yùn)算符) () 條件運(yùn)算符 (?:) () 逗號運(yùn)算符 (,) () 指針運(yùn)算符 (*) (9) 引用運(yùn)算符和地址運(yùn) 33、算符 () (10) 求字節(jié)數(shù)運(yùn)算符() (11) 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符( (類型) 或類型( )),(12) 成員運(yùn)算符 (.) (13) 指向成員的運(yùn)算符 (-) (14) 下標(biāo)運(yùn)算符 ( ) (15) 其他 (如函數(shù)調(diào)用運(yùn)算符()) 在本章中主要介紹算術(shù)運(yùn)算符與算術(shù)表達(dá)式,賦值運(yùn)算符與賦值表達(dá)式,逗號運(yùn)算符與逗號表達(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ù),如的值為)。,2.5 算術(shù)運(yùn)算符與算術(shù)表達(dá) 34、式 2.5.1 基本的算術(shù)運(yùn)算符,需要說明,兩個整數(shù)相除的結(jié)果為整數(shù),如5/3的結(jié)果值為1,舍去小數(shù)部分。但是,如果除數(shù)或被除數(shù)中有一個為負(fù)值,則舍入的方向是不固定的。例如,-5/3在有的C++系統(tǒng)上得到結(jié)果-1,有的C++系統(tǒng)則給出結(jié)果-2。多數(shù)編譯系統(tǒng)采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠攏。 如果參加+, -, *, / 運(yùn)算的兩個數(shù)中有一個數(shù)為float型數(shù)據(jù),則運(yùn)算的結(jié)果是double型,因為C++在運(yùn)算時對所有float型數(shù)據(jù)都按double型數(shù)據(jù)處理。,用算術(shù)運(yùn)算符和括號將運(yùn)算對象(也稱操作數(shù))連接起來的、符合C++語法規(guī)則的式子,稱C++ 35、算術(shù)表達(dá)式。運(yùn)算對象包括常量、變量、函數(shù)等。例如,下面是一個合法的C++算術(shù)表達(dá)式: a*b/c-1.5+a C++語言規(guī)定了運(yùn)算符的優(yōu)先級和結(jié)合性。在求解表達(dá)式時,先按運(yùn)算符的優(yōu)先級別高低次序執(zhí)行,例如先乘除后加減。如有表達(dá)式a-b*c,b的左側(cè)為減號,右側(cè)為乘號,而乘號優(yōu)先于減號,因此,相當(dāng)于a-(b*c)。如果在一個運(yùn)算對象兩側(cè)的運(yùn)算符的優(yōu)先級別相同,如a-b+c,則按規(guī)定的“結(jié)合方向”處理。,2.5.2 算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級與結(jié)合性,C++規(guī)定了各種運(yùn)算符的結(jié)合方向(結(jié)合性),算術(shù)運(yùn)算符的結(jié)合方向為“自左至右”,即先左后右,因此b先與減號結(jié)合,執(zhí)行a-b的運(yùn)算,再執(zhí)行加c的運(yùn)算。 36、“自左至右的結(jié)合方向”又稱“左結(jié)合性”,即運(yùn)算對象先與左面的運(yùn)算符結(jié)合。以后可以看到有些運(yùn)算符的結(jié)合方向為“自右至左”,即右結(jié)合性(例如賦值運(yùn)算符)。關(guān)于“結(jié)合性”的概念在其他一些高級語言中是沒有的,是C和C++的特點(diǎn)之一,希望能弄清楚。附錄B列出了所有運(yùn)算符以及它們的優(yōu)先級別和結(jié)合性。,在表達(dá)式中常遇到不同類型數(shù)據(jù)之間進(jìn)行運(yùn)算,如 10+a+1.5-8765.1234*b 在進(jìn)行運(yùn)算時,不同類型的數(shù)據(jù)要先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算。轉(zhuǎn)換的規(guī)則按圖2.7所示。 圖2.7,2.5.3 表達(dá)式中各類數(shù)值型數(shù)據(jù)間的混合運(yùn)算,假設(shè)已指定為整型變量,為float變量,為double型變量,為long 37、型,有下面表達(dá)式: 10+a+i*f-d/e 運(yùn)算次序為: 進(jìn)行10+a的運(yùn)算,先將轉(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)后加若干個0,即107.00000),結(jié)果為double型。將變量e轉(zhuǎn)換成double型,d/e結(jié)果為double型。將10+a+i*f的結(jié)果與d/e的商相減,結(jié)果為double型。 上述的類型轉(zhuǎn)換是由系統(tǒng)自動進(jìn)行的。,在C和C++中,常在表達(dá)式中使用自增(++)和自減(--)運(yùn)算符,他們的作用是使變量的值增1或減1,如 ++i(在使用i 38、之前,先使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)?),2.5.4 自增和自減運(yùn)算符,++i是先執(zhí)行ii+1后,再使用i的值;而i++是先使用i的值后,再執(zhí)行ii+1。 正確地使用++和--,可以使程序簡潔、清晰、高效。 請注意: (1) 自增運(yùn)算符(++)和自減運(yùn)算符(--)只能用 39、于變量,而不能用于常量或表達(dá)式。 (2) ++和--的結(jié)合方向是“自右至左”,見附錄B。 (3) 自增運(yùn)算符(++)和自減運(yùn)算符(--)使用十分靈活,但在很多情況下可能出現(xiàn)歧義性,產(chǎn)生“意想不到”的副作用。 (4) 自增(減)運(yùn)算符在C++程序中是經(jīng)常見到的,常用于循環(huán)語句中,使循環(huán)變量自動加1。也用于指針變量,使指針指向下一個地址。,在表達(dá)式中不同類型的數(shù)據(jù)會自動地轉(zhuǎn)換類型,以進(jìn)行運(yùn)算。有時程序編制者還可以利用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符將一個表達(dá)式轉(zhuǎn)換成所需類型。例如: (double) (將a轉(zhuǎn)換成double類型) (int)(x+y) (將x+y的值轉(zhuǎn)換成整型) (float)( 40、5%3) (將5%3的值轉(zhuǎn)換成float型) 強(qiáng)制類型轉(zhuǎn)換的一般形式為 (類型名)(表達(dá)式) 注意: 如果要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的對象是一個變量,該變量可以不用括號括起來。如果要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的對象是一個包含多項的表達(dá)式,則表達(dá)式應(yīng)該用括號括起來。如果寫成,2.5.5 強(qiáng)制類型轉(zhuǎn)換運(yùn)算符,() 則只將轉(zhuǎn)換成整型,然后與相加。 以上強(qiáng)制類型轉(zhuǎn)換的形式是原來C語言使用的形式,C++把它保留了下來,以利于兼容。C++還增加了以下形式: 類型名(表達(dá)式) 如int(x) 或 int(x+y) 類型名不加括號,而變量或表達(dá)式用括號括起來。這種形式類似于函數(shù)調(diào)用。但許多人仍習(xí)慣于用第一種形式,把類型名 41、包在括號內(nèi),這樣比較清楚。 需要說明的是在強(qiáng)制類型轉(zhuǎn)換時,得到一個所需類型的中間變量,但原來變量的類型未發(fā)生變化。例如:,(int)x 如果原指定為float型,值為3.6,進(jìn)行強(qiáng)制類型運(yùn)算后得到一個int型的中間變量,它的值等于3,而原來的類型和值都不變。 例2.4 強(qiáng)制類型轉(zhuǎn)換。 #include using namespace std; int main( ) float x; int i; x=3.6; i=(int)x; cout< 42、種類型轉(zhuǎn)換,一種是在運(yùn)算時不必用戶指定,系統(tǒng)自動進(jìn)行的類型轉(zhuǎn)換,如3+6.5。第二種是強(qiáng)制類型轉(zhuǎn)換。當(dāng)自動類型轉(zhuǎn)換不能實現(xiàn)目的時,可以用強(qiáng)制類型轉(zhuǎn)換。此外,在函數(shù)調(diào)用時,有時為了使實參與形參類型一致,可以用強(qiáng)制類型轉(zhuǎn)換運(yùn)算符得到一個所需類型的參數(shù)。,賦值符號“”就是賦值運(yùn)算符,它的作用是將一個數(shù)據(jù)賦給一個變量。如“a=3”的作用是執(zhí)行一次賦值操作(或稱賦值運(yùn)算)。把常量3賦給變量a。也可以將一個表達(dá)式的值賦給一個變量。,2.6 賦值運(yùn)算符與賦值表達(dá)式 2.6.1 賦值運(yùn)算符,如果賦值運(yùn)算符兩側(cè)的類型不一致,但都是數(shù)值型或字符型時,在賦值時會自動進(jìn)行類型轉(zhuǎn)換。 (1) 將浮點(diǎn)型數(shù)據(jù)(包括單、雙精 43、度)賦給整型變量時,舍棄其小數(shù)部分。 (2) 將整型數(shù)據(jù)賦給浮點(diǎn)型變量時,數(shù)值不變,但以指數(shù)形式存儲到變量中。 (3) 將一個double型數(shù)據(jù)賦給float變量時,要注意數(shù)值范圍不能溢出。 (4) 字符型數(shù)據(jù)賦給整型變量,將字符的ASCII碼賦給整型變量。,2.6.2 賦值過程中的類型轉(zhuǎn)換,(5) 將一個int、short或long型數(shù)據(jù)賦給一個char型變量,只將其低8位原封不動地送到char型變量(發(fā)生截斷)。例如 short int i=289; char c; c=i; //將一個int型數(shù)據(jù)賦給一個char型變量 賦值情況見圖2.8。為方便起見,以一個int型數(shù)據(jù)占兩個字節(jié) 44、(16位)的情況來說明。 圖2.8,(6) 將signed(有符號)型數(shù)據(jù)賦給長度相同的unsigned(無符號)型變量,將存儲單元內(nèi)容原樣照搬(連原有的符號位也作為數(shù)值一起傳送)。 例2.5 將有符號數(shù)據(jù)傳送給無符號變量。 #include using namespace std; int main( ) unsigned short a; short int b=-1; a=b; cout<
45、111(即全部16個二進(jìn)制位均為1),將它傳送給a,而a是無符號型變量,16個位全1是十進(jìn)制的65535。如果b為正值,且在032767之間,則賦值后數(shù)值不變。,不同類型的整型數(shù)據(jù)間的賦值歸根結(jié)底就是一條:按存儲單元中的存儲形式直接傳送。 C和C++使用靈活,在不同類型數(shù)據(jù)之間賦值時,常常會出現(xiàn)意想不到的結(jié)果,而編譯系統(tǒng)并不提示出錯,全靠程序員的經(jīng)驗來找出問題。這就要求編程人員對出現(xiàn)問題的原因有所了解,以便迅速排除故障。,在賦值符“”之前加上其他運(yùn)算符,可以構(gòu)成復(fù)合的運(yùn)算符。如果在“”前加一個“”運(yùn)算符就成了復(fù)合運(yùn)算符“”。例如,可以有 a+=3 等價于 a=a+3 x*=y+8 等價 46、于 x=x*(y+8) x%=3 等價于 x=x%3 以“a+=3”為例來說明,它相當(dāng)于使a進(jìn)行一次自加3的操作。即先使a加3,再賦給a。同樣,“x*=y+8”的作用是使x乘以(y+8),再賦給x。 為便于記憶,可以這樣理解:,2.6.3 復(fù)合的賦值運(yùn)算符, a+= b (其中a為變量,b為表達(dá)式) a+= b (將有下劃線的“a+”移到“=”右側(cè)) a = a + b (在“=”左側(cè)補(bǔ)上變量名a) 注意,如果b是包含若干項的表達(dá)式,則相當(dāng)于它有括號。如 x %= y+3 x %= (y+3) x = x%(y+3)(不要錯認(rèn)為x=x%y+3),凡是二元(二目)運(yùn)算符,都可以 47、與賦值符一起組合成復(fù)合賦值符。C++可以使用以下幾種復(fù)合賦值運(yùn)算符: ,,*,,,, b=a; // b是左值 c=b; // b也是右值 賦值表達(dá)式中的“表達(dá)式”,又可以是一個賦值表達(dá)式。如 a=(b=5) 下面是賦值表達(dá)式的例子: a=b=c=5 (賦值表達(dá)式值為5,a,b,c值均為5) a=5+(c=6) (表達(dá)式值為11,a值為11,c值為6) a=(b=4)+(c=6) (表達(dá)式值為10,a值為10,b等于4,c等于6) a=(b=10)/(c=2) (表達(dá)式值為5,a等于5,b等于10,c等于2),請分析下面的賦值表達(dá)式: (a=3 48、*5)=4*3 賦值表達(dá)式作為左值時應(yīng)加括號,如果寫成下面這樣就會出現(xiàn)語法錯誤: a=3*5=4*3 因為3*5不是左值,不能出現(xiàn)在賦值運(yùn)算符的左側(cè)。 賦值表達(dá)式也可以包含復(fù)合的賦值運(yùn)算符。如 a+=a-=a*a 也是一個賦值表達(dá)式。如果a的初值為12,此賦值表達(dá)式的求解步驟如下: 先進(jìn)行“a-=a*a”的運(yùn)算,它相當(dāng)于a=a-a*a=12-144-132。, 再進(jìn)行“a+=-132”的運(yùn)算,它相當(dāng)于a=a+(-132)132-132-264。 C++將賦值表達(dá)式作為表達(dá)式的一種,使賦值操作不僅可以出現(xiàn)在賦值語句中,而且可以以表達(dá)式形式出現(xiàn)在其他語句(如輸出語句、循環(huán)語句等)中。這是C++語言 49、靈活性的一種表現(xiàn)。 請注意,用cout語句輸出一個賦值表達(dá)式的值時,要將該賦值表達(dá)式用括號括起來,如果寫成“cout<
50、值后得到a的值為15,然后求解a*4,得60。整個逗號表達(dá)式的值為60。 一個逗號表達(dá)式又可以與另一個表達(dá)式組成一個新的逗號表達(dá)式,如 (a=3*5,a*4),a+5 逗號表達(dá)式的一般形式可以擴(kuò)展為 表達(dá)式,表達(dá)式,表達(dá)式,,表達(dá)式 它的值為表達(dá)式的值。 從附錄B可知,逗號運(yùn)算符是所有運(yùn)算符中級別最低的。因此,下面兩個表達(dá)式的作用是不同的:, x=(a=3,6*3) x=a=3,6*a 其實,逗號表達(dá)式無非是把若干個表達(dá)式“串聯(lián)”起來。在許多情況下,使用逗號表達(dá)式的目的只是想分別得到各個表達(dá)式的值,而并非一定需要得到和使用整個逗號表達(dá)式的值,逗號表達(dá)式最常用于循環(huán)語句(for語句)中,詳見第3章。 在用cout輸出一個逗號表達(dá)式的值時,要將該逗號表達(dá)式用括號括起來,如 cout<<(3*5,43-6*5,67/3)<
- 溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 蘇教版五上《小數(shù)乘整數(shù)》ppt課件
- 蘇教版一年級數(shù)學(xué)上冊《數(shù)一數(shù)》ppt課件
- 江南1優(yōu)秀課件
- 提高印字質(zhì)量課件
- 服務(wù)分銷策略課件
- 數(shù)學(xué)必修蘇教版互斥事件課件3(共32張PPT)
- 第三章要素費(fèi)用的核算PPT優(yōu)秀資料
- 元素的質(zhì)量分?jǐn)?shù)計算答案
- 圖形的欣賞與設(shè)計
- 八年級下期Uuit10SectionA課件
- 部編七年級語文下冊4孫權(quán)勸學(xué)課件
- 部編一年級語文下冊端午粽課件
- 超市防損的技能課件
- 表彰班會教學(xué)課件教學(xué)課件
- 第17講中考數(shù)學(xué)專題復(fù)習(xí) 函數(shù)的綜合應(yīng)用中考數(shù)學(xué)專題復(fù)習(xí)課件課件各版通用