溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++算術(shù)運(yùn)算符如何使用

發(fā)布時(shí)間:2022-06-23 09:48:35 來源:億速云 閱讀:105 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“C++算術(shù)運(yùn)算符如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C++算術(shù)運(yùn)算符如何使用”吧!

    1. 前言

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

    • 抽象形態(tài):存在于意識形態(tài),強(qiáng)調(diào)思考過程,與具體的編程語言無關(guān)。

    • 具體形態(tài):通過代碼來實(shí)現(xiàn)。需要使用表達(dá)式描述完整的計(jì)算過程。

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

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

    • 運(yùn)算符。

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

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

    在使用運(yùn)算符時(shí),需要遵守下面的2個(gè)基本原則:

    • 運(yùn)算符對操作的數(shù)據(jù)有內(nèi)置的類型要求。如數(shù)學(xué)運(yùn)算符要求操作數(shù)是數(shù)字類型。

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

    2. 運(yùn)算符種類

    C++中的運(yùn)算符非常多,如下是幾類常用的運(yùn)算符:

    • 算術(shù)運(yùn)算符。

    • 邏輯、關(guān)系運(yùn)算符。

    • 賦值運(yùn)算符。

    • 遞增、遞減運(yùn)算符。

    • 成員訪問運(yùn)算符。

    • 條件運(yùn)算符。

    • 位運(yùn)算符。

    • sizeof 運(yùn)算符。

    • 逗號運(yùn)算符。

    使用運(yùn)算符前,需要理解如下幾個(gè)概念:

    • 運(yùn)算符的優(yōu)先級: 不同類別中的運(yùn)算符的優(yōu)先級是不相同的。當(dāng)在一個(gè)表達(dá)式中出現(xiàn)多個(gè)運(yùn)算符時(shí),則需要根據(jù)運(yùn)算符的優(yōu)先級進(jìn)行先后運(yùn)算。

    • 運(yùn)算符的操作數(shù): 作用于一個(gè)操作數(shù)的運(yùn)算符為一元運(yùn)算符,作用于兩個(gè)操作數(shù)的運(yùn)算符為二元運(yùn)算符。C++中還有一個(gè)可作用于三個(gè)操作數(shù)的條件運(yùn)算符。

    • 結(jié)合性: 當(dāng)復(fù)雜表達(dá)式中的多個(gè)運(yùn)算符的優(yōu)先級相同時(shí),則要根據(jù)運(yùn)算符的結(jié)合性進(jìn)行運(yùn)算。如 100/4*8這個(gè)表達(dá)式,/*的優(yōu)先級是相同,因乘、除都是具有從左到右的結(jié)合性。所以先計(jì)算100/4=25再計(jì)算25*8。

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

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

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

    3. 算術(shù)運(yùn)算符

    3.1 功能描述

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

    • +:對2個(gè)數(shù)字類型的數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的加法運(yùn)算。

    • -:對2個(gè)數(shù)字類型的數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的減法運(yùn)算。

    • *:對2個(gè)數(shù)字類型的數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的乘法運(yùn)算。

    • /:對2個(gè)數(shù)字類型的數(shù)據(jù)進(jìn)行數(shù)學(xué)語義上的除法運(yùn)算。

    • %:取余或取模操作運(yùn)算符。運(yùn)算結(jié)果是兩個(gè)操作數(shù)相除后的余數(shù)部分,不能用于浮點(diǎn)數(shù)據(jù)類型。

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

    3.2 運(yùn)算符重載問題

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

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

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

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

    同理,+運(yùn)算符也存在重載。

    運(yùn)算符重載是C++中的一個(gè)特色。

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

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

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

    如下代碼:

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

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

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

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

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

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

    C++算術(shù)運(yùn)算符如何使用

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

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

    int num1=21;
    int num2=8;
    int res=num1 / num2;
    cout<<" / 運(yùn)算:"<<res<<endl;
    res=num1 % num2;
    cout<<" % 運(yùn)算:"<<res<<endl;

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

    / 運(yùn)算:2
    % 運(yùn)算:5

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

    int num1=-21;
    int num2=-8;
    int res=num1 / num2;
    cout<<" / 運(yùn)算:"<<res<<endl;
    res=num1 % num2;
    cout<<" % 運(yùn)算:"<<res<<endl;

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

     / 運(yùn)算:2
     % 運(yùn)算:-5

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

    int num1=-21;
    int num2=8;
    int res=num1 / num2;
    cout<<" / 運(yùn)算:"<<res<<endl;
    res=num1 % num2;
    cout<<" % 運(yùn)算:"<<res<<endl;

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

    / 運(yùn)算:-2
    % 運(yùn)算:-5

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

    int num1=21;
    int num2=-8;
    int res=num1 / num2;
    cout<<" / 運(yùn)算:"<<res<<endl;
    res=num1 % num2;
    cout<<" % 運(yùn)算:"<<res<<endl;

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

    / 運(yùn)算:-2
    % 運(yùn)算:5

    結(jié)論

    • 當(dāng)2個(gè)數(shù)字使用 %運(yùn)算符進(jìn)行相除操作時(shí),運(yùn)算結(jié)果的正負(fù)號與 num1操作數(shù)(被除數(shù))的正負(fù)號保持一致。

    • /運(yùn)算符運(yùn)算結(jié)果的正負(fù)號和數(shù)學(xué)上的語義一致。兩個(gè)操作數(shù)都為正或?yàn)樨?fù)時(shí)則正正得正,負(fù)負(fù)得正。兩個(gè)操作數(shù)為一正一負(fù)時(shí):則正負(fù)得負(fù)。

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

    在使用算術(shù)運(yùn)算符時(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。但實(shí)際結(jié)果是 -32768。因?yàn)?nbsp;32768已經(jīng)超過short范圍,編譯器會重新計(jì)算出一個(gè)新的結(jié)果(并不是預(yù)期值)。這種現(xiàn)象叫數(shù)據(jù)溢出。

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

    C++算術(shù)運(yùn)算符如何使用

    如下代碼,因溢出,超過了負(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ù)類型小的類型變量中時(shí)。

    • double 數(shù)據(jù)存儲到 int 類型變量中。

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

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

    • &hellip;&hellip;

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

    3.6 類型轉(zhuǎn)換

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

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

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

    • 整型提升C++bool、char、unsigned char、signed charshort值轉(zhuǎn)換為 int。這些轉(zhuǎn)換被稱為整型提升。

    • 浮點(diǎn)提升:整型類型自動(dòng)向浮點(diǎn)類型轉(zhuǎn)換,如 int向 double轉(zhuǎn)換。這種轉(zhuǎn)換是不會存在數(shù)據(jù)丟失問題,但會產(chǎn)生空間浪費(fèi)。

    • 向下縮窄: 當(dāng)目標(biāo)類型小于原類型時(shí),如double 向 int轉(zhuǎn)換,int類型向short轉(zhuǎn)換時(shí),這種轉(zhuǎn)換是可以的,但會發(fā)生數(shù)據(jù)丟失的情況??赡軙貌坏筋A(yù)期結(jié)果。

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

    缸里面的水倒到碗里,如果缸里面的水很少,不夠或者剛夠一碗水,不會發(fā)生水丟失。但是,這里會有潛在丟失問題,因?yàn)樯畛WR告訴我們,缸里面的水往往是要超過一個(gè)碗所能盛下的容量。

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

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

    double num1=7;
    int num2=3;
    int res=num1/num2;
    cout<<res<<endl; 
    //輸出結(jié)果: 2
    • 浮點(diǎn)提升num2中的數(shù)據(jù)會被轉(zhuǎn)換成double數(shù)據(jù)類型,讓右邊的表達(dá)式符合同類型原則。此時(shí),右邊表達(dá)式運(yùn)算后的結(jié)果類型為 double。這一步不會發(fā)生數(shù)據(jù)丟失問題。

    • 向下縮窄: 左邊的res變量類型為int ,編譯器會把右邊的double類型結(jié)果轉(zhuǎn)換成 int。如果數(shù)值大于int類型范圍時(shí),則會出現(xiàn)丟失精度問題。

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

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

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

    int num1=20;
    char num2='A';
    int res=num1+num2;
    cout<<res<<endl;
    //輸出結(jié)果: 85
    • char類型會轉(zhuǎn)換成 int類型。

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

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

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

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

    char c1= {44555};

    因 X是一個(gè)變量,在運(yùn)行時(shí),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)建一個(gè)新的值。用于表達(dá)式中進(jìn)行計(jì)算。

    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 個(gè)類型轉(zhuǎn)換運(yù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)換時(shí)才能轉(zhuǎn)換。

    • reinterpret_cast。用于一些有很大潛在危險(xiǎn)的類型轉(zhuǎn)換。

    3.9 auto 語法

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

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

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

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

    到此,相信大家對“C++算術(shù)運(yùn)算符如何使用”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI