c及c++程序設(shè)計教程第3章 運(yùn)算符及表達(dá)式(1)_第1頁
c及c++程序設(shè)計教程第3章 運(yùn)算符及表達(dá)式(1)_第2頁
c及c++程序設(shè)計教程第3章 運(yùn)算符及表達(dá)式(1)_第3頁
c及c++程序設(shè)計教程第3章 運(yùn)算符及表達(dá)式(1)_第4頁
c及c++程序設(shè)計教程第3章 運(yùn)算符及表達(dá)式(1)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、12一、運(yùn)算符與表達(dá)式概述一、運(yùn)算符與表達(dá)式概述 表達(dá)式由操作數(shù)和運(yùn)算符構(gòu)成,操作數(shù)描述數(shù)表達(dá)式由操作數(shù)和運(yùn)算符構(gòu)成,操作數(shù)描述數(shù)據(jù)的狀態(tài)信息,運(yùn)算符限定了建立在操作數(shù)之上的據(jù)的狀態(tài)信息,運(yùn)算符限定了建立在操作數(shù)之上的動作。簡單的運(yùn)算符表達(dá)式對應(yīng)著匯編語言中的一動作。簡單的運(yùn)算符表達(dá)式對應(yīng)著匯編語言中的一條指令。條指令。 在表達(dá)式后加一個分號在表達(dá)式后加一個分號“;“就構(gòu)成表達(dá)式語句,就構(gòu)成表達(dá)式語句,用于表達(dá)式的求值計算。例如用于表達(dá)式的求值計算。例如 x=y 是賦值表達(dá)式,是賦值表達(dá)式,x=y;是賦值表達(dá)式語句。是賦值表達(dá)式語句。 3運(yùn)算符主要有下面幾類運(yùn)算符主要有下面幾類 :1. 后置運(yùn)

2、算符后置運(yùn)算符 ()() + -2. 前置運(yùn)算符前置運(yùn)算符 new delete sizeof + - ! - * &3. 算術(shù)運(yùn)算符算術(shù)運(yùn)算符 * / % + -4. 位運(yùn)算符位運(yùn)算符 & | 5. 關(guān)系運(yùn)算符關(guān)系運(yùn)算符 = = 3.1, x|y, x+= y; 其中其中*,|,+=是雙目運(yùn)算符,而是雙目運(yùn)算符,而4,6,x視為左操作數(shù)視為左操作數(shù),5.2,3.1,y視為右操作數(shù)。視為右操作數(shù)。 5對于單目運(yùn)算符,其使用形式為:對于單目運(yùn)算符,其使用形式為: 運(yùn)算符運(yùn)算符 操作數(shù)操作數(shù) operand例如:例如: +x,1, &x, !y; 表達(dá)式是操作數(shù)和運(yùn)算符構(gòu)成

3、的算式,其結(jié)果是具有確表達(dá)式是操作數(shù)和運(yùn)算符構(gòu)成的算式,其結(jié)果是具有確定類型的數(shù)據(jù)值。定類型的數(shù)據(jù)值。 運(yùn)算是分層次來進(jìn)行的,由此分成源操作數(shù)和目標(biāo)操作運(yùn)算是分層次來進(jìn)行的,由此分成源操作數(shù)和目標(biāo)操作數(shù),目標(biāo)操作數(shù)可以作為下一個回合的源操作數(shù)。例如數(shù),目標(biāo)操作數(shù)可以作為下一個回合的源操作數(shù)。例如!y中中的是的是y源操作數(shù),運(yùn)算的結(jié)果是目標(biāo)操作數(shù)。對于賦值表達(dá)源操作數(shù),運(yùn)算的結(jié)果是目標(biāo)操作數(shù)。對于賦值表達(dá)式存在兩種等價的稱謂:式存在兩種等價的稱謂: 左操作數(shù)左操作數(shù)=右操作數(shù)右操作數(shù) 目標(biāo)操作數(shù)目標(biāo)操作數(shù)=源操作數(shù)源操作數(shù)6二、左值和右值二、左值和右值 表達(dá)式有兩個特點(diǎn):表達(dá)式有兩個特點(diǎn):一個特

4、點(diǎn)是表達(dá)式具有一定的數(shù)一個特點(diǎn)是表達(dá)式具有一定的數(shù)值,另一個特點(diǎn)是表達(dá)式具有類型屬性。值,另一個特點(diǎn)是表達(dá)式具有類型屬性。表達(dá)式的類型屬表達(dá)式的類型屬性用于指出其占有的內(nèi)存大小。性用于指出其占有的內(nèi)存大小。 根據(jù)操作數(shù)運(yùn)算的來源與結(jié)果是否與內(nèi)存相關(guān)根據(jù)操作數(shù)運(yùn)算的來源與結(jié)果是否與內(nèi)存相關(guān), 表達(dá)表達(dá)式分為左值和右值。式分為左值和右值。 左值是對應(yīng)內(nèi)存數(shù)據(jù)的一個表達(dá)式左值是對應(yīng)內(nèi)存數(shù)據(jù)的一個表達(dá)式, 最常見的左值是最常見的左值是變量。左值表達(dá)式最終必須通過變量定義語句分配內(nèi)存。變量。左值表達(dá)式最終必須通過變量定義語句分配內(nèi)存。允許刷新的數(shù)據(jù)區(qū)稱為左值數(shù)據(jù)區(qū)。左值可多次出現(xiàn)在賦允許刷新的數(shù)據(jù)區(qū)稱為

5、左值數(shù)據(jù)區(qū)。左值可多次出現(xiàn)在賦值運(yùn)算符的左側(cè),右值不行。值運(yùn)算符的左側(cè),右值不行。 7 右值出現(xiàn)在賦值運(yùn)算符的右側(cè)右值出現(xiàn)在賦值運(yùn)算符的右側(cè),僅含右值的操作數(shù)不改僅含右值的操作數(shù)不改變內(nèi)存的數(shù)據(jù)狀態(tài),右值不一定具有存儲地址變內(nèi)存的數(shù)據(jù)狀態(tài),右值不一定具有存儲地址,而左值則擁而左值則擁有存儲地址。左值可作為右值。有存儲地址。左值可作為右值。 常見的右值為常數(shù),例如數(shù)組名常見的右值為常數(shù),例如數(shù)組名a可作為右值不能作為可作為右值不能作為左值,而數(shù)組元素左值,而數(shù)組元素ai是左值表達(dá)式。變量的引用是左值。是左值表達(dá)式。變量的引用是左值。但但const限定的名稱是右值。限定的名稱是右值。 例如:例如:

6、對于對于 int x,&y=x; const int c=1,&d=c;,x,y 是左值,是左值,c,d是右值。是右值。8 算術(shù)、邏輯和關(guān)系運(yùn)算符不要求左值操作數(shù),計算的算術(shù)、邏輯和關(guān)系運(yùn)算符不要求左值操作數(shù),計算的結(jié)果為右值。系統(tǒng)在編譯階段檢查運(yùn)算符與各操作數(shù)之間結(jié)果為右值。系統(tǒng)在編譯階段檢查運(yùn)算符與各操作數(shù)之間左值右值的匹配性。左值右值的匹配性。例如:例如: double v=2.0; const double e=1.0; 表達(dá)式表達(dá)式v-, v=e*e,v+=e,(v+=e)- =1是正確的,而是正確的,而+e,e= v, e-=v, e*v=4.0, (v+e)- =

7、1等是錯誤的。等是錯誤的。 9三、運(yùn)算符的優(yōu)先級與結(jié)合性三、運(yùn)算符的優(yōu)先級與結(jié)合性 運(yùn)算符的優(yōu)先級和結(jié)合性用于確定連接在一起的復(fù)雜表運(yùn)算符的優(yōu)先級和結(jié)合性用于確定連接在一起的復(fù)雜表達(dá)式先后求值的次序性。達(dá)式先后求值的次序性。1、結(jié)合性結(jié)合性(associativity) 運(yùn)算符結(jié)合性是指相同級別的運(yùn)算符相關(guān)聯(lián)的表達(dá)式各運(yùn)算符結(jié)合性是指相同級別的運(yùn)算符相關(guān)聯(lián)的表達(dá)式各操作數(shù)之間的運(yùn)算結(jié)合次序。例如算術(shù)運(yùn)算加操作數(shù)之間的運(yùn)算結(jié)合次序。例如算術(shù)運(yùn)算加+減減-具有相同具有相同的級別,下面的表達(dá)式如何計算?的級別,下面的表達(dá)式如何計算? 1-2+3 或或 i-j+k C/C+規(guī)定加減乘除算術(shù)運(yùn)算的結(jié)合性

8、是從左到右,于規(guī)定加減乘除算術(shù)運(yùn)算的結(jié)合性是從左到右,于是運(yùn)算的次序進(jìn)一步確定為:是運(yùn)算的次序進(jìn)一步確定為: (1-2)+3 或或 (i-j)+k 10 因此因此(1-2)+3的結(jié)果為的結(jié)果為2而不是而不是1-(2+3)=-4。 i-j+k 確定為確定為(i-j)+k, 而不是而不是i-(j+k)。同理。同理1/2*3處理為處理為(1/2)*3,結(jié)果是,結(jié)果是0。 單目運(yùn)算符和三目運(yùn)算符是右結(jié)合性的。雙目運(yùn)算符除單目運(yùn)算符和三目運(yùn)算符是右結(jié)合性的。雙目運(yùn)算符除直接賦值和復(fù)合賦值運(yùn)算符是右結(jié)合的以外,其余都是左結(jié)直接賦值和復(fù)合賦值運(yùn)算符是右結(jié)合的以外,其余都是左結(jié)合的。合的。 運(yùn)算符結(jié)合性用于確

9、定同一級別相關(guān)操作數(shù)綁定的緊密運(yùn)算符結(jié)合性用于確定同一級別相關(guān)操作數(shù)綁定的緊密程度。程度。112、優(yōu)先級優(yōu)先級(precedence) 將復(fù)雜的表達(dá)式分解為簡單的表達(dá)式過程中,運(yùn)算符的將復(fù)雜的表達(dá)式分解為簡單的表達(dá)式過程中,運(yùn)算符的優(yōu)先級用于判定各表達(dá)式的先后執(zhí)行次序。運(yùn)算符的優(yōu)先級優(yōu)先級用于判定各表達(dá)式的先后執(zhí)行次序。運(yùn)算符的優(yōu)先級越高,相關(guān)聯(lián)的表達(dá)式就越先組合在一起完成求值計算。越高,相關(guān)聯(lián)的表達(dá)式就越先組合在一起完成求值計算。 圓括號圓括號( )運(yùn)算符具有最高的優(yōu)先級,如果圓括號是多層運(yùn)算符具有最高的優(yōu)先級,如果圓括號是多層嵌套的,首先計算最內(nèi)層配對的圓括號中的表達(dá)式。對于優(yōu)嵌套的,首先

10、計算最內(nèi)層配對的圓括號中的表達(dá)式。對于優(yōu)先級相同的表達(dá)式序列,表達(dá)式求值的次序取決于同級操作先級相同的表達(dá)式序列,表達(dá)式求值的次序取決于同級操作符的結(jié)合性;左結(jié)合的操作符各表達(dá)式總體上從左到右依次符的結(jié)合性;左結(jié)合的操作符各表達(dá)式總體上從左到右依次求值,右結(jié)合的則相反。求值,右結(jié)合的則相反。 12 不再內(nèi)嵌其它表達(dá)式的操作數(shù)稱為基本表達(dá)式。常見的不再內(nèi)嵌其它表達(dá)式的操作數(shù)稱為基本表達(dá)式。常見的基本表達(dá)式是常數(shù)、變量名、數(shù)組名和函數(shù)名。另一個值得基本表達(dá)式是常數(shù)、變量名、數(shù)組名和函數(shù)名。另一個值得關(guān)注的基本表達(dá)式是圓括號括起來的表達(dá)式如關(guān)注的基本表達(dá)式是圓括號括起來的表達(dá)式如(e),圓括號用,圓

11、括號用于提高其中表達(dá)式于提高其中表達(dá)式e的優(yōu)先級。的優(yōu)先級。 例如:例如:對于對于(y/x)* (x*3.1), (y/x)就視為基本表達(dá)式就視為基本表達(dá)式, (x*3.1)也作為基本表達(dá)式。也作為基本表達(dá)式。 對于形如對于形如(e1)(e2)的表達(dá)式的表達(dá)式C/C+語言一般并未規(guī)定語言一般并未規(guī)定基本表達(dá)式基本表達(dá)式e1和和e2的求值次序,即編譯器可以先對的求值次序,即編譯器可以先對e2例如例如(x*3.1)完成初始化計算,特別地當(dāng)完成初始化計算,特別地當(dāng)e2對應(yīng)函數(shù)調(diào)用時。對應(yīng)函數(shù)調(diào)用時。13對于表達(dá)式:對于表達(dá)式: r=1-4*3/2+6/3根據(jù)運(yùn)算符的優(yōu)先級也就是數(shù)學(xué)上先乘除后加減的運(yùn)

12、算規(guī)則根據(jù)運(yùn)算符的優(yōu)先級也就是數(shù)學(xué)上先乘除后加減的運(yùn)算規(guī)則和結(jié)合性系統(tǒng)處理為:和結(jié)合性系統(tǒng)處理為: r=(1-(4*3)/2)+(6/3)這樣這樣r的值可以無歧義地確定為的值可以無歧義地確定為(1-6)+2=-3。 14四、算術(shù)運(yùn)算表達(dá)式四、算術(shù)運(yùn)算表達(dá)式 算術(shù)運(yùn)算就是加減乘除運(yùn)算以及求余數(shù)運(yùn)算算術(shù)運(yùn)算就是加減乘除運(yùn)算以及求余數(shù)運(yùn)算,算術(shù)運(yùn)算符算術(shù)運(yùn)算符是左結(jié)合的雙目運(yùn)算符是左結(jié)合的雙目運(yùn)算符,左操作數(shù)與右操作數(shù)的類型可以不一左操作數(shù)與右操作數(shù)的類型可以不一致致,運(yùn)算時執(zhí)行常用的算術(shù)類型轉(zhuǎn)換,運(yùn)算的結(jié)果是右值。它運(yùn)算時執(zhí)行常用的算術(shù)類型轉(zhuǎn)換,運(yùn)算的結(jié)果是右值。它們的格式為:們的格式為: 乘法運(yùn)

13、算:乘法運(yùn)算: e1*e2 2*3=6, 3*1.1=3.3 除法運(yùn)算:除法運(yùn)算: e1/e2 6/5的結(jié)果是的結(jié)果是1,2/4的結(jié)果是的結(jié)果是0, 2.0/4的結(jié)果是的結(jié)果是0.5。 求余運(yùn)算:求余運(yùn)算: n% m m%(m+1)=m, (m+1)%m=1, n=k*m+j,則則n%m的值為的值為j; 求余運(yùn)算求兩個整數(shù)相除的余數(shù),求余數(shù)運(yùn)算兩個操作求余運(yùn)算求兩個整數(shù)相除的余數(shù),求余數(shù)運(yùn)算兩個操作數(shù)必須是整型。數(shù)必須是整型。 15 對于正整數(shù)之間的關(guān)系式對于正整數(shù)之間的關(guān)系式n=k*m+j,則則n%m的值為的值為j,其,其中中j為小于為小于m的整數(shù)。求余運(yùn)算也稱取模運(yùn)算。的整數(shù)。求余運(yùn)算也稱

14、取模運(yùn)算。 加法運(yùn)算:加法運(yùn)算: e1+e2 減法運(yùn)算:減法運(yùn)算: e1-e2 減法運(yùn)算:減法運(yùn)算: e1-e2 加減法運(yùn)算中的表達(dá)式有兩種類型的操作數(shù):一種是算加減法運(yùn)算中的表達(dá)式有兩種類型的操作數(shù):一種是算術(shù)類型,算術(shù)類型的操作數(shù)得到的是兩個操作數(shù)的和或差。術(shù)類型,算術(shù)類型的操作數(shù)得到的是兩個操作數(shù)的和或差。另一種是指針類型,對于另一種是指針類型,對于e1-e2,如果如果e1為指針,則為指針,則e2為整型為整型或者都為指針表達(dá)式?;蛘叨紴橹羔槺磉_(dá)式。e1+e2僅其中之一為指針表達(dá)式,另僅其中之一為指針表達(dá)式,另一個為整型表達(dá)式。一個為整型表達(dá)式。 運(yùn)算過程存在溢出,溢出是運(yùn)算的結(jié)果超出該數(shù)

15、據(jù)能表運(yùn)算過程存在溢出,溢出是運(yùn)算的結(jié)果超出該數(shù)據(jù)能表示的范圍。示的范圍。16例例 整型數(shù)據(jù)的溢出和格式轉(zhuǎn)換函數(shù)整型數(shù)據(jù)的溢出和格式轉(zhuǎn)換函數(shù) #include void main(void) unsigned char k=(char)0 xff; signed char n=(char)0 xff; /輸出輸出 printf (%d,%d,%xn,k, k+1, k+1); printf (%d,%d,%xn,n, n+1, n+1); /-1,0,0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 00 x100 xff 1 1 1 1 1 1 1 117五、混合運(yùn)算時數(shù)據(jù)的類

16、型轉(zhuǎn)換五、混合運(yùn)算時數(shù)據(jù)的類型轉(zhuǎn)換1、強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換 強(qiáng)制類型轉(zhuǎn)換又稱為顯式類型轉(zhuǎn)換,類型轉(zhuǎn)換不管是強(qiáng)制類型轉(zhuǎn)換又稱為顯式類型轉(zhuǎn)換,類型轉(zhuǎn)換不管是隱含的還是顯式的都具有強(qiáng)制的性質(zhì)。隱含的還是顯式的都具有強(qiáng)制的性質(zhì)。 強(qiáng)制類型轉(zhuǎn)換有兩強(qiáng)制類型轉(zhuǎn)換有兩種形式,一種是種形式,一種是C+新增的函數(shù)表達(dá)式的形式:新增的函數(shù)表達(dá)式的形式: 類型名類型名(表達(dá)式表達(dá)式) type(expression)另一種是另一種是C語言中采用已久的類型轉(zhuǎn)換形式:語言中采用已久的類型轉(zhuǎn)換形式: (類型名)表達(dá)式(類型名)表達(dá)式 (type)(expression) 兩種形式在基本數(shù)據(jù)類型的情形具有相同的結(jié)果,但

17、兩種形式在基本數(shù)據(jù)類型的情形具有相同的結(jié)果,但函數(shù)表達(dá)式的形式不適宜于指針和引用的強(qiáng)制類型轉(zhuǎn)換。函數(shù)表達(dá)式的形式不適宜于指針和引用的強(qiáng)制類型轉(zhuǎn)換。 18 強(qiáng)制類型轉(zhuǎn)換的作用就是將表達(dá)式的類型轉(zhuǎn)換為類型名強(qiáng)制類型轉(zhuǎn)換的作用就是將表達(dá)式的類型轉(zhuǎn)換為類型名指定的數(shù)據(jù)類型。指定的數(shù)據(jù)類型。例如:例如: float x=5.9; int k=int(x)+(int)x; (int)x+x (int)(x+x) (int)6.5%4 對于簡單的變量類型轉(zhuǎn)換時推薦采用傳統(tǒng)的對于簡單的變量類型轉(zhuǎn)換時推薦采用傳統(tǒng)的C語言形語言形式。值得指出強(qiáng)制類型轉(zhuǎn)換中出現(xiàn)在表達(dá)式中變量的值在轉(zhuǎn)式。值得指出強(qiáng)制類型轉(zhuǎn)換中出現(xiàn)在

18、表達(dá)式中變量的值在轉(zhuǎn)換中并沒有發(fā)生變化。換中并沒有發(fā)生變化。192、常用的算術(shù)轉(zhuǎn)換常用的算術(shù)轉(zhuǎn)換 當(dāng)兩個操作數(shù)類型不相同時,常用的算術(shù)轉(zhuǎn)換應(yīng)用于雙當(dāng)兩個操作數(shù)類型不相同時,常用的算術(shù)轉(zhuǎn)換應(yīng)用于雙目運(yùn)算符目運(yùn)算符 (主要是加減乘除算術(shù)運(yùn)算符主要是加減乘除算術(shù)運(yùn)算符) 其目的是產(chǎn)生一個公其目的是產(chǎn)生一個公共的類型共的類型,它也是雙目運(yùn)算表達(dá)式結(jié)果的類型。它也是雙目運(yùn)算表達(dá)式結(jié)果的類型。 為了確定實際發(fā)生的轉(zhuǎn)換,不妨簡單地認(rèn)為編譯器初步為了確定實際發(fā)生的轉(zhuǎn)換,不妨簡單地認(rèn)為編譯器初步根據(jù)變量類型的字節(jié)長度根據(jù)變量類型的字節(jié)長度1,2,4和和8或或 10把算術(shù)類型數(shù)據(jù)從低把算術(shù)類型數(shù)據(jù)從低到高分為多個

