c++程序設(shè)計第2章基本數(shù)據(jù)類型與表達式(深入)_第1頁
c++程序設(shè)計第2章基本數(shù)據(jù)類型與表達式(深入)_第2頁
c++程序設(shè)計第2章基本數(shù)據(jù)類型與表達式(深入)_第3頁
c++程序設(shè)計第2章基本數(shù)據(jù)類型與表達式(深入)_第4頁
c++程序設(shè)計第2章基本數(shù)據(jù)類型與表達式(深入)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第二章程序的數(shù)據(jù)描述(1)--基本數(shù)據(jù)類型與表達式(深入話題)主要內(nèi)容操作數(shù)的類型轉(zhuǎn)換實數(shù)的“等于”與“不等于”比較短路求值帶副作用的操作符的表達式計算左值表達式和右值表達式操作數(shù)的類型轉(zhuǎn)換在C++中,進行運算前有時需要對操作數(shù)進行類型轉(zhuǎn)換,對一些雙目操作符,當(dāng)兩個操作數(shù)類型不同時,往往要把它們轉(zhuǎn)換成相同類型,操作結(jié)果的類型一般與轉(zhuǎn)換后的操作數(shù)類型相同。C++的類型轉(zhuǎn)換方式有兩種:隱式轉(zhuǎn)換:由編譯程序按照某種預(yù)定的規(guī)則進行自動轉(zhuǎn)換。顯式轉(zhuǎn)換:由寫程序的人在程序中用類型轉(zhuǎn)換操作符明確地指出轉(zhuǎn)換。不管是隱式轉(zhuǎn)換還是顯式轉(zhuǎn)換,都不會改變被轉(zhuǎn)換的操作數(shù),轉(zhuǎn)換得到的結(jié)果將存儲在臨時的存儲單元中。隱式轉(zhuǎn)換對于算術(shù)運算操作,當(dāng)操作數(shù)類型為算術(shù)類型或枚舉類型時,編譯程序?qū)⒃谶M行算術(shù)運算前按常規(guī)算術(shù)轉(zhuǎn)換規(guī)則(usualarithmeticconversions)自動進行操作數(shù)類型的隱式轉(zhuǎn)換。算術(shù)運算的結(jié)果類型與轉(zhuǎn)換后的操作數(shù)類型相同。常規(guī)算術(shù)轉(zhuǎn)換規(guī)則

(usualarithmeticconversions)如果其中一個操作數(shù)類型為longdouble,則另一個轉(zhuǎn)換成longdouble。否則,如果其中一個操作數(shù)類型為double,則另一個轉(zhuǎn)換成double。否則,如果其中一個操作數(shù)類型為float,則另一個轉(zhuǎn)換成float。否則,先對操作數(shù)進行整型提升轉(zhuǎn)換(integralpromotions),如果轉(zhuǎn)換后操作數(shù)的類型不一樣,則按e)以后的規(guī)則再進行轉(zhuǎn)換。如果其中一個操作數(shù)類型為unsignedlongint,則另一個轉(zhuǎn)換成unsignedlongint。否則,如果一個操作數(shù)類型為longint,另一個操作數(shù)類型為unsignedint,那么,如果longint能表示unsignedint的所有值,則unsignedint轉(zhuǎn)換成longint,否則,兩個操作數(shù)都轉(zhuǎn)化成unsignedlongint。否則,如果一個操作數(shù)類型為longint,則另一個操作數(shù)轉(zhuǎn)換成longint。否則,如果一個操作數(shù)類型為unsignedint,則另一個操作數(shù)轉(zhuǎn)換成unsignedint。整型提升轉(zhuǎn)換

(integralpromotions)對于char、signedchar、unsignedchar、shortint、unsignedshortint類型,如果int型能夠表示它們的值,則這些類型轉(zhuǎn)換成int,否則,這些類型轉(zhuǎn)換成unsignedint。bool型轉(zhuǎn)換成int型,false為0;true為1。wchar_t和枚舉類型轉(zhuǎn)換成下列類型中第一個能表示其所有值的類型:int、unsignedint、longint、unsignedlongint。對于關(guān)系操作,當(dāng)操作數(shù)是算術(shù)類型和枚舉類型時,編譯程序?qū)闯R?guī)算術(shù)轉(zhuǎn)換規(guī)則對它們進行轉(zhuǎn)換。對于邏輯操作,當(dāng)操作數(shù)是算術(shù)型、枚舉類型和指針類型數(shù)據(jù)進行操作,在操作前需進行邏輯類型轉(zhuǎn)換:對于算術(shù)型和枚舉類型,零轉(zhuǎn)成false,非零轉(zhuǎn)成true;對于指針類型,空指針轉(zhuǎn)成false,非空指針轉(zhuǎn)成true。對于邏輯位操作,編譯程序?qū)闯R?guī)算術(shù)轉(zhuǎn)換規(guī)則對操作數(shù)進行類型轉(zhuǎn)換,運算結(jié)果的類型與轉(zhuǎn)換后的操作數(shù)類型相同。對于移位操作,編譯程序會對操作數(shù)按整型提升規(guī)則進行類型轉(zhuǎn)換,運算結(jié)果的類型與第一個操作數(shù)類型(進行類型轉(zhuǎn)換之后)相同。對于賦值操作,當(dāng)賦值操作的兩個操作數(shù)類型不同時,將按賦值轉(zhuǎn)換規(guī)則進行隱式類型轉(zhuǎn)換,即,把右邊操作數(shù)轉(zhuǎn)換成左邊的操作數(shù)類型。對于條件操作符:第一個操作數(shù)也可以是算術(shù)型、枚舉類型以及指針類型,編譯程序?qū)ζ溥M行邏輯轉(zhuǎn)換:0轉(zhuǎn)成false;非0轉(zhuǎn)成true。第二、三個操作數(shù)可以是任意類型,當(dāng)它們的類型不同時,編譯程序?qū)λ鼈冞M行類型轉(zhuǎn)換,其中,對于算術(shù)類型和枚舉類型,編譯程序?qū)闯R?guī)算術(shù)轉(zhuǎn)換規(guī)則進行轉(zhuǎn)換。條件操作的結(jié)果類型為轉(zhuǎn)換之后的第二、三個操作數(shù)類型。隱式轉(zhuǎn)換的問題導(dǎo)致應(yīng)該不合法的變成合法了!if(x=1)...//假設(shè)x的值為0if(a==b==c)...//假設(shè)a=5,b=5,c=5if(a<b<c)...//假設(shè)a=1,b=3,c=2在寫下面的操作符時一定要小心,不要寫錯了,編譯程序往往發(fā)現(xiàn)不了這類錯誤!==與=&&與&||與|<<與<>>與>隱式轉(zhuǎn)換的問題(續(xù))隱式轉(zhuǎn)換有時不能滿足要求。例如:

inti=-10; unsignedintj=3; i+j將得到錯誤的結(jié)果:4294967289再例如:(溢出)

inti=2147483647;//int類型中最大的正整數(shù)

intj=10; i+j將得到錯誤的結(jié)果:-2147483639顯式轉(zhuǎn)換(強制類型轉(zhuǎn)換)顯式轉(zhuǎn)換是指在程序中用類型轉(zhuǎn)換操作符顯式地指出轉(zhuǎn)換,顯式轉(zhuǎn)換又稱強制類型轉(zhuǎn)換。其格式為:

<類型名>(<操作數(shù)>)或

(<類型名>)<操作數(shù)>例如:

inti=-10; unsignedintj=3; i+(int)j將得到正確的結(jié)果:-7再例如:

inti=2147483647;//int類型中最大的正整數(shù)

intj=10; (double)i+j將得到正確的結(jié)果:2147483657.0表達式中的類型轉(zhuǎn)換編譯程序常常要對表達式中的操作數(shù)進行隱式類型轉(zhuǎn)換,轉(zhuǎn)換過程是逐個操作符進行類型轉(zhuǎn)換。例如:shortinta=2;intb=2147483647;//int類型中最大的正整數(shù)doublec=2.0;表達式:a*b/c將得到錯誤的結(jié)果:-1.0。解決辦法:

(double)a*b/c或

a*(double)b/c結(jié)果為:2147483647.0一些實數(shù)在計算機內(nèi)部表示的是其近似值,用關(guān)系操作符直接對浮點數(shù)進行比較,有時會得出錯誤的結(jié)果:doubled1=0.1,d2=0.2,d=d1+d2;d==0.3//?......doublex,y;......y-x*(y/x)==0.0//?應(yīng)避免對兩個實數(shù)進行“==”和“!=”比較運算,應(yīng)該通過計算它們的差的絕對值是否小于或大于某個很小的數(shù)來實現(xiàn):x==y 可寫成:fabs(x-y)<1e-6x!=y 可寫成:fabs(x-y)>1e-6實數(shù)的“等于”與“不等于”比較短路求值(short-circuitevaluation)在C++中,對于邏輯“與”操作符“&&”邏輯“或”操作符“||”如果第一個操作數(shù)已能確定運算結(jié)果了,則不再計算第二個操作數(shù)的值,該規(guī)則稱為短路求值。例如:false&&x的結(jié)果為falsetrue||x的結(jié)果為true短路求值一方面能夠提高邏輯運算的效率,另一方面它也能為邏輯運算式中的其它運算提供一個“衛(wèi)士”(guard)。例如:

(number!=0)&&(1/number>0.5)操作符的副作用通常情況下,操作符所指定的運算不會改變操作數(shù)的值(運算結(jié)果將保存在臨時的存儲單元中)。例如:x+y不會改變x和y的值,計算結(jié)果保存在一個臨時的內(nèi)存單元或寄存器中。 在C++語言中,有些操作符(如:賦值=、自增++、自減--等操作符)的運算在得到一個運算結(jié)果的同時,也會改變操作數(shù)的值,稱這些操作符帶有副作用。有副作用的操作有時會產(chǎn)生不良結(jié)果!帶副作用操作符的表達式計算對不相鄰的操作符,C++一般沒有規(guī)定計算次序(&&、||、?:和,操作符除外)。例如,對于(a+b)*(c-d),C++沒有規(guī)定+和-的計算次序。當(dāng)一個表達式中包含帶副作用的操作符時,該表達式的結(jié)果是不確定的。例如:

(x+1)*(++x)由于C++沒有規(guī)定操作符+和++誰先計算,因此,不同的編譯程序可能會給出不同的實現(xiàn):(假設(shè)x初值為1)先計算+,則結(jié)果為:4

先計算++,則結(jié)果為:6 應(yīng)盡量避免把帶副作用的操作符用在復(fù)雜的表達式中,最好把它們作為單獨的操作來用。左值表達式和右值表達式能出現(xiàn)在賦值操作符左邊的表達式為左值表達式,否則是右值

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論