版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第二章程序的數(shù)據(jù)描述(1)--基本數(shù)據(jù)類型與表達(dá)式(深入話題)主要內(nèi)容操作數(shù)的類型轉(zhuǎn)換實數(shù)的“等于”與“不等于”比較短路求值帶副作用的操作符的表達(dá)式計算左值表達(dá)式和右值表達(dá)式操作數(shù)的類型轉(zhuǎn)換在C++中,進(jìn)行運算前有時需要對操作數(shù)進(jìn)行類型轉(zhuǎn)換,對一些雙目操作符,當(dāng)兩個操作數(shù)類型不同時,往往要把它們轉(zhuǎn)換成相同類型,操作結(jié)果的類型一般與轉(zhuǎn)換后的操作數(shù)類型相同。C++的類型轉(zhuǎn)換方式有兩種:隱式轉(zhuǎn)換:由編譯程序按照某種預(yù)定的規(guī)則進(jìn)行自動轉(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(jìn)行算術(shù)運算前按常規(guī)算術(shù)轉(zhuǎn)換規(guī)則(usualarithmeticconversions)自動進(jìn)行操作數(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ù)進(jìn)行整型提升轉(zhuǎn)換(integralpromotions),如果轉(zhuǎn)換后操作數(shù)的類型不一樣,則按e)以后的規(guī)則再進(jìn)行轉(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ī)則對它們進(jìn)行轉(zhuǎn)換。對于邏輯操作,當(dāng)操作數(shù)是算術(shù)型、枚舉類型和指針類型數(shù)據(jù)進(jìn)行操作,在操作前需進(jìn)行邏輯類型轉(zhuǎn)換:對于算術(shù)型和枚舉類型,零轉(zhuǎn)成false,非零轉(zhuǎn)成true;對于指針類型,空指針轉(zhuǎn)成false,非空指針轉(zhuǎn)成true。對于邏輯位操作,編譯程序?qū)闯R?guī)算術(shù)轉(zhuǎn)換規(guī)則對操作數(shù)進(jìn)行類型轉(zhuǎn)換,運算結(jié)果的類型與轉(zhuǎn)換后的操作數(shù)類型相同。對于移位操作,編譯程序會對操作數(shù)按整型提升規(guī)則進(jìn)行類型轉(zhuǎn)換,運算結(jié)果的類型與第一個操作數(shù)類型(進(jìn)行類型轉(zhuǎn)換之后)相同。對于賦值操作,當(dāng)賦值操作的兩個操作數(shù)類型不同時,將按賦值轉(zhuǎn)換規(guī)則進(jìn)行隱式類型轉(zhuǎn)換,即,把右邊操作數(shù)轉(zhuǎn)換成左邊的操作數(shù)類型。對于條件操作符:第一個操作數(shù)也可以是算術(shù)型、枚舉類型以及指針類型,編譯程序?qū)ζ溥M(jìn)行邏輯轉(zhuǎn)換:0轉(zhuǎn)成false;非0轉(zhuǎn)成true。第二、三個操作數(shù)可以是任意類型,當(dāng)它們的類型不同時,編譯程序?qū)λ鼈冞M(jìn)行類型轉(zhuǎn)換,其中,對于算術(shù)類型和枚舉類型,編譯程序?qū)闯R?guī)算術(shù)轉(zhuǎn)換規(guī)則進(jìn)行轉(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表達(dá)式中的類型轉(zhuǎn)換編譯程序常常要對表達(dá)式中的操作數(shù)進(jìn)行隱式類型轉(zhuǎn)換,轉(zhuǎn)換過程是逐個操作符進(jìn)行類型轉(zhuǎn)換。例如:shortinta=2;intb=2147483647;//int類型中最大的正整數(shù)doublec=2.0;表達(dá)式:a*b/c將得到錯誤的結(jié)果:-1.0。解決辦法:
(double)a*b/c或
a*(double)b/c結(jié)果為:2147483647.0一些實數(shù)在計算機(jī)內(nèi)部表示的是其近似值,用關(guān)系操作符直接對浮點數(shù)進(jìn)行比較,有時會得出錯誤的結(jié)果:doubled1=0.1,d2=0.2,d=d1+d2;d==0.3//?......doublex,y;......y-x*(y/x)==0.0//?應(yīng)避免對兩個實數(shù)進(jìn)行“==”和“!=”比較運算,應(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é)果!帶副作用操作符的表達(dá)式計算對不相鄰的操作符,C++一般沒有規(guī)定計算次序(&&、||、?:和,操作符除外)。例如,對于(a+b)*(c-d),C++沒有規(guī)定+和-的計算次序。當(dāng)一個表達(dá)式中包含帶副作用的操作符時,該表達(dá)式的結(jié)果是不確定的。例如:
(x+1)*(++x)由于C++沒有規(guī)定操作符+和++誰先計算,因此,不同的編譯程序可能會給出不同的實現(xiàn):(假設(shè)x初值為1)先計算+,則結(jié)果為:4
先計算++,則結(jié)果為:6 應(yīng)盡量避免把帶副作用的操作符用在復(fù)雜的表達(dá)式中,最好把它們作為單獨的操作來用。左值表達(dá)式和右值表達(dá)式能出現(xiàn)在賦值操作符左邊的表達(dá)式為左值表達(dá)式,否則是右值
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 語文主題教學(xué)計劃例文
- 生產(chǎn)工作計劃集錦
- 實驗學(xué)校2025工作計劃
- 八年級上冊生物教學(xué)計劃例文
- 有關(guān)暑期計劃書
- 醫(yī)院醫(yī)生工作計劃文檔
- 放學(xué)期小學(xué)美術(shù)教研組工作計劃范文
- 《多熟種植》課件
- 《型玻璃完美版》課件
- 航次租船合同的權(quán)利義務(wù)
- (T8聯(lián)考)2025屆高三部分重點中學(xué)12月聯(lián)合測評語文試卷(含答案解析)
- 2024年考研(英語一)真題及參考答案
- 2023年軍隊文職統(tǒng)一考試(公共科目)試卷(含解析)
- 2024年大學(xué)生軍事理論知識競賽題庫及答案(共110道題)
- 倉庫負(fù)責(zé)人年終總結(jié)
- 地質(zhì)災(zāi)害治理施工組織設(shè)計方案
- 安裝工程計量與計價課件:安裝工程定額計價體系
- 心肺復(fù)蘇術(shù)課件2024新版
- 中國校服產(chǎn)業(yè)挑戰(zhàn)與機(jī)遇分析報告 2024
- 遼寧省大連市2023-2024學(xué)年高三上學(xué)期雙基測試(期末考試) 地理 含答案
- 2024年4s店提前還款協(xié)議書模板
評論
0/150
提交評論