




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第二章程序的數據描述(1)--基本數據類型與表達式(深入話題)主要內容操作數的類型轉換實數的“等于”與“不等于”比較短路求值帶副作用的操作符的表達式計算左值表達式和右值表達式操作數的類型轉換在C++中,進行運算前有時需要對操作數進行類型轉換,對一些雙目操作符,當兩個操作數類型不同時,往往要把它們轉換成相同類型,操作結果的類型一般與轉換后的操作數類型相同。C++的類型轉換方式有兩種:隱式轉換:由編譯程序按照某種預定的規則進行自動轉換。顯式轉換:由寫程序的人在程序中用類型轉換操作符明確地指出轉換。不管是隱式轉換還是顯式轉換,都不會改變被轉換的操作數,轉換得到的結果將存儲在臨時的存儲單元中。隱式轉換對于算術運算操作,當操作數類型為算術類型或枚舉類型時,編譯程序將在進行算術運算前按常規算術轉換規則(usualarithmeticconversions)自動進行操作數類型的隱式轉換。算術運算的結果類型與轉換后的操作數類型相同。常規算術轉換規則
(usualarithmeticconversions)如果其中一個操作數類型為longdouble,則另一個轉換成longdouble。否則,如果其中一個操作數類型為double,則另一個轉換成double。否則,如果其中一個操作數類型為float,則另一個轉換成float。否則,先對操作數進行整型提升轉換(integralpromotions),如果轉換后操作數的類型不一樣,則按e)以后的規則再進行轉換。如果其中一個操作數類型為unsignedlongint,則另一個轉換成unsignedlongint。否則,如果一個操作數類型為longint,另一個操作數類型為unsignedint,那么,如果longint能表示unsignedint的所有值,則unsignedint轉換成longint,否則,兩個操作數都轉化成unsignedlongint。否則,如果一個操作數類型為longint,則另一個操作數轉換成longint。否則,如果一個操作數類型為unsignedint,則另一個操作數轉換成unsignedint。整型提升轉換
(integralpromotions)對于char、signedchar、unsignedchar、shortint、unsignedshortint類型,如果int型能夠表示它們的值,則這些類型轉換成int,否則,這些類型轉換成unsignedint。bool型轉換成int型,false為0;true為1。wchar_t和枚舉類型轉換成下列類型中第一個能表示其所有值的類型:int、unsignedint、longint、unsignedlongint。對于關系操作,當操作數是算術類型和枚舉類型時,編譯程序將按常規算術轉換規則對它們進行轉換。對于邏輯操作,當操作數是算術型、枚舉類型和指針類型數據進行操作,在操作前需進行邏輯類型轉換:對于算術型和枚舉類型,零轉成false,非零轉成true;對于指針類型,空指針轉成false,非空指針轉成true。對于邏輯位操作,編譯程序將會按常規算術轉換規則對操作數進行類型轉換,運算結果的類型與轉換后的操作數類型相同。對于移位操作,編譯程序會對操作數按整型提升規則進行類型轉換,運算結果的類型與第一個操作數類型(進行類型轉換之后)相同。對于賦值操作,當賦值操作的兩個操作數類型不同時,將按賦值轉換規則進行隱式類型轉換,即,把右邊操作數轉換成左邊的操作數類型。對于條件操作符:第一個操作數也可以是算術型、枚舉類型以及指針類型,編譯程序將對其進行邏輯轉換:0轉成false;非0轉成true。第二、三個操作數可以是任意類型,當它們的類型不同時,編譯程序將對它們進行類型轉換,其中,對于算術類型和枚舉類型,編譯程序將按常規算術轉換規則進行轉換。條件操作的結果類型為轉換之后的第二、三個操作數類型。隱式轉換的問題導致應該不合法的變成合法了!if(x=1)...//假設x的值為0if(a==b==c)...//假設a=5,b=5,c=5if(a<b<c)...//假設a=1,b=3,c=2在寫下面的操作符時一定要小心,不要寫錯了,編譯程序往往發現不了這類錯誤!==與=&&與&||與|<<與<>>與>隱式轉換的問題(續)隱式轉換有時不能滿足要求。例如:
inti=-10; unsignedintj=3; i+j將得到錯誤的結果:4294967289再例如:(溢出)
inti=2147483647;//int類型中最大的正整數
intj=10; i+j將得到錯誤的結果:-2147483639顯式轉換(強制類型轉換)顯式轉換是指在程序中用類型轉換操作符顯式地指出轉換,顯式轉換又稱強制類型轉換。其格式為:
<類型名>(<操作數>)或
(<類型名>)<操作數>例如:
inti=-10; unsignedintj=3; i+(int)j將得到正確的結果:-7再例如:
inti=2147483647;//int類型中最大的正整數
intj=10; (double)i+j將得到正確的結果:2147483657.0表達式中的類型轉換編譯程序常常要對表達式中的操作數進行隱式類型轉換,轉換過程是逐個操作符進行類型轉換。例如:shortinta=2;intb=2147483647;//int類型中最大的正整數doublec=2.0;表達式:a*b/c將得到錯誤的結果:-1.0。解決辦法:
(double)a*b/c或
a*(double)b/c結果為:2147483647.0一些實數在計算機內部表示的是其近似值,用關系操作符直接對浮點數進行比較,有時會得出錯誤的結果:doubled1=0.1,d2=0.2,d=d1+d2;d==0.3//?......doublex,y;......y-x*(y/x)==0.0//?應避免對兩個實數進行“==”和“!=”比較運算,應該通過計算它們的差的絕對值是否小于或大于某個很小的數來實現:x==y 可寫成:fabs(x-y)<1e-6x!=y 可寫成:fabs(x-y)>1e-6實數的“等于”與“不等于”比較短路求值(short-circuitevaluation)在C++中,對于邏輯“與”操作符“&&”邏輯“或”操作符“||”如果第一個操作數已能確定運算結果了,則不再計算第二個操作數的值,該規則稱為短路求值。例如:false&&x的結果為falsetrue||x的結果為true短路求值一方面能夠提高邏輯運算的效率,另一方面它也能為邏輯運算式中的其它運算提供一個“衛士”(guard)。例如:
(number!=0)&&(1/number>0.5)操作符的副作用通常情況下,操作符所指定的運算不會改變操作數的值(運算結果將保存在臨時的存儲單元中)。例如:x+y不會改變x和y的值,計算結果保存在一個臨時的內存單元或寄存器中。 在C++語言中,有些操作符(如:賦值=、自增++、自減--等操作符)的運算在得到一個運算結果的同時,也會改變操作數的值,稱這些操作符帶有副作用。有副作用的操作有時會產生不良結果!帶副作用操作符的表達式計算對不相鄰的操作符,C++一般沒有規定計算次序(&&、||、?:和,操作符除外)。例如,對于(a+b)*(c-d),C++沒有規定+和-的計算次序。當一個表達式中包含帶副作用的操作符時,該表達式的結果是不確定的。例如:
(x+1)*(++x)由于C++沒有規定操作符+和++誰先計算,因此,不同的編譯程序可能會給出不同的實現:(假設x初值為1)先計算+,則結果為:4
先計算++,則結果為:6 應盡量避免把帶副作用的操作符用在復雜的表達式中,最好把它們作為單獨的操作來用。左值表達式和右值表達式能出現在賦值操作符左邊的表達式為左值表達式,否則是右值
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/ZJFIA 011-2023常山雙柚汁復合果汁飲料
- T/ZHCA 501-2020保健食品潤腸通便功能的斑馬魚檢測方法
- T/ZHCA 026-2023化妝品抗糖化人體測試方法
- T/YNIA 007-2022水刺法非織造布
- 電子電路基礎知識2025年考試試卷及答案
- 2025年職業健康管理師考試試題及答案
- 2025年心理咨詢實務課程考試試卷及答案
- 2025年人工智能對社會影響的研究考試題及答案
- T/XFBZ 007-2019校服專屬定制服務指南
- 2025年法律職業資格考試真題及答案
- 店面出讓股權協議書
- 深圳2025年深圳市住房公積金管理中心員額人員招聘8人筆試歷年參考題庫附帶答案詳解
- 中外航海文化知到課后答案智慧樹章節測試答案2025年春中國人民解放軍海軍大連艦艇學院
- 心肺復蘇術課件2024新版
- 復調音樂巡禮-巴赫勃蘭登堡協奏曲 課件-2023-2024學年高中音樂人音版(2019)必修音樂鑒賞
- 健康與免疫智慧樹知到答案章節測試2023年浙江中醫藥大學
- 中班語言《噓我們有個計劃》課件
- 水墨中國風名著《水滸傳》簡介主題PPT模板課件
- Q∕GDW 11958-2020 國家電網有限公司應急預案編制規范
- TCSCS 009-2020 鋼結構滑移施工技術標準
- 小學英語GreedyRabbit教案
評論
0/150
提交評論