最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++學(xué)習(xí)之算術(shù)運算符使用詳解

 更新時間:2022年06月22日 16:03:14   作者:一枚大果殼  
運算符是計算機(jī)語言提供的能對數(shù)據(jù)進(jìn)行基本運算操作的功能體。而算術(shù)運算符用來對數(shù)字型數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的加、減、乘、除。本文通過講解清楚算術(shù)運算符,讓大家了解使用C++運算符時應(yīng)該注意的事項

1. 前言

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

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

表達(dá)式由2個部分組成:

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

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

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

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

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

2. 運算符種類

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

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

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

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

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

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

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

3. 算術(shù)運算符

3.1 功能描述

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

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

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

3.2 運算符重載問題

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

int num1=30;
int num2=20;
//此處的 - 運算符表現(xiàn)出減法運算能力
int res=num1-num2;
cout<<res<<endl;
//輸出結(jié)果: 10

當(dāng)作為一元運算符時,則是取負(fù)的意思。如下代碼:

int num=-10;
int num01=-num;
cout<<num01<<endl; 
//輸出結(jié)果為 10,負(fù)負(fù)為正 

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

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

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

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

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

如下代碼:

int num1=7;
int num2=3;
int res=num1/num2;
cout<<res<<endl; 
//輸出結(jié)果:2,丟失精度

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

double num1=7;
double num2=3;
double res=num1/num2;
cout<<res<<endl; 
//輸出結(jié)果:2.33333

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

int num1=5;
int num2=3;
int res=num1 % num2;
cout<<res<<endl;
//輸出結(jié)果:2 。

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

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

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

int num1=21;
int num2=8;
int res=num1 / num2;
cout<<" / 運算:"<<res<<endl;
res=num1 % num2;
cout<<" % 運算:"<<res<<endl;

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

/ 運算:2
% 運算:5

當(dāng)2個操作數(shù)都為負(fù)數(shù)時

int num1=-21;
int num2=-8;
int res=num1 / num2;
cout<<" / 運算:"<<res<<endl;
res=num1 % num2;
cout<<" % 運算:"<<res<<endl;

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

 / 運算:2
 % 運算:-5

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

int num1=-21;
int num2=8;
int res=num1 / num2;
cout<<" / 運算:"<<res<<endl;
res=num1 % num2;
cout<<" % 運算:"<<res<<endl;

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

/ 運算:-2
% 運算:-5

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

int num1=21;
int num2=-8;
int res=num1 / num2;
cout<<" / 運算:"<<res<<endl;
res=num1 % num2;
cout<<" % 運算:"<<res<<endl;

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

/ 運算:-2
% 運算:5

結(jié)論

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

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

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

short num=32767;
short num01=num+1;
cout<<num01<<endl;

輸出結(jié)果:

數(shù)字:-32768

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

對于無符號 short,可以認(rèn)為其有 2 部分,一部分為負(fù)數(shù),一部分為正數(shù)。當(dāng)正數(shù)溢出后,會進(jìn)入負(fù)數(shù)部分。

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

short num1=-32768;
short num2=num1-1;
cout<<num2;
//輸出結(jié)果:32767

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

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

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

3.6 類型轉(zhuǎn)換

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

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

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

  • 整型提升C++bool、char、unsigned charsigned charshort值轉(zhuǎn)換為 int。這些轉(zhuǎn)換被稱為整型提升。
  • 浮點提升:整型類型自動向浮點類型轉(zhuǎn)換,如 int向 double轉(zhuǎn)換。這種轉(zhuǎn)換是不會存在數(shù)據(jù)丟失問題,但會產(chǎn)生空間浪費。
  • 向下縮窄: 當(dāng)目標(biāo)類型小于原類型時,如double 向 int轉(zhuǎn)換,int類型向short轉(zhuǎn)換時,這種轉(zhuǎn)換是可以的,但會發(fā)生數(shù)據(jù)丟失的情況。可能會得不到預(yù)期結(jié)果。

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

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

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

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

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

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

double num1=7;
int num2=3;
double res=num1/num2;
cout<<res<<endl; 
//輸出結(jié)果:2.33333

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

int num1=20;
char num2='A';
int res=num1+num2;
cout<<res<<endl;
//輸出結(jié)果: 85
  • char類型會轉(zhuǎn)換成 int類型。
  • 字符保存在計算機(jī)上時,需要對其進(jìn)行數(shù)字編碼,字符轉(zhuǎn)換成 int的數(shù)字是底層的編碼數(shù)字。

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

int num1=20;
bool num2=true;
int res=num1+num2;
cout<<res<<endl;
  • C++中,bool數(shù)據(jù)類型本質(zhì)上就是int類型。
  • true會轉(zhuǎn)換為 1。false會轉(zhuǎn)換為0。

3.7 {}賦值語法

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

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

char c1= {44555};

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

int x=66;
char c4={x};

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

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

  • (目標(biāo)類型名)變量。
  • 目標(biāo)類型名(變量)。

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

double num1=23.6;
//C++強(qiáng)制類型轉(zhuǎn)換語法
int num2=double(num1);
cout<<num2<<endl;
//C 強(qiáng)制類型轉(zhuǎn)換語法
num2=(double)num1;
cout<<num2<<endl;

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

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

3.9 auto 語法

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

// num 是浮點數(shù)據(jù)類型
auto num=5.3;
//num1 是整型數(shù)據(jù)類型
auto num1=4;

如 PythonJS就是一種動態(tài)語言,表現(xiàn)在數(shù)據(jù)類型可以底層編譯器自動識別。

雖然C++有 auto語法,但C++歸屬于弱類型語言,在數(shù)據(jù)類型識別上,一半依賴于開發(fā)者的語法約束,一半依賴編譯器的自動識別。

4. 總結(jié)

C++語言的開放性,數(shù)據(jù)類型的自我適應(yīng)性非常靈活。在一個表達(dá)式,當(dāng)出現(xiàn)類型不同的情況時,編譯器會試圖進(jìn)行各種類型上的轉(zhuǎn)換,讓表達(dá)式符合類型相同的運算原則。

寬松的好處是速度快,但也會帶來潛在的風(fēng)險,開發(fā)者應(yīng)該盡可能在語法上對數(shù)據(jù)類型進(jìn)行約束,不要過于依賴編譯器。養(yǎng)成良好的編碼習(xí)慣。

以上就是C++學(xué)習(xí)之算術(shù)運算符使用詳解的詳細(xì)內(nèi)容,更多關(guān)于C++算術(shù)運算符的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Win32下C++實現(xiàn)快速獲取硬盤分區(qū)信息

    Win32下C++實現(xiàn)快速獲取硬盤分區(qū)信息

    這篇文章主要為大家詳細(xì)介紹了Win32下C++如何實現(xiàn)快速獲取硬盤分區(qū)信息,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • C++中的vector中erase用法實例代碼

    C++中的vector中erase用法實例代碼

    在vector數(shù)組中我們刪除數(shù)組經(jīng)常用的就是erase方法,但是earse的用法一不注意就會出錯,今天我就遇到了,所以在這里總結(jié)一下,避免大家用錯,對vector中erase用法感興趣的朋友跟隨小編一起看看吧
    2022-11-11
  • 詳解C語言在STM32中的內(nèi)存分配問題

    詳解C語言在STM32中的內(nèi)存分配問題

    這篇文章主要介紹了C語言在STM32中的內(nèi)存分配,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例

    C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例

    深度優(yōu)先搜索即是對一個新發(fā)現(xiàn)的節(jié)點上如果還關(guān)聯(lián)未探測到的邊,就沿此邊探測下去,直到發(fā)現(xiàn)從原點可達(dá)的所有點為止,這里我們就來展示C語言通過深度優(yōu)先搜索來解電梯問題和N皇后問題的示例
    2016-06-06
  • 淺談c++ vector和map的遍歷和刪除對象

    淺談c++ vector和map的遍歷和刪除對象

    下面小編就為大家?guī)硪黄獪\談c++ vector和map的遍歷和刪除對象。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 安裝及使用方法(圖文教程)

    Dev C++ 是一款非常好用,簡約的C/C++開發(fā)工具,本文主要介紹了Dev C++ 安裝及使用方法(圖文教程),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析

    c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析

    這篇文章主要介紹了c++指針參數(shù)傳遞和引用參數(shù)傳遞的區(qū)別解析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)深入解析

    先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)深入解析

    以下是對先序遍歷二叉樹的遞歸實現(xiàn)與非遞歸實現(xiàn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C++程序檢測內(nèi)存泄漏的方法分享

    C++程序檢測內(nèi)存泄漏的方法分享

    這篇文章主要介紹了C++程序檢測內(nèi)存泄漏的方法分享,本文講解了、對象計數(shù)、重載new和delete、Hook Windows系統(tǒng)API、使用DiagLeak檢測等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法

    用來映射Unicode字符串的WideCharToMultiByte函數(shù)經(jīng)常被用來進(jìn)行UTF-8編碼的轉(zhuǎn)換,以下我們將看到C++使用WideCharToMultiByte函數(shù)生成UTF-8編碼文件的方法,首先先來對WideCharToMultiByte作一個詳細(xì)的了解:
    2016-06-06

最新評論

湄潭县| 吉安市| 荥经县| 临西县| 策勒县| 夏津县| 鄢陵县| 班戈县| 昌黎县| 吉安市| 托克托县| 宿迁市| 朝阳区| 醴陵市| 宜良县| 霍州市| 崇文区| 陆良县| 克什克腾旗| 福海县| 东安县| 金乡县| 木兰县| 新竹市| 潼南县| 行唐县| 白沙| 义乌市| 赤壁市| 永宁县| 锡林郭勒盟| 鹤峰县| 宜川县| 饶河县| 东城区| 梁平县| 孝义市| 大邑县| 延吉市| 山丹县| 北流市|