亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++學習之算術運算符使用詳解

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

1. 前言

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

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

表達式由2個部分組成:

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

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

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

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

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

2. 運算符種類

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

  • 算術運算符。
  • 邏輯、關系運算符。
  • 賦值運算符。
  • 遞增、遞減運算符。
  • 成員訪問運算符。
  • 條件運算符。
  • 位運算符。
  • sizeof 運算符。
  • 逗號運算符。

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

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

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

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

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

3. 算術運算符

3.1 功能描述

算術運算符用來對數(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ù)學語義上的除法運算。
  • %:取余或取模操作運算符。運算結果是兩個操作數(shù)相除后的余數(shù)部分,不能用于浮點數(shù)據(jù)類型。

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

3.2 運算符重載問題

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

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

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

int num=-10;
int num01=-num;
cout<<num01<<endl; 
//輸出結果為 10,負負為正 

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

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

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

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

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

如下代碼:

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

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

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

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

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

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

3.4 關 于/和%運算符的正、負問題

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

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

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

/ 運算:2
% 運算:5

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

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

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

 / 運算:2
 % 運算:-5

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

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

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

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

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

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

輸出結果為一負一正。

/ 運算:-2
% 運算:5

結論

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

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

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

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

輸出結果:

數(shù)字:-32768

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

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

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

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

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

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

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

3.6 類型轉換

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.7 {}賦值語法

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

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

char c1= {44555};

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

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

3.8 強制類型轉換

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

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

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

double num1=23.6;
//C++強制類型轉換語法
int num2=double(num1);
cout<<num2<<endl;
//C 強制類型轉換語法
num2=(double)num1;
cout<<num2<<endl;

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

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

3.9 auto 語法

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

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

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

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

4. 總結

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

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

以上就是C++學習之算術運算符使用詳解的詳細內容,更多關于C++算術運算符的資料請關注腳本之家其它相關文章!

相關文章

  • C語言中強制類型轉換的常見方法

    C語言中強制類型轉換的常見方法

    強制類型轉換是一種將一個數(shù)據(jù)類型轉換為另一個數(shù)據(jù)類型的方法,這篇文章主要為大家整理了C語言中強制類型轉換的方法,需要的可以參考一下
    2023-05-05
  • 使用C語言生成圖片的base64編碼的代碼實現(xiàn)

    使用C語言生成圖片的base64編碼的代碼實現(xiàn)

    Base64編碼是一種廣泛使用的編碼方案,將任意二進制數(shù)據(jù)轉換為可打印的ASCII字符字符串,在實際應用中,Base64編碼常見于電子郵件附件、數(shù)據(jù)庫中存儲非文本數(shù)據(jù)等多種場景,本文將給大家介紹使用C語言生成圖片的base64編碼的代碼實現(xiàn),需要的朋友可以參考下
    2024-08-08
  • Qt qml實現(xiàn)動態(tài)輪播圖效果

    Qt qml實現(xiàn)動態(tài)輪播圖效果

    這篇文章主要為大家詳細介紹了Qt和qml實現(xiàn)動態(tài)輪播圖效果的相關知識,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下
    2024-12-12
  • VC6.0實現(xiàn)讀取Excel數(shù)據(jù)的方法

    VC6.0實現(xiàn)讀取Excel數(shù)據(jù)的方法

    這篇文章主要介紹了VC6.0實現(xiàn)讀取Excel數(shù)據(jù)的方法,非常實用的功能,需要的朋友可以參考下
    2014-07-07
  • 詳解C++的模板中typename關鍵字的用法

    詳解C++的模板中typename關鍵字的用法

    在C++的Template中我們經常可以見到使用typename來定義類型名稱,更加具體的我們就在接下來為大家詳解C++的模板中typename關鍵字的用法,需要的朋友可以參考下:
    2016-06-06
  • linux下基于C語言的信號編程實例

    linux下基于C語言的信號編程實例

    這篇文章主要介紹了linux下基于C語言的信號編程,實例分析了信號量的基本使用技巧與相關概念,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • OpenCV獲取視頻的每一幀并保存為.jpg圖片

    OpenCV獲取視頻的每一幀并保存為.jpg圖片

    這篇文章主要為大家詳細介紹了OpenCV獲取視頻的每一幀,并保存為.jpg圖片,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 理解C++編程中的std::function函數(shù)封裝

    理解C++編程中的std::function函數(shù)封裝

    這篇文章主要介紹了理解C++編程中的std::function函數(shù)封裝,std::function是C++11標準中的新特性,需要的朋友可以參考下
    2016-04-04
  • C語言 數(shù)組指針詳解及示例代碼

    C語言 數(shù)組指針詳解及示例代碼

    本文主要介紹C語言 數(shù)組指針,這里整理了相關資料并附示例待會及實現(xiàn)結果,幫助大家學習C語言中指針的知識,有需要學習此部分內容的朋友可以參考下
    2016-08-08
  • 解析C語言中位字段內存分配的問題

    解析C語言中位字段內存分配的問題

    本篇文章是對C語言中位字段內存分配的問題進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05

最新評論