C++學習之算術(shù)運算符使用詳解_第1頁
C++學習之算術(shù)運算符使用詳解_第2頁
C++學習之算術(shù)運算符使用詳解_第3頁
C++學習之算術(shù)運算符使用詳解_第4頁
C++學習之算術(shù)運算符使用詳解_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第C++學習之算術(shù)運算符使用詳解目錄1.前言2.運算符種類3.算術(shù)運算符3.1功能描述3.2運算符重載問題3.3兩數(shù)相除的問題3.4關(guān)于/和%運算符的正、負問題3.5數(shù)據(jù)溢出問題3.6類型轉(zhuǎn)換3.7{}賦值語法3.8強制類型轉(zhuǎn)換3.9auto語法4.總結(jié)

1.前言

編寫程序時,數(shù)據(jù)確定后,就需要為數(shù)據(jù)提供相應(yīng)的處理邏輯(方案或算法)。所謂邏輯有2種存在形態(tài):

抽象形態(tài):存在于意識形態(tài),強調(diào)思考過程,與具體的編程語言無關(guān)。具體形態(tài):通過代碼來實現(xiàn)。需要使用表達式描述完整的計算過程。

表達式由2個部分組成:

數(shù)據(jù)。也可稱為操作數(shù)。運算符。

運算符是計算機語言提供的能對數(shù)據(jù)進行基本運算操作的功能體。開發(fā)者在實現(xiàn)自己的邏輯運算時,需要組合這些運算符來描述自己的邏輯運算過程。

Tip:可以把C++的運算符看成一種特殊語法格式的函數(shù),或把C++中的函數(shù)當成一種特殊的運算符。

在使用運算符時,需要遵守下面的2個基本原則:

運算符對操作的數(shù)據(jù)有內(nèi)置的類型要求。如數(shù)學運算符要求操作數(shù)是數(shù)字類型。如果運算符需要多個操作數(shù)時,則要求數(shù)據(jù)類型必須相同。如果出現(xiàn)類型不一致時,編譯器會試著把不同類型的數(shù)據(jù)轉(zhuǎn)換成同類型的數(shù)據(jù)后再進行運算。開發(fā)者也可以顯示進行強制類型轉(zhuǎn)換。

2.運算符種類

C++中的運算符非常多,如下是幾類常用的運算符:

算術(shù)運算符。邏輯、關(guān)系運算符。賦值運算符。遞增、遞減運算符。成員訪問運算符。條件運算符。位運算符。sizeof運算符。逗號運算符。

使用運算符前,需要理解如下幾個概念:

運算符的優(yōu)先級:不同類別中的運算符的優(yōu)先級是不相同的。當在一個表達式中出現(xiàn)多個運算符時,則需要根據(jù)運算符的優(yōu)先級進行先后運算。運算符的操作數(shù):作用于一個操作數(shù)的運算符為一元運算符,作用于兩個操作數(shù)的運算符為二元運算符。C++中還有一個可作用于三個操作數(shù)的條件運算符。結(jié)合性:當復雜表達式中的多個運算符的優(yōu)先級相同時,則要根據(jù)運算符的結(jié)合性進行運算。如100/4*8這個表達式,/和*的優(yōu)先級是相同,因乘、除都是具有從左到右的結(jié)合性。所以先計算100/4=25再計算25*8。

Tip:只有當兩個運算符作用于同一個操作數(shù)時,優(yōu)先級和結(jié)合性才有意義。

C++中的基礎(chǔ)運算符較多,且因C++是弱類型語言,每一種運算符在使用過程中都存在很多細節(jié)問題。算術(shù)運算符又是運算符中的基礎(chǔ)運算符。

本文試圖通過講解清楚算術(shù)運算符,讓閱讀者了解使用C++運算符時應(yīng)該注意的事項。

3.算術(shù)運算符

3.1功能描述

算術(shù)運算符用來對數(shù)字型數(shù)據(jù)進行數(shù)學語義上的加、減、乘、除。此類中有5個運算符:

+:對2個數(shù)字類型的數(shù)據(jù)進行數(shù)學語義上的加法運算。-:對2個數(shù)字類型的數(shù)據(jù)進行數(shù)學語義上的減法運算。*:對2個數(shù)字類型的數(shù)據(jù)進行數(shù)學語義上的乘法運算。/:對2個數(shù)字類型的數(shù)據(jù)進行數(shù)學語義上的除法運算。%:取余或取模操作運算符。運算結(jié)果是兩個操作數(shù)相除后的余數(shù)部分,不能用于浮點數(shù)據(jù)類型。

算術(shù)運算符是二元運算符。使用時,需要提供2個操作數(shù)。

3.2運算符重載問題

C++可以重載運算符,所謂重載運算符,指同一個運算符可以根據(jù)使用時的上下文信息,表現(xiàn)出不同的運算能力。如-運算符,當作為二元運算符時,用來對操作數(shù)進行相減操作。

intnum1=30;

intnum2=20;

//此處的-運算符表現(xiàn)出減法運算能力

intres=num1-num2;

coutresendl;

//輸出結(jié)果:10

當作為一元運算符時,則是取負的意思。如下代碼:

intnum=-10;

intnum01=-num;

coutnum01endl;

//輸出結(jié)果為10,負負為正

同理,+運算符也存在重載。

運算符重載是C++中的一個特色。

對于有符號數(shù)據(jù)類型而言,如果在字面常量前面沒有顯示提供正、負符號,則默認為+(正)符號。

3.3兩數(shù)相除的問題

當/運算符作用于2個整型數(shù)字時,會得到舍棄小數(shù)點后的整數(shù)部分數(shù)值,或稱為兩數(shù)相除的商,意味著會丟失精度。

如下代碼:

intnum1=7;

intnum2=3;

intres=num1/num2;

coutresendl;

//輸出結(jié)果:2,丟失精度

如果要保留兩個數(shù)字相除的精度,則應(yīng)該以浮點數(shù)據(jù)類型的身份進行相除。

doublenum1=7;

doublenum2=3;

doubleres=num1/num2;

coutresendl;

//輸出結(jié)果:2.33333

%運算符作用于2個整型類型的數(shù)據(jù)時,運算結(jié)果是2個數(shù)字相除之后的余數(shù)部分。如下代碼:

intnum1=5;

intnum2=3;

intres=num1%num2;

coutresendl;

//輸出結(jié)果:2。

%用于浮點數(shù)據(jù)類型相除時,會出現(xiàn)編譯錯誤。也就是%只能用于整型數(shù)據(jù)的運算,不能用于浮點數(shù)據(jù)類型。

3.4關(guān)于/和%運算符的正、負問題

當2個操作數(shù)據(jù)都是正數(shù)時

intnum1=21;

intnum2=8;

intres=num1/num2;

cout"/運算:"resendl;

res=num1%num2;

cout"%運算:"resendl;

/和%動算符的輸出結(jié)果都是正數(shù)。

/運算:2

%運算:5

當2個操作數(shù)都為負數(shù)時

intnum1=-21;

intnum2=-8;

intres=num1/num2;

cout"/運算:"resendl;

res=num1%num2;

cout"%運算:"resendl;

輸出結(jié)果,一個是正數(shù),一個是負數(shù)。

/運算:2

%運算:-5

當2個操作數(shù)中被除數(shù)為負,除數(shù)為正時

intnum1=-21;

intnum2=8;

intres=num1/num2;

cout"/運算:"resendl;

res=num1%num2;

cout"%運算:"resendl;

輸出結(jié)果都是負數(shù)。

/運算:-2

%運算:-5

當2個操作數(shù)中被除數(shù)為正,除數(shù)為負時

intnum1=21;

intnum2=-8;

intres=num1/num2;

cout"/運算:"resendl;

res=num1%num2;

