




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上第2章 數據類型與表達式2.1 C+的數據類型2.2 常量2.3 變量2.4 C+的運算符2.5 算術運算符與算術表達式2.6 賦值運算符與賦值表達式2.7 逗號運算符與逗號表達式2.1 C+的數據類型計算機處理的對象是數據,而數據是以某種特定的形式存在的(例如整數浮點數字符等形式)不同的數據之間往往還存在某些聯系(例如由若干個整數組成一個整數數組)數據結構指的是數據的組織形式例如,數組就是一種數據結構不同的計算機語言所允許使用的數據結構是不同的處理同一類問題,如果數據結構不同,算法也會不同例如,對10個整數排序和對包含10個元素的整型數組排序的算法是不同的C+可以使
2、用的數據類型如下:C+的數據包括常量與變量,常量與變量都具有類型由以上這些數據類型還可以構成更復雜的數據結構例如利用指針和結構體類型可以構成表樹棧等復雜的數據結構C+并沒有統一規定各類數據的精度數值范圍和在內存中所占的字節數,各C+編譯系統根據自己的情況作出安排書中表2.1列出了Visual C+數值型和字符型數據的情況說明:(1) 整型數據分為長整型(long int)一般整型(int)和短整型(short int)在int前面加long和short分別表示長整型和短整型(2) 整型數據的存儲方式為按二進制數形式存儲,例如十進制整數85的二進制形式為,則在內存中的存儲形式如圖2.1所示圖2.
3、1(3) 在整型符號int和字符型符號char的前面,可以加修飾符signed(表示“有符號”)或unsigned(表示“無符號”)如果指定為signed,則數值以補碼形式存放,存儲單元中的最高位(bit)用來表示數值的符號如果指定為unsigned,則數值沒有符號,全部二進制位都用來表示數值本身例如短整型數據占兩個字節 ,見圖2.2圖2.2有符號時,能存儲的最大值為215-1,即32767,最小值為-32768無符號時,能存儲的最大值為216-1,即65535,最小值為0有些數據是沒有負值的,可以使用unsigned,它存儲正數的范圍比用signed時要大一倍(4) 浮點型(又稱實型)數據分
4、為單精度(float)雙精度(double)和長雙精度(long double)3種,在Visual C+ 6.0中,對float提供6位有效數字,對double提供15位有效數字,并且float和double的數值范圍不同對float分配4個字節,對double和long double分配8個字節(5) 表中類型標識符一欄中,方括號 包含的部分可以省寫,如short和short int等效,unsigned int和unsigned等效常量的值是不能改變的,一般從其字面形式即可判別是否為常量常量包括兩大類,即數值型常量(即常數)和字符型常量如12,0,-3為整型常量,4.6,-1.23為實型
5、常量,包含在兩個單撇號之間的字符為字符常量,如a,x這種從字面形式即可識別的常量稱為“字面常量”或“直接常量”2.2 常量2.2.1 什么是常量2.2.2 數值常量數值常量就是通常所說的常數在C+中,數值常量是區分類型的,從字面形式即可識別其類型1. 整型常量(整數)的類型在上一節中已知道: 整型數據可分為int,short int,long int以及unsigned int,unsigned short,unsigned long等類別整型常量也分為以上類別為什么將數值常量區分為不同的類別呢?因為在進行賦值或函數的參數虛實結合時要求數據類型匹配那么,一個整型常量怎樣從字面上區分為以上的類別
6、呢?(1) 一個整數,如果其值在-32768+32767范圍內,認為它是short int型,它可以賦值給short int型int型和long int型變量(2) 一個整數,如果其值超過了上述范圍,而在-+范圍內,則認為它是long int型,可以將它賦值給一個int或long int型變量(3) 如果某一計算機系統的C+版本(例如Visual C+)確定int與long int型數據在內存中占據的長度相同,則它們能夠表示的數值的范圍相同因此,一個int型的常量也同時是一個long int型常量,可以賦給int型或long int型變量(4) 常量無unsigned型但一個非負值的整數可以賦
7、值給unsigned整型變量,只要它的范圍不超過變量的取值范圍即可一個整型常量可以用3種不同的方式表示: (1) 十進制整數如1357,-432,0等在一個整型常量后面加一個字母l或L,則認為是long int型常量例如123L,421L,0L等,這往往用于函數調用中如果函數的形參為long int,則要求實參也為long int型,此時用123作實參不行,而要用123L作實參(2) 八進制整數在常數的開頭加一個數字0,就表示這是以八進制數形式表示的常數如020表示這是八進制數20,即(20)8,它相當于十進制數16(3) 十六進制整數在常數的開頭加一個數字0和一個英文字母X(或x),就表示這
8、是以十六進制數形式表示的常數如0X20表示這是十六進制數20,即(20)16,它相當于十進制數322. 浮點數的表示方法一個浮點數可以用兩種不同的方式表示: (1) 十進制小數形式如21.456,-7.98等它一般由整數部分和小數部分組成,可以省略其中之一(如78.或.06,.0),但不能二者皆省略C+編譯系統把用這種形式表示的浮點數一律按雙精度常量處理,在內存中占8個字節如果在實數的數字之后加字母F或f,表示此數為單精度浮點數,如1234F,-43f,占4個字節如果加字母L或l,表示此數為長雙精度數(long double),在GCC中占12個字節,在Visual C+ 6.0中占8個字節(
9、2) 指數形式(即浮點形式)一個浮點數可以寫成指數形式,如3.14159可以表示為0.×101,3.14159×100,31.4159×10-1,314.159×10-2等形式在程序中應表示為: 0.e1,3.14159e0,31.4159e-1 ,314.159e-2,用字母e表示其后的數是以10為底的冪,如e12表示1012其一般形式為數符 數字部分 指數部分上面各數據中的0.,3.14159, 31.4159, 314.159 等就是其中的數字部分可以看到: 由于指數部分的存在,使得同一個浮點數可以用不同的指數形式來表示,數字部分中小數點的位置是浮
10、動的例如: a=0.e1;a=3.14159e0;a=31.4159e-1;a=314.159e-2;以上4個賦值語句中,用了不同形式的浮點數,但其作用是相同的在程序中不論把浮點數寫成小數形式還是指數形式,在內存中都是以指數形式(即浮點形式)存儲的例如不論在程序中寫成314.159或314.159e0,31.4159e1,3.14159e2, 0.e3等形式,在內存中都是以規范化的指數形式存放,如圖2.3所示圖2.3數字部分必須小于1,同時,小數點后面第一個數字必須是一個非0數字,例如不能是0.因此314.159和314.159e0,31.4159e1,3.14159e2, 0.e3在內存中表
11、示成0.×103存儲單元分為兩部分,一部分用來存放數字部分,一部分用來存放指數部分為便于理解,在圖2.3中是用十進制表示的,實際上在存儲單元中是用二進制數來表示小數部分,用2的冪次來表示指數部分的對于以指數形式表示的數值常量,也都作為雙精度常量處理 2.2.3 字符常量1. 普通的字符常量用單撇號括起來的一個字符就是字符型常量如a,#,%,D都是合法的字符常量,在內存中占一個字節注意: 字符常量只能包括一個字符,如AB 是不合法的字符常量區分大小寫字母,如A和a是兩個不同的字符常量撇號()是定界符,而不屬于字符常量的一部分如cout<<a;輸出的是一個字母“a”,而不是3
12、個字符“a ”2. 轉義字符常量除了以上形式的字符常量外,C+還允許用一種特殊形式的字符常量,就是以 “”開頭的字符序列例如,n代表一個“換行”符“cout<<n; ” 將輸出一個換行,其作用與“cout<<endl; ” 相同這種“控制字符”,在屏幕上是不能顯示的在程序中也無法用一個一般形式的字符表示,只能采用特殊形式來表示常用的以“”開頭的特殊字符見書中表2.23. 字符數據在內存中的存儲形式及其使用方法將一個字符常量存放到內存單元時,實際上并不是把該字符本身放到內存單元中去,而是將該字符相應的ASCII代碼放到存儲單元中如果字符變量c1的值為a,c2的值為b,則在
13、變量中存放的是a的ASCII碼97,b 的ASCII碼98,如圖2.4(a)所示,實際上在內存中是以二進制形式存放的,如圖2.4(b)所示圖2.4既然字符數據是以ASCII碼存儲的,它的存儲形式就與整數的存儲形式類似這樣,在C+中字符型數據和整型數據之間就可以通用一個字符數據可以賦給一個整型變量,反之,一個整型數據也可以賦給一個字符變量也可以對字符數據進行算術運算,此時相當于對它們的ASCII碼進行算術運算例2.1 將字符賦給整型變量#include <iostream>using namespace std;int main( ) int i,j; /i和j是整型變量i=A; /
14、將一個字符常量賦給整型變量ij=B; /將一個字符常量賦給整型變量jcout<<i<< <<j<<n; /輸出整型變量i和j的值,n 是換行符return 0;執行時輸出 65 66i和j被指定為整型變量但在第5和第6行中,將字符A和B分別賦給i和j,它的作用相當于以下兩個賦值語句:i=65;j=66;因為A和B的ASCII碼為65和66在程序的第5和第6行是把65和66直接存放到i和j的內存單元中因此輸出65和66可以看到:在一定條件下,字符型數據和整型數據是可以通用的但是應注意字符數據只占一個字節,它只能存放0255范圍內的整數例2.2 字符
15、數據與整數進行算術運算下面程序的作用是將小寫字母轉換為大寫字母#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;運行結果為A Ba的ASCII碼為97,而A的ASCII碼為65,b為98,B為66從ASCII代碼表中可以看到每一個小寫字母比它相應的大寫字母的ASCII代碼大32C+符數據與數值直接進行算術運算,a-32得到整數65,b-
16、32得到整數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在內存中占4個字節(而不是3個字節),見圖2.5圖2.5編譯系統會在字符串最后自動加一個0作為字符串結束標志但0并不是字符串的一部分,它只作為字符串的結束標志如cout<<abc<<endl;輸出3個字符abc,而不包括0注意: a和a代表不同的含義,a是字符串常量,a 是字符常
17、量前者占兩個字節,后者占1個字節請分析下面的程序片段: char c;/定義一個字符變量c=a;/正確c=a; /錯誤,c只能容納一個字符字符串常量要用字符數組來存放,見第5章請思考: 字符串常量abcn包含幾個字符?不是5個而是4個字符,其中“n”是一個轉義字符但它在內存中占5個字節(包括一個“0”字符) 編譯系統遇到“”時就會把它認作轉義字符的標志,把它和其后的字符一起作為一個轉義字符如果“”后面的字符不能與“”組成一個合法的轉義字符(如c),則在編譯時顯示出錯信息如果希望將“”字符也作為字符串中的一個字符,則應寫為abcn,此時字符包括5個字符,即a,b,c,n如果有以下輸出語句:cou
18、t<<abcn<<endl;則會輸出: abc,然后換行同理執行cout<<I say Thank you!n;的輸出是: I say Thank you!如果在一個字符串中最后一個字符為“”,則表示它是續行符,下一行的字符是該字符串的一部分,且在兩行字符串間無空格如cout<<We must study C/本行最后的“”后面的空格和換行均不起作用+ hard!;/本行的字符緊連在上一行最后的“”前面字符之后則輸出: We must study C+ hard!2.2.4 符號常量為了編程和閱讀的方便,在C+程序設計中,常用一個符號名代表一個常
19、量,稱為符號常量,即以標識符形式出現的常量例2.3 符號常量的使用#define PRICE 30 /注意這不是語句,末尾不要加分號int main ( ) int num,total;num=10;total=num * PRICE;cout<<total=<<total<<endl;return 0; 程序中用預處理命令#define指定PRICE在本程序單位中代表常量30,此后凡在本程序單位中出現的PRICE都代表30,可以和常量一樣進行運算,程序運行結果為 total=300 請注意符號常量雖然有名字,但它不是變量它的值在其作用域(在本例中為主函數)
20、內是不能改變的,也不能被賦值如用賦值語句“PRICE=40;”給PRICE賦值是錯誤的 使用符號常量的好處是:(1) 含義清楚(2) 在需要改變一個常量時能做到“一改全改” 如#define PRICE 352.3 變量2.3.1 什么是變量其實在前面的例子中已經多次用到了變量在程序運行期間其值可以改變的量稱為變量一個變量應該有一個名字,并在內存中占據一定的存儲單元,在該存儲單元中存放變量的值請注意區分變量名和變量值這兩個不同的概念,見圖2.6圖2.62.3.2 變量名規則先介紹標識符的概念和其他高級語言一樣,用來標識變量符號常量函數數組類型等實體名字的有效字符序列稱為標識符(identifi
21、er)簡單地說,標識符就是一個名字變量名是標識符的一種,變量的名字必須遵循標識符的命名規則C+規定標識符只能由字母數字和下劃線3種字符組成,且第一個字符必須為字母或下劃線下面列出的是合法的標識符,也是合法的變量名:sum, average, total, day, month, Student_name, tan, BASIC, li_ling下面是不合法的標識符和變量名:M.D.John, $123, #33, 3G64, Ling li, C+, Zhang-ling, U.S.A.注意,在C+中,大寫字母和小寫字母被認為是兩個不同的字符因此,sum和SUM是兩個不同的變量名一般地,變量名
22、用小寫字母表示,與人們日常習慣一致,以增加可讀性應注意變量名不能與C+的關鍵字系統函數名和類名相同在國外軟件開發工作中,常習慣在變量前面加一個字母以表示該變量的類型,如iCount表示這是一個整型變量,cSex表示這是一個字符型變量C+沒有規定標識符的長度(字符個數),但各個具體的C編譯系統都有自己的規定有的系統取32個字符,超過的字符不被識別2.3.3 定義變量在C+語言中,要求對所有用到的變量作強制定義,也就是必須“先定義,后使用”,如例2.2和例2.3那樣定義變量的一般形式是 變量類型 變量名表列;變量名表列指的是一個或多個變量名的序列如float a,b,c,d,e;定義a,b,c,d
23、,e為單精度型變量,注意各變量間以逗號分隔,最后是分號可以在定義變量時指定它的初值如 float a=83.5,b,c=64.5,d=81.2,e; /對變量a,c,d指定了初值,b和d未指定初值C語言要求變量的定義應該放在所有的執行語句之前,而C+則放松了限制,只要求在第一次使用該變量之前進行定義即可也就是說,它可以出現在語句的中間,如int a;/定義變量a(在使用a之前定義)a=3; /執行語句,對a賦值float b; /定義變量b(在使用b之前定義)b=4.67; /執行語句,對b賦值char c; /定義變量c(在使用c之前定義)c=A; /執行語句 ,對c賦值C+要求對變量作強制
24、定義的目的是:(1) 凡未被事先定義的,不作為變量名,這就能保證程序中變量名使用得正確例如,如果在聲明部分寫了int student;而在執行語句中錯寫成statent如statent=30;在編譯時檢查出statent未經定義,作為錯誤處理輸出“變量statent未經聲明”的信息,便于用戶發現錯誤,避免變量名使用時出錯(2) 每一個變量被指定為一確定類型,在編譯時就能為其分配相應的存儲單元如指定a和b為int型,一般的編譯系統對其各分配4個字節,并按整數方式存儲數據(3) 指定每一變量屬于一個特定的類型,這就便于在編譯時,據此檢查該變量所進行的運算是否合法例如,整型變量a和b,可以進行求余運
25、算:a%b%是“求余”(見2.4 節),得到a/b的余數如果將a和b指定為實型變量,則不允許進行“求余”運算,在編譯時會給出有關的出錯信息2.3.4 為變量賦初值 允許在定義變量時對它賦予一個初值,這稱為變量初始化初值可以是常量,也可以是一個有確定值的表達式如float a,b=5.78*3.5,c=2*sin(2.0);表示定義了a,b,c為單精度浮點型變量,對b初始化為5.78*3, 對c初始化為2*sin(2.0),在編譯連接后,從標準函數庫得到正弦函數sin(2.0)的值,因此變量c有確定的初值變量a未初始化如果對變量未賦初值,則該變量的初值是一個不可預測的值,即該存儲單元中當時的內容
26、是不知道的例如,若未對a和b賦值,執行輸出語句cout<<a<< <<b<< <<c<<endl;輸出結果可能為1.48544e-38 15 1.81858(各次運行情況可能不同)初始化不是在編譯階段完成的(只有在第4章中介紹的靜態存儲變量和外部變量的初始化是在編譯階段完成的),而是在程序運行時執行本函數時賦予初值的,相當于執行一個賦值語句例如,int a=3;相當于以下兩個語句 :int a; / 指定a為整型變量a=3;/ 賦值語句,將3賦給a 對多個變量賦予同一初值,必須分別指定,不能寫成float a=b=c=4.
27、5;而應寫成 float a=4.5,b=4.5,c=4.5;或float a,b,c=4.5;a=b=c;2.3.5 常變量在定義變量時,如果加上關鍵字const,則變量的值在程序運行期間不能改變,這種變量稱為常變量(constant variable)例如,const int a=3; /用const來聲明這種變量的值不能改變,指定其值始終為3在定義常變量時必須同時對它初始化(即指定其值),此后它的值不能再改變常變量不能出現在賦值號的左邊例如上面一行不能寫成const int a;a=3; /常變量不能被賦值可以用表達式對常變量初始化,如const int b=3+6,c=3*cos(1.
28、5);/b的值被指定為9,c的值被指定為3*cos(1.5)但應注意,由于使用了系統標準數學函數cos,必須將包含該函數有關的信息的頭文件“cmath”(或math.h)包含到本程序單位中來,可以在本程序單位的開頭加上以下#include命令:#include <cmath> 或 #include <math.h>變量的值應該是可以變化的,怎么值是固定的量也稱變量呢?其實,從計算機實現的角度看,變量的特征是存在一個以變量名命名的存儲單元,在一般情況下,存儲單元中的內容是可以變化的對常變量來說,無非在此變量的基礎上加上一個限定: 存儲單元中的值不允許變化因此常變量又稱為只
29、讀變量(read-only-variable)請區別用#define命令定義的符號常量和用const定義的常變量符號常量只是用一個符號代替一個字符串,在預編譯時把所有符號常量替換為所指定的字符串,它沒有類型,在內存中并不存在以符號常量命名的存儲單元而常變量具有變量的特征,它具有類型,在內存中存在著以它命名的存儲單元,可以用sizeof運算符測出其長度與一般變量惟一的不同是指定變量的值不能改變用#define命令定義符號常量是C語言所采用的方法,C+把它保留下來是為了和C兼容C+的程序員一般喜歡用const定義常變量雖然二者實現的方法不同,但從使用的角度看,都可以認為用了一個標識符代表了一個常量
30、有些書上把用const定義的常變量也稱為定義常量,但讀者應該了解它和符號常量的區別2.4 C+的運算符C+的運算符十分豐富,使得C+的運算十分靈活方便例如把賦值號(=)也作為運算符處理,這樣,a=b=c=4就是合法的表達式,這是與其他語言不同的C+提供了以下運算符:(1) 算術運算符 +(加)-(減) *(乘) /(除) %(整除求余)+(自加) -(自減)(2) 關系運算符>(大于)<(小于) =(等于)>=(大于或等于)<=(小于或等于)!=(不等于)(3) 邏輯運算符 &&(邏輯與) |(邏輯或) !(邏輯非)(4) 位運算符 <<(按
31、位左移) >>(按位右移) &(按位與) |(按位或) (按位異或) (按位取反)(5) 賦值運算符 (=及其擴展賦值運算符)(6) 條件運算符 (?:)(7) 逗號運算符 (,)(8) 指針運算符 (*)(9)引用運算符和地址運算符 (&)(10) 求字節數運算符(sizeof)(11) 強制類型轉換運算符( (類型) 或類型( )(12) 成員運算符 (.)(13) 指向成員的運算符 (->)(14) 下標運算符 ( )(15) 其他 (如函數調用運算符()2.5 算術運算符與算術表達式2.5.1 基本的算術運算符在本章中主要介紹算術運算符與算術表達式,賦
32、值運算符與賦值表達式,逗號運算符與逗號表達式,其他運算符將在以后各章中陸續介紹+(加法運算符,或正值運算符如3+5,+3)-(減法運算符,或負值運算符如5-2,-3)* (乘法運算符如3*5)/(除法運算符如5/3)%(模運算符,或稱求余運算符,%兩側均應為整型數據,如7%4的值為3)需要說明,兩個整數相除的結果為整數,如5/3的結果值為1,舍去小數部分但是,如果除數或被除數中有一個為負值,則舍入的方向是不固定的例如,-5/3在有的C+系統上得到結果-1,有的C+系統則給出結果-2多數編譯系統采取“向零取整”的方法,即5/3的值等于1,-5/3的值等于-1,取整后向零靠攏如果參加+, -, *
33、, / 運算的兩個數中有一個數為float型數據,則運算的結果是double型,因為C+在運算時對所有float型數據都按double型數據處理2.5.2 算術表達式和運算符的優先級與結合性用算術運算符和括號將運算對象(也稱操作數)連接起來的符合C+語法規則的式子,稱C+算術表達式運算對象包括常量變量函數等例如,下面是一個合法的C+算術表達式:a*b/c-1.5+aC+語言規定了運算符的優先級和結合性在求解表達式時,先按運算符的優先級別高低次序執行,例如先乘除后加減如有表達式a-b*c,b的左側為減號,右側為乘號,而乘號優先于減號,因此,相當于a-(b*c)如果在一個運算對象兩側的運算符的優先
34、級別相同,如a-b+c,則按規定的“結合方向”處理C+規定了各種運算符的結合方向(結合性),算術運算符的結合方向為“自左至右”,即先左后右,因此b先與減號結合,執行a-b的運算,再執行加c的運算“自左至右的結合方向”又稱“左結合性”,即運算對象先與左面的運算符結合以后可以看到有些運算符的結合方向為“自右至左”,即右結合性(例如賦值運算符)關于“結合性”的概念在其他一些高級語言中是沒有的,是C和C+的特點之一,希望能弄清楚附錄B列出了所有運算符以及它們的優先級別和結合性2.5.3 表達式中各類數值型數據間的混合運算在表達式中常遇到不同類型數據之間進行運算,如10+a+1.5-8765.1234*
35、b在進行運算時,不同類型的數據要先轉換成同一類型,然后進行運算轉換的規則按圖2.7所示圖2.7假設已指定i為整型變量,f為float變量,d為double型變量,e為long型,有下面表達式:10+a+i*f-d/e運算次序為: 進行10+a的運算,先將a轉換成整數97,運算結果為107進行i*f的運算先將i與f都轉換成double型,運算結果為double型整數107與i*f的積相加先將整數107轉換成雙精度數(小數點后加若干個0,即107.00000),結果為double型將變量e轉換成double型,d/e結果為double型將10+a+i*f的結果與d/e的商相減,結果為double型
36、上述的類型轉換是由系統自動進行的2.5.4 自增和自減運算符在C和C+中,常在表達式中使用自增(+)和自減(-)運算符,他們的作用是使變量的值增1或減1,如+i(在使用i之前,先使i的值加1,如果i的原值為3,則執行j=+i后,j的值為4)-i (在使用i之前,先使i的值減1,如果i的原值為3,則執行j=-i后,j的值為2)i+ (在使用i之后,使i的值加1,如果i的原值為3,則執行j=i+后,j的值為3,然后i變為4)i-(在使用i之后,使i的值減1,如果i的原值為3,則執行j=i-后,j的值為3,然后i變為2)+i是先執行i=i+1后,再使用i的值;而i+是先使用i的值后,再執行i=i+1
37、正確地使用+和-,可以使程序簡潔清晰高效請注意:(1) 自增運算符(+)和自減運算符(-)只能用于變量,而不能用于常量或表達式(2) +和-的結合方向是“自右至左”,見附錄B(3) 自增運算符(+)和自減運算符(-)使用十分靈活,但在很多情況下可能出現歧義性,產生“意想不到”的副作用(4) 自增(減)運算符在C+程序中是經常見到的,常用于循環語句中,使循環變量自動加1也用于指針變量,使指針指向下一個地址2.5.5 強制類型轉換運算符在表達式中不同類型的數據會自動地轉換類型,以進行運算有時程序編制者還可以利用強制類型轉換運算符將一個表達式轉換成所需類型例如:(double)a (將a轉換成dou
38、ble類型)(int)(x+y) (將x+y的值轉換成整型)(float)(5%3) (將5%3的值轉換成float型)強制類型轉換的一般形式為(類型名)(表達式)注意: 如果要進行強制類型轉換的對象是一個變量,該變量可以不用括號括起來如果要進行強制類型轉換的對象是一個包含多項的表達式,則表達式應該用括號括起來如果寫成 (int)x+y則只將x轉換成整型,然后與y相加以上強制類型轉換的形式是原來C語言使用的形式,C+把它保留了下來,以利于兼容C+還增加了以下形式: 類型名(表達式)如int(x) 或 int(x+y)類型名不加括號,而變量或表達式用括號括起來這種形式類似于函數調用但許多人仍習慣
39、于用第一種形式,把類型名包在括號內,這樣比較清楚需要說明的是在強制類型轉換時,得到一個所需類型的中間變量,但原來變量的類型未發生變化例如:(int)x如果x原指定為float型,值為3.6,進行強制類型運算后得到一個int型的中間變量,它的值等于3,而x原來的類型和值都不變例2.4 強制類型轉換#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;運行結果如下:x=3.6,i=3x的型仍為float型,值仍等于3.6由上可知,有兩種類型轉換,一種是在運算時不必用戶指定,系統自動進行的類型轉換,如3+6.5第二種是強制類型轉換當自動類型轉換不能實現目的時,可以用強制類型轉換此外,在函數調用時,有時為了使實參與形參類型一致,可以用強制類型轉換運算符得到一個所需類型的參數2.6 賦值運算符與賦值表達式2.6.1 賦值運算符賦值符號“=”就是賦值運算符,它的作用是將一個數據賦給一個變量如“a=3”的作用是執行一次賦值操作(或稱賦值運算)把常量3賦給變量a也可以將一個表達式的值賦給一個變量2.6.2 賦值過程中的類型轉換如果賦值運算符兩
41、側的類型不一致,但都是數值型或字符型時,在賦值時會自動進行類型轉換(1) 將浮點型數據(包括單雙精度)賦給整型變量時,舍棄其小數部分(2) 將整型數據賦給浮點型變量時,數值不變,但以指數形式存儲到變量中(3) 將一個double型數據賦給float變量時,要注意數值范圍不能溢出(4) 字符型數據賦給整型變量,將字符的ASCII碼賦給整型變量 (5) 將一個intshort或long型數據賦給一個char型變量,只將其低8位原封不動地送到char型變量(發生截斷)例如short int i=289;char c;c=i;/將一個int型數據賦給一個char型變量賦值情況見圖2.8為方便起見,以一
42、個int型數據占兩個字節(16位)的情況來說明圖2.8(6) 將signed(有符號)型數據賦給長度相同的unsigned(無符號)型變量,將存儲單元內容原樣照搬(連原有的符號位也作為數值一起傳送)例2.5 將有符號數據傳送給無符號變量#include <iostream>using namespace std;int main( ) unsigned short a; short int b=-1; a=b; cout<<a=<<a<<endl; return 0;運行結果為65535賦給b的值是-1,怎么會得到65535呢?請看圖2.9所示的
43、賦值情況圖2.9-1的補碼形式為11111(即全部16個二進制位均為1),將它傳送給a,而a是無符號型變量,16個位全1是十進制的65535如果b為正值,且在032767之間,則賦值后數值不變不同類型的整型數據間的賦值歸根結底就是一條:按存儲單元中的存儲形式直接傳送C和C+使用靈活,在不同類型數據之間賦值時,常常會出現意想不到的結果,而編譯系統并不提示出錯,全靠程序員的經驗來找出問題這就要求編程人員對出現問題的原因有所了解,以便迅速排除故障2.6.3 復合的賦值運算符在賦值符“=”之前加上其他運算符,可以構成復合的運算符如果在“=”前加一個“+”運算符就成了復合運算符“+=”例如,可以有 a+
44、=3 等價于 a=a+3 x*=y+8等價于 x=x*(y+8) x%=3 等價于 x=x%3以“a+=3”為例來說明,它相當于使a進行一次自加3的操作即先使a加3,再賦給a同樣,“x*=y+8”的作用是使x乘以(y+8),再賦給x為便于記憶,可以這樣理解: a+= b(其中a為變量,b為表達式) a+= b (將有下劃線的“a+”移到“=”右側) a = a + b (在“=”左側補上變量名a)注意,如果b是包含若干項的表達式,則相當于它有括號如 x %= y+3 x %= (y+3) x = x%(y+3)(不要錯認為x=x%y+3)凡是二元(二目)運算符,都可以與賦值符一起組合成復合賦值符C+可以使用以下幾種復合賦值運算符:+=,-=,*=,/=,%=,<<=,>>=,&=,=,|=其中后5種是有關位運算的C+之所以采用這種復合運算符,一是為了簡化程序,使程序精煉,二是為了提高編譯效率(這樣寫法與“逆波蘭”式一致,有利于編譯,能產生質量較高的目標代碼)專業的程序員在程序中常用復合運算符,初學者可能不習慣,也可以不用或少用2.6.4 賦值表達式由賦值運算符將一個變量和一個表達式連接起來的式子稱為“賦值表達式”它的一般形式為<變量> <賦值運算符&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術市場數字化轉型:2025年交易平臺創新與藝術品版權保護報告
- 會計報表分析與決策支持練習題
- 教育信息化基礎設施建設與教育行業市場機遇與挑戰報告
- 基于大數據的2025貨運代理行業風險管理研究報告
- 夢幻的童話故事小紅帽歷險記15篇范文
- 2025年能源互聯網分布式能源交易與儲能技術融合創新研究報告
- 制造業數字化轉型數據治理2025年數據治理與數字化轉型戰略實施策略優化報告001
- 元宇宙社交平臺用戶體驗與社交場景創新研究報告001
- 農業保險市場服務優化與產品創新策略報告(2025)001
- 2025-2030中國耐火陶瓷纖維紐繩行業競爭動態與投資盈利預測報告
- 制造執行系統SMT MES解決方案
- 高二區域地理 撒哈拉以南的非洲課件
- 數字化精密加工車間項目可行性研究報告建議書
- 2022年《內蒙古自治區建設工程費用定額》取費說明
- Q∕GDW 10799.6-2018 國家電網有限公司電力安全工作規程 第6部分:光伏電站部分
- 寧波市建設工程資料統一用表(2022版)1 通用分冊
- 危險化學品安全技術說明書MSDS—汽油
- 三甲醫院必備醫療設備清單大全
- 播音主持重音的教學課件
- 暴雨產流計算(推理公式_四川省)
- NUDD新獨難異失效模式預防檢查表
評論
0/150
提交評論