19、級別,應(yīng)用于表達(dá)式中的雙目操作。到高分為多個級別,應(yīng)用于表達(dá)式中的雙目操作。 20 1. long double if某操作數(shù)為某操作數(shù)為 long double, 另一操作數(shù)變?yōu)榱硪徊僮鲾?shù)變?yōu)?longdouble. 2. double else if某操作數(shù)為某操作數(shù)為double, 另一操作數(shù)變?yōu)榱硪徊僮鲾?shù)變?yōu)閐ouble. 3. float else if某操作數(shù)為某操作數(shù)為float, 另一操作數(shù)變?yōu)榱硪徊僮鲾?shù)變?yōu)閒loat 4. unsigned long else if某操作數(shù)為某操作數(shù)為unsigned long, 另一操作數(shù)為另一操作數(shù)為unsigned long 4. lo

20、ng else if某操作數(shù)為某操作數(shù)為long,另一操作數(shù)變?yōu)榱硪徊僮鲾?shù)變?yōu)閘ong 5. unsigned int else if某操作數(shù)為某操作數(shù)為unsigned int, 另一操作數(shù)變?yōu)榱硪徊僮鲾?shù)變?yōu)閡nsigned int 5. int else 兩個操作數(shù)變?yōu)閮蓚€操作數(shù)變?yōu)閕nt。 6. unsigned short short 7. unsigned char char signed char 各種算術(shù)類型數(shù)據(jù)的順序各種算術(shù)類型數(shù)據(jù)的順序低低高高21 在混合類型的表達(dá)式中,轉(zhuǎn)換是自動將數(shù)據(jù)向較高級別在混合類型的表達(dá)式中,轉(zhuǎn)換是自動將數(shù)據(jù)向較高級別類型轉(zhuǎn)換的過程。雙目操作數(shù)中,低

21、類型的數(shù)據(jù)直接轉(zhuǎn)換為類型轉(zhuǎn)換的過程。雙目操作數(shù)中,低類型的數(shù)據(jù)直接轉(zhuǎn)換為高類型的數(shù)據(jù)。無符號整數(shù)的類型高于有符號的整數(shù)類型。高類型的數(shù)據(jù)。無符號整數(shù)的類型高于有符號的整數(shù)類型。 int數(shù)據(jù)類型以下的運(yùn)算轉(zhuǎn)換為數(shù)據(jù)類型以下的運(yùn)算轉(zhuǎn)換為int類型處理。如類型處理。如char和和short類型的運(yùn)算都轉(zhuǎn)換為類型的運(yùn)算都轉(zhuǎn)換為int數(shù)據(jù)類型。數(shù)據(jù)類型。例如:例如:sizeof(c/d)= sizeof(int),sizeof(/(short)1)=4。 long型數(shù)據(jù)與型數(shù)據(jù)與double型數(shù)據(jù)運(yùn)算,先將型數(shù)據(jù)運(yùn)算,先將long型數(shù)據(jù)轉(zhuǎn)型數(shù)據(jù)轉(zhuǎn)換為換為double型,結(jié)果為型,結(jié)果為double型;一

22、個型;一個float型數(shù)據(jù)與一個型數(shù)據(jù)與一個char型數(shù)據(jù)運(yùn)算,直接將型數(shù)據(jù)運(yùn)算,直接將char型數(shù)據(jù)轉(zhuǎn)換成型數(shù)據(jù)轉(zhuǎn)換成float型數(shù)據(jù),型數(shù)據(jù),結(jié)果為結(jié)果為float型數(shù)據(jù)。型數(shù)據(jù)。即:即:表達(dá)式表達(dá)式11.0f*x11.0f*(float)x。22 浮點(diǎn)協(xié)處理器的缺省運(yùn)算是浮點(diǎn)協(xié)處理器的缺省運(yùn)算是 double 類型,這意味兩個類型,這意味兩個float數(shù)的運(yùn)算可優(yōu)先轉(zhuǎn)換為數(shù)的運(yùn)算可優(yōu)先轉(zhuǎn)換為 double 類型,結(jié)果的類型可以類型,結(jié)果的類型可以是是float類型。如類型。如sizeof(1.0f/2.0f)=4 而而sizeof(1.0/2.0f)=8。 例如例如:sizeof(1L/

23、2.0f)= sizeof(float)=4是是vc6.0的結(jié)果。的結(jié)果。 當(dāng)當(dāng) long double型變量占型變量占8個字節(jié)的內(nèi)存時其數(shù)據(jù)類型個字節(jié)的內(nèi)存時其數(shù)據(jù)類型的精度同的精度同double。這是微軟編譯器的約定。這是微軟編譯器的約定。 char 、short和和 long在早期的在早期的C語言中都?xì)w屬于整型,語言中都?xì)w屬于整型,關(guān)鍵字關(guān)鍵字int充當(dāng)了整型變量的溝通聯(lián)系的橋梁作用。脫胎于充當(dāng)了整型變量的溝通聯(lián)系的橋梁作用。脫胎于C語言的語言的C+依然保留了這一歷史的痕跡。在依然保留了這一歷史的痕跡。在16位編程模式下位編程模式下int占占2個字節(jié)的內(nèi)存,個字節(jié)的內(nèi)存,32位編程模式下

24、位編程模式下int占占4個字節(jié)的內(nèi)個字節(jié)的內(nèi)存。存。233、隱含類型轉(zhuǎn)換隱含類型轉(zhuǎn)換 在運(yùn)算符兩邊數(shù)據(jù)類型不同時,系統(tǒng)自動進(jìn)行隱含類在運(yùn)算符兩邊數(shù)據(jù)類型不同時,系統(tǒng)自動進(jìn)行隱含類型轉(zhuǎn)換。隱含類型轉(zhuǎn)換的規(guī)則如下:型轉(zhuǎn)換。隱含類型轉(zhuǎn)換的規(guī)則如下: 1. 轉(zhuǎn)換是按照運(yùn)算表達(dá)式的優(yōu)先級別分步進(jìn)行的,優(yōu)轉(zhuǎn)換是按照運(yùn)算表達(dá)式的優(yōu)先級別分步進(jìn)行的,優(yōu)先級高的優(yōu)先完成轉(zhuǎn)換。先級高的優(yōu)先完成轉(zhuǎn)換。 2. 在同一級別表達(dá)式中,操作數(shù)先直接轉(zhuǎn)換為數(shù)據(jù)在同一級別表達(dá)式中,操作數(shù)先直接轉(zhuǎn)換為數(shù)據(jù) 類類型保值精度更強(qiáng)的形式。型保值精度更強(qiáng)的形式。 3. 源操作數(shù)的數(shù)據(jù)類型最終轉(zhuǎn)換為目標(biāo)的數(shù)據(jù)類型。源操作數(shù)的數(shù)據(jù)類型最終轉(zhuǎn)

25、換為目標(biāo)的數(shù)據(jù)類型。 4. 關(guān)系和邏輯運(yùn)算結(jié)果為關(guān)系和邏輯運(yùn)算結(jié)果為0或或1,0,1的目標(biāo)類型在的目標(biāo)類型在C中中為為int型,型,C+為為bool型。型。24 數(shù)據(jù)占有的內(nèi)存字節(jié)數(shù)制約數(shù)據(jù)轉(zhuǎn)換精度的得失。通常數(shù)據(jù)占有的內(nèi)存字節(jié)數(shù)制約數(shù)據(jù)轉(zhuǎn)換精度的得失。通常數(shù)據(jù)類型占有的字節(jié)多,表示的數(shù)據(jù)范圍越大。數(shù)據(jù)類型表數(shù)據(jù)類型占有的字節(jié)多,表示的數(shù)據(jù)范圍越大。數(shù)據(jù)類型表示的數(shù)據(jù)范圍越大,其保值精度越強(qiáng),相應(yīng)地數(shù)據(jù)類型的級示的數(shù)據(jù)范圍越大,其保值精度越強(qiáng),相應(yīng)地數(shù)據(jù)類型的級別高,操作數(shù)的數(shù)據(jù)總是從低類型的數(shù)據(jù)直接轉(zhuǎn)換為高類型別高,操作數(shù)的數(shù)據(jù)總是從低類型的數(shù)據(jù)直接轉(zhuǎn)換為高類型的數(shù)據(jù)。的數(shù)據(jù)。 整型、實型和

26、整型、實型和字符型數(shù)據(jù)允許進(jìn)字符型數(shù)據(jù)允許進(jìn)行混合運(yùn)算。行混合運(yùn)算。例如:例如:3+c+z*10f-5/2.0 等價于等價于 int float double int float double double float ( 3 + c ) + ( z *10f ) ) - ( 5 /2.0 )25 根據(jù)優(yōu)先級和結(jié)合性,上面復(fù)雜表達(dá)式的運(yùn)算在幕后可根據(jù)優(yōu)先級和結(jié)合性,上面復(fù)雜表達(dá)式的運(yùn)算在幕后可以分解為如下各種次序:以分解為如下各種次序: 1. 先乘除后加減,從左到右運(yùn)算。先乘除后加減,從左到右運(yùn)算。(編譯器可以先算編譯器可以先算e2=5/2.0,后算,后算e1=z*10f) float e1=

27、z*10f ; double e2=5/2.0 ; register int e3= 3+c; float e4=e3+e1; double e5= e4 - e2; 26 2. 對圓括號的基本表達(dá)式從左到右運(yùn)算。對圓括號的基本表達(dá)式從左到右運(yùn)算。(各種分解都各種分解都導(dǎo)致導(dǎo)致e5= e4 - e2) register int e3= 3+c; float e1=z*10f ; double e2=5/2.0 ; float e4 = e3+ e1; double e5= e4 - e2; 上面的兩種分解得到同樣的結(jié)果上面的兩種分解得到同樣的結(jié)果e5=1319.50000。這也。這也就是原表達(dá)

28、式的結(jié)果。就是原表達(dá)式的結(jié)果。下面運(yùn)算說明優(yōu)先級高的先完成數(shù)據(jù)的轉(zhuǎn)換下面運(yùn)算說明優(yōu)先級高的先完成數(shù)據(jù)的轉(zhuǎn)換:printf(%d,%d,%fn,int(2.5)*4+5/4,int(2.5*4+5/4),2.5*4+5/4.0); /輸出結(jié)果輸出結(jié)果: 9,11,11.250000 27六、賦值表達(dá)式和混合賦值六、賦值表達(dá)式和混合賦值 其結(jié)果為左值表達(dá)式,結(jié)果的類型是左操作數(shù)的類型其結(jié)果為左值表達(dá)式,結(jié)果的類型是左操作數(shù)的類型.其其一般形式為:一般形式為: 變量變量=運(yùn)算表達(dá)式運(yùn)算表達(dá)式 lvalue=expre 賦值運(yùn)算符左邊的操作數(shù)必須是左值,右操作數(shù)可以是賦值運(yùn)算符左邊的操作數(shù)必須是左值,

29、右操作數(shù)可以是單一的常數(shù)、變量和非單一的常數(shù)、變量和非 void類型的函數(shù)調(diào)用。賦值運(yùn)算符類型的函數(shù)調(diào)用。賦值運(yùn)算符 =是先右結(jié)合的,即是先右結(jié)合的,即lvalue=expre理解為理解為 lvalue=(expre),程,程序先取出右操作數(shù)的值,然后把右操作數(shù)的值送入左操作數(shù)序先取出右操作數(shù)的值,然后把右操作數(shù)的值送入左操作數(shù)對應(yīng)的內(nèi)存單元。數(shù)學(xué)公式對應(yīng)的內(nèi)存單元。數(shù)學(xué)公式x=x+1是無意義的是無意義的,但卻是合法的但卻是合法的表達(dá)式。其含義為先求出表達(dá)式表達(dá)式。其含義為先求出表達(dá)式x+1的值,再將該值賦給的值,再將該值賦給x。28 在一個賦值表達(dá)式中,可以包含另一個表達(dá)式在一個賦值表達(dá)式中