cout"%運算:"resendl;

輸出結(jié)果為一負一正。

/運算:-2

%運算:5

結(jié)論:

當2個數(shù)字使用%運算符進行相除操作時,運算結(jié)果的正負號與num1操作數(shù)(被除數(shù))的正負號保持一致。/運算符運算結(jié)果的正負號和數(shù)學上的語義一致。兩個操作數(shù)都為正或為負時則正正得正,負負得正。兩個操作數(shù)為一正一負時:則正負得負。

3.5數(shù)據(jù)溢出問題

在使用算術(shù)運算符時,有可能出現(xiàn)數(shù)據(jù)溢出現(xiàn)象。如下代碼:

shortnum=32767;

shortnum01=num+1;

coutnum01endl;

輸出結(jié)果:

數(shù)字:-32768

無符號short(16位)的類型數(shù)據(jù)的最大值是32767,在此數(shù)字上加一,num01的值理論是上32768。但實際結(jié)果是-32768。因為32768已經(jīng)超過short范圍,編譯器會重新計算出一個新的結(jié)果(并不是預期值)。這種現(xiàn)象叫數(shù)據(jù)溢出。

對于無符號short,可以認為其有2部分,一部分為負數(shù),一部分為正數(shù)。當正數(shù)溢出后,會進入負數(shù)部分。

如下代碼,因溢出,超過了負數(shù)區(qū)域最小值,會溢出到正數(shù)區(qū)域。

shortnum1=-32768;

shortnum2=num1-1;

coutnum2;

//輸出結(jié)果:32767

數(shù)據(jù)溢出發(fā)生在當把數(shù)據(jù)類型范圍大的數(shù)據(jù)存儲到數(shù)據(jù)類型小的類型變量中時。

double數(shù)據(jù)存儲到int類型變量中。int類型的數(shù)據(jù)存儲到short類型變量中。longlongint類型的數(shù)據(jù)存儲到int類型變量中時。

數(shù)學運算符也可以用于指針類型運算,因指針變量其數(shù)據(jù)本質(zhì)就是數(shù)字數(shù)據(jù)。但指針變量不能用于乘法和除法,加、減的語義是指針的向前后后移動,乘法、除法沒有語義價值。

3.6類型轉(zhuǎn)換

根據(jù)運算符的基本使用原則,要求所有操作數(shù)的類型必須相同。

有時,在一個表達式中,即使存在多個操作數(shù)的類型不一致,也能正常工作。那是因為,編譯器會把不同的數(shù)據(jù)類型轉(zhuǎn)換成一致,然后再進行運算。

由編譯器完成的類型轉(zhuǎn)換,稱為自動(隱式)類型轉(zhuǎn)換:

整型提升:C++將bool、char、unsignedchar、signedchar和short值轉(zhuǎn)換為int。這些轉(zhuǎn)換被稱為整型提升。浮點提升:整型類型自動向浮點類型轉(zhuǎn)換,如int向double轉(zhuǎn)換。這種轉(zhuǎn)換是不會存在數(shù)據(jù)丟失問題,但會產(chǎn)生空間浪費。向下縮窄:當目標類型小于原類型時,如double向int轉(zhuǎn)換,int類型向short轉(zhuǎn)換時,這種轉(zhuǎn)換是可以的,但會發(fā)生數(shù)據(jù)丟失的情況??赡軙貌坏筋A期結(jié)果。

碗里的水倒到缸里,不會丟失水。

缸里面的水倒到碗里,如果缸里面的水很少,不夠或者剛夠一碗水,不會發(fā)生水丟失。但是,這里會有潛在丟失問題,因為生活常識告訴我們,缸里面的水往往是要超過一個碗所能盛下的容量。

所以,向下縮窄存在潛在的數(shù)據(jù)丟失風險。

如下代碼,其中發(fā)生了2次自動類型轉(zhuǎn)換,有數(shù)據(jù)丟失的潛在風險。

doublenum1=7;

intnum2=3;

intres=num1/num2;

coutresendl;

//輸出結(jié)果:2

浮點提升:num2中的數(shù)據(jù)會被轉(zhuǎn)換成double數(shù)據(jù)類型,讓右邊的表達式符合同類型原則。此時,右邊表達式運算后的結(jié)果類型為double。這一步不會發(fā)生數(shù)據(jù)丟失問題。向下縮窄:左邊的res變量類型為int,編譯器會把右邊的double類型結(jié)果轉(zhuǎn)換成int。如果數(shù)值大于int類型范圍時,則會出現(xiàn)丟失精度問題。

如下代碼,則不會發(fā)生數(shù)據(jù)丟失問題:

doublenum1=7;

intnum2=3;

doubleres=num1/num2;

coutresendl;

//輸出結(jié)果:2.33333

如下的代碼,也會發(fā)生自動類型轉(zhuǎn)換。

intnum1=20;

charnum2='A';

intres=num1+num2;

coutresendl;

//輸出結(jié)果:85

char類型會轉(zhuǎn)換成int類型。字符保存在計算機上時,需要對其進行數(shù)字編碼,字符轉(zhuǎn)換成int的數(shù)字是底層的編碼數(shù)字。

如下代碼,也會發(fā)生自動類型。

intnum1=20;

boolnum2=true;

intres=num1+num2;

coutresendl;

C++中,bool數(shù)據(jù)類型本質(zhì)上就是int類型。true會轉(zhuǎn)換為1。false會轉(zhuǎn)換為0。

3.7{}賦值語法

C++在進行自動類型轉(zhuǎn)換時,如果目標類型小于原類型時,也是能夠轉(zhuǎn)換的,這種現(xiàn)象叫縮窄??s窄會存在潛存數(shù)據(jù)安全問題。C++11提供了{}賦值語法,會對超過范圍的縮窄進行編譯提示。如下代碼。

因44555數(shù)字已經(jīng)超過char范圍,向下縮窄不被允許。

charc1={44555};

因X是一個變量,在運行時,x有可能被修改,并讓其值大于char數(shù)字范圍,向下縮窄不被允許。

intx=66;

charc4={x};

3.8強制類型轉(zhuǎn)換

C++允許開發(fā)者顯式地進行類型轉(zhuǎn)換。語法格式有2種:

(目標類型名)變量。目標類型名(變量)。

強制類型轉(zhuǎn)換不會修改變量本身,而是創(chuàng)建一個新的值。用于表達式中進行計算。

doublenum1=23.6;

//C++強制類型轉(zhuǎn)換語法

intnum2=double(num1);

coutnum2endl;

//C強制類型轉(zhuǎn)換語法

num2=(double)num1;

coutnum2endl;

C++還提供了4個類型轉(zhuǎn)換運算符,使得轉(zhuǎn)換過程更規(guī)范。這里只做簡要介紹,有興趣者可以深入了解一下。

dynamic_cast。在類層次結(jié)構(gòu)中進行向上轉(zhuǎn)換。const_cast。用于執(zhí)行只有一種用途的類型轉(zhuǎn)換,即改變值為const或volatile。static_cast。只有當類型之間可以隱式轉(zhuǎn)換時才能轉(zhuǎn)換。reinterpret_cast。用于一些有很大潛在危險的類型轉(zhuǎn)換。

3.9auto語法

auto關(guān)鍵字在C++的作用是自動類型推導。在聲明變量時,可以使用auto關(guān)鍵字,不指定變量的類型說明。編譯器會根據(jù)變量中所存儲的數(shù)據(jù)的類型自動推導出數(shù)據(jù)類型。

//num是浮點數(shù)據(jù)類型

autonum=5.3;

//num1是整型數(shù)據(jù)類型

autonum1=4;

如Python、JS就是一種動態(tài)語言,表現(xiàn)在數(shù)據(jù)類型可

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論