30、,可以包含另一個表達(dá)式,其運(yùn)算其運(yùn)算順序是從右向左進(jìn)行,順序是從右向左進(jìn)行,例如:例如: i=j=k=l= 0; /右結(jié)合性等價于右結(jié)合性等價于 i=(j=(k=(l=0);編譯器分解為:編譯器分解為:l=0; k=l; j=k; i=j; 賦值運(yùn)算符兩邊數(shù)據(jù)類型相同時賦值運(yùn)算是精確的二進(jìn)賦值運(yùn)算符兩邊數(shù)據(jù)類型相同時賦值運(yùn)算是精確的二進(jìn)制數(shù)據(jù)拷貝。在運(yùn)算符兩邊的數(shù)據(jù)類型不同時,系統(tǒng)自動進(jìn)制數(shù)據(jù)拷貝。在運(yùn)算符兩邊的數(shù)據(jù)類型不同時,系統(tǒng)自動進(jìn)行類型轉(zhuǎn)換。行類型轉(zhuǎn)換。 類型轉(zhuǎn)換的規(guī)則是源操作數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為目標(biāo)操作類型轉(zhuǎn)換的規(guī)則是源操作數(shù)的數(shù)據(jù)類型轉(zhuǎn)換為目標(biāo)操作數(shù)的數(shù)據(jù)類型。這里,賦值運(yùn)算符的隱含

31、轉(zhuǎn)換規(guī)則是右邊的數(shù)的數(shù)據(jù)類型。這里,賦值運(yùn)算符的隱含轉(zhuǎn)換規(guī)則是右邊的數(shù)據(jù)類型轉(zhuǎn)換為左邊的類型。類型轉(zhuǎn)換的規(guī)則如下:數(shù)據(jù)類型轉(zhuǎn)換為左邊的類型。類型轉(zhuǎn)換的規(guī)則如下:291.同等長度的整型數(shù)據(jù)賦值或轉(zhuǎn)換。同等長度的整型數(shù)據(jù)賦值或轉(zhuǎn)換。 同長度類型數(shù)據(jù)有符號數(shù)和無符號數(shù)之間數(shù)據(jù)的賦值是同長度類型數(shù)據(jù)有符號數(shù)和無符號數(shù)之間數(shù)據(jù)的賦值是精確的,左操作數(shù)具有與右操作數(shù)相同的內(nèi)存狀態(tài)。但對于精確的,左操作數(shù)具有與右操作數(shù)相同的內(nèi)存狀態(tài)。但對于數(shù)據(jù)的解釋上存在差別,有符號整數(shù)其最高位用于鑒別其正數(shù)據(jù)的解釋上存在差別,有符號整數(shù)其最高位用于鑒別其正負(fù),最高位為負(fù),最高位為0表示該數(shù)為正,最高位為表示該數(shù)為正,最高

32、位為1表示該數(shù)為負(fù)。而表示該數(shù)為負(fù)。而無符號數(shù)的最高位本身作為數(shù)據(jù)的一部分。負(fù)數(shù)以補(bǔ)碼原碼無符號數(shù)的最高位本身作為數(shù)據(jù)的一部分。負(fù)數(shù)以補(bǔ)碼原碼轉(zhuǎn)換即間接求補(bǔ)顯示。轉(zhuǎn)換即間接求補(bǔ)顯示。 signed1 short i=xfe; unsigned short k=i; 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 030例例 同長度整型數(shù)的賦值操作同長度整型數(shù)的賦值操作 #include void main (void) /輸出輸出 signed short i=xfe; printf (%4hx,%dn,i,i); /f

33、ffe,-2 unsigned short k=i ; printf (%4hx,%dn,k,k); /fffe,65534 格式格式%4hx表示以表示以4字符寬度輸出字符寬度輸出16進(jìn)制的短整型的內(nèi)進(jìn)制的短整型的內(nèi)存數(shù)據(jù)狀態(tài)。存數(shù)據(jù)狀態(tài)。312.向長字節(jié)擴(kuò)展。向長字節(jié)擴(kuò)展。 整型數(shù)據(jù)可以轉(zhuǎn)換為更長的有符號或無符號整數(shù)整型數(shù)據(jù)可以轉(zhuǎn)換為更長的有符號或無符號整數(shù),這種轉(zhuǎn)這種轉(zhuǎn)換稱為向長字節(jié)擴(kuò)展。無符號數(shù)擴(kuò)展時以換稱為向長字節(jié)擴(kuò)展。無符號數(shù)擴(kuò)展時以 0 進(jìn)行擴(kuò)展位的填進(jìn)行擴(kuò)展位的填充充,簡稱簡稱 0 擴(kuò)充。擴(kuò)充。 這樣立即數(shù)這樣立即數(shù)x7f擴(kuò)展為擴(kuò)展為0 x0000007f,帶,帶符符號數(shù)擴(kuò)展時最

34、高位為號數(shù)擴(kuò)展時最高位為 1 時時(可強(qiáng)制可強(qiáng)制) 以以 1 進(jìn)行擴(kuò)展位的填充,進(jìn)行擴(kuò)展位的填充,最高位為最高位為 0 時以時以 0 進(jìn)行擴(kuò)展位的填充,稱為符號擴(kuò)充。但簡進(jìn)行擴(kuò)展位的填充,稱為符號擴(kuò)充。但簡寫的寫的 int 立即數(shù)立即數(shù) 0 x9f 等價于等價于 0 x0000009f。 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1x7f(0擴(kuò)展擴(kuò)展) x9f (1擴(kuò)展擴(kuò)展) 32例例 短整型數(shù)向長整型數(shù)的擴(kuò)展短整型數(shù)向長整型數(shù)的擴(kuò)展#include

35、 void main (void) short s= (signed char) 0 x7f; printf (%08x,%dn,s,s); /輸出輸出0000007f,127 int k= 0 x9f; printf (%08x,%dn,k,k); /輸出輸出0000009f,159 int i=(signed char) 0 x9f; printf (%x,%dn,i,i); /輸出輸出ffffff9f,-97 333. 向低字節(jié)截斷轉(zhuǎn)換向低字節(jié)截斷轉(zhuǎn)換 整型數(shù)據(jù)可以轉(zhuǎn)換為更短的有符號或無符號整數(shù)整型數(shù)據(jù)可以轉(zhuǎn)換為更短的有符號或無符號整數(shù),這種轉(zhuǎn)這種轉(zhuǎn)換稱為向低字節(jié)轉(zhuǎn)換。換稱為向低字節(jié)轉(zhuǎn)換

36、。 長字節(jié)的整型數(shù)據(jù)賦給短字節(jié)的整型變量時,數(shù)據(jù)從低長字節(jié)的整型數(shù)據(jù)賦給短字節(jié)的整型變量時,數(shù)據(jù)從低位到高位以字節(jié)為單位輸送。位到高位以字節(jié)為單位輸送。 4 字節(jié)的字節(jié)的long整型轉(zhuǎn)換為整型轉(zhuǎn)換為2字節(jié)的字節(jié)的short整型,只將低整型,只將低16的數(shù)據(jù)轉(zhuǎn)送。的數(shù)據(jù)轉(zhuǎn)送。 2字節(jié)的字節(jié)的short整型賦給為整型賦給為1字節(jié)的字節(jié)的char型變量,只將低型變量,只將低8的數(shù)據(jù)轉(zhuǎn)送。的數(shù)據(jù)轉(zhuǎn)送。 如果源數(shù)據(jù)的高如果源數(shù)據(jù)的高16位或高位或高8位非位非0,高位多余的字節(jié)對應(yīng),高位多余的字節(jié)對應(yīng)的數(shù)據(jù)被截斷的數(shù)據(jù)被截斷, 此時導(dǎo)致數(shù)據(jù)損失。此時導(dǎo)致數(shù)據(jù)損失。34例例 長整型數(shù)向短整型數(shù)的截斷賦值長整型數(shù)向短整型數(shù)的截斷賦值#include void main (void) long n= 0 xfedc8f63; short s=n; printf (%08x,%dn,s,s); unsign

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論