成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EasyC++,C++算術(shù)運(yùn)算符與類(lèi)型轉(zhuǎn)換

開(kāi)發(fā) 后端
對(duì)于除法來(lái)說(shuō),我們要注意的是它是區(qū)分類(lèi)型的。當(dāng)我們的除數(shù)和被除數(shù)都是整數(shù)的時(shí)候,得到的結(jié)果也會(huì)是一個(gè)整數(shù)。所以10 ? 3得到的結(jié)果就是3,它的小數(shù)部分會(huì)被拋棄。想要得到小數(shù)結(jié)果,只需要除數(shù)或者被除數(shù)當(dāng)中有一個(gè)是浮點(diǎn)型即可。

[[430027]]

大家好,我是梁唐。

這是EasyC++系列第8篇,我們來(lái)聊聊C++中的算術(shù)運(yùn)算符。

想要更好的閱讀體驗(yàn),可以點(diǎn)擊下方「閱讀原文」訪(fǎng)問(wèn)github倉(cāng)庫(kù)~

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

C++當(dāng)中提供5種基礎(chǔ)的算術(shù)運(yùn)算符:加法、減法、乘法、除法和取模。

我們來(lái)看下代碼:

  1. int a = 10, b = 3; 
  2.  
  3. cout << a + b << endl;  // 13 
  4. cout << a - b << endl;  // 7 
  5. cout << a * b << endl;  // 30 
  6. cout << a / b << endl;  // 3 
  7. cout << a % b << endl;  // 1 

前面三個(gè)都非常簡(jiǎn)單,著重講下最后兩種。

對(duì)于除法來(lái)說(shuō),我們要注意的是它是區(qū)分類(lèi)型的。當(dāng)我們的除數(shù)和被除數(shù)都是整數(shù)的時(shí)候,得到的結(jié)果也會(huì)是一個(gè)整數(shù)。所以10 ? 3得到的結(jié)果就是3,它的小數(shù)部分會(huì)被拋棄。想要得到小數(shù)結(jié)果,只需要除數(shù)或者被除數(shù)當(dāng)中有一個(gè)是浮點(diǎn)型即可。

取模運(yùn)算符求的就是一個(gè)數(shù)除以另外一個(gè)數(shù)之后的余數(shù)。這里要注意,在其他語(yǔ)言當(dāng)中并沒(méi)有對(duì)取模運(yùn)算的限制,而在C++當(dāng)中,嚴(yán)格限制了取模運(yùn)算的對(duì)象只能是整數(shù)。否則編譯的時(shí)候會(huì)報(bào)錯(cuò):

優(yōu)先級(jí)

C++當(dāng)中算術(shù)運(yùn)算符的優(yōu)先級(jí)和我們從小數(shù)學(xué)課本里是一樣的,先乘除再加減。

如:

  1. 3 + 4 * 5; // 23 
  2. 120 / 4 * 5; // 150 
  3. 20 * 5 + 4 * 6; // 124 

即當(dāng)乘除法和加減法同時(shí)出現(xiàn)時(shí),先算乘除后算加減。如果有多個(gè)運(yùn)算符同樣優(yōu)先級(jí),那么先左后右。

類(lèi)型轉(zhuǎn)換

前面說(shuō)了,同樣是除法,根據(jù)除數(shù)和被除數(shù)類(lèi)型的不同,得到的結(jié)果也不同。這樣固然非常靈活,但是除了更加復(fù)雜給學(xué)習(xí)、使用者帶來(lái)負(fù)擔(dān)之外,也會(huì)使得計(jì)算機(jī)的操作更加復(fù)雜。

比如我們一共有11種整型和3種浮點(diǎn)型,那么我們?cè)谟?jì)算的時(shí)候就會(huì)出現(xiàn)大量不同的情況。比如short + short,short + int,short + double等等,那么編譯器就需要對(duì)這么多種情況都進(jìn)行處理,這顯然是非常麻煩的。為了解決這個(gè)問(wèn)題,C++會(huì)自動(dòng)執(zhí)行許多類(lèi)型轉(zhuǎn)換。

下面我們對(duì)這些情況進(jìn)行一一討論。

  • 初始化和賦值時(shí)的轉(zhuǎn)換

當(dāng)我們對(duì)某個(gè)值進(jìn)行初始化或者賦值的時(shí)候,C++會(huì)自動(dòng)將賦予的值轉(zhuǎn)化成接收者的類(lèi)型。比如:

  1. float a = 3.5f; 
  2. double b = a; 

在上面這個(gè)例子當(dāng)中,我們將一個(gè)float類(lèi)型的變量a賦值給了double類(lèi)型的b。那么編譯器會(huì)將a的值拓展成64位的double再賦值給b。也就是說(shuō)不會(huì)影響b的類(lèi)型。

這樣將長(zhǎng)度更短的變量轉(zhuǎn)化成更長(zhǎng)變量的類(lèi)型轉(zhuǎn)換除了多占用一點(diǎn)內(nèi)存之外,不會(huì)導(dǎo)致什么問(wèn)題。但反向操作可能就會(huì)出錯(cuò),比如:

  1. long long a = 0x3f3f3f3f3f3f3f; 
  2. int b = a; 

在上面的例子當(dāng)中,我們將一個(gè)long long賦值給了int,由于a的數(shù)值非常大超過(guò)了int能夠承載的范圍,進(jìn)行這樣的賦值之后,編譯器并不會(huì)報(bào)錯(cuò)(甚至不會(huì)有警告),但將會(huì)導(dǎo)致結(jié)果錯(cuò)誤。b變量將不可能再和a變量相等。

再比如將float變量賦值給int的時(shí)候,同樣也會(huì)有類(lèi)似的問(wèn)題,所以在進(jìn)行賦值的時(shí)候,當(dāng)兩個(gè)變量的類(lèi)型不同時(shí),千萬(wàn)要當(dāng)心。

  • 使用花括號(hào)進(jìn)行轉(zhuǎn)換

這是C++ 11的新特性,使用大括號(hào)進(jìn)行初始化,這種操作被稱(chēng)為列表初始化。

這種方式的好處和壞處都很明顯,好處是它不允許變量長(zhǎng)度縮窄的情況,壞處則是又增加了學(xué)習(xí)的成本。例如,不允許將浮點(diǎn)型轉(zhuǎn)換成整型。在不同的整型之間以及整型轉(zhuǎn)化成浮點(diǎn)型的操作可能被允許,取決于編譯器知道目標(biāo)變量能夠正確地存儲(chǔ)賦給它的值。比如可以將int類(lèi)型賦值給long,因?yàn)閘ong總是至少與int一樣長(zhǎng),反向操作則會(huì)被禁止。

  1. int a = 0x3f3f3f3f; 
  2. long b = {a};   // 允許 
  3.  
  4. long a = 0x3f3f3f3f; 
  5. int b = {a};    // 禁止 

關(guān)于列表初始化,C++ primer當(dāng)中還列舉了一個(gè)非常有意思的case:

  1. const int x = 55; 
  2. char c = {x};   // 允許 
  3.  
  4. int x = 55; 
  5. char c = {x}; // 禁止 
  6.  
  7. const int x = 1255; 
  8. char c = {x};   // 禁止 
  9.  
  10. const int x = 1255; 
  11. char c = x;  // 允許會(huì)警告 

這是為什么呢?因?yàn)槲覀兗恿薱onst修飾之后,編譯器就明確知道了x的值,就等于55,它在char類(lèi)型的范圍內(nèi),所以允許將它轉(zhuǎn)化成char。如果不加const,那么在編譯器看來(lái)x是一個(gè)int型的變量,它的范圍要大于char,所以會(huì)禁止。即使我們加了const修飾,如果x的值過(guò)大,超過(guò)char的范圍,也同樣會(huì)被禁止。

表達(dá)式中轉(zhuǎn)換

當(dāng)一個(gè)表達(dá)式當(dāng)中出現(xiàn)多個(gè)變量類(lèi)型的時(shí)候,C++也會(huì)進(jìn)行轉(zhuǎn)換。由于可能涉及的情況非常多,使得這個(gè)轉(zhuǎn)換的規(guī)則也會(huì)比較復(fù)雜。

表達(dá)式時(shí)C++會(huì)將bool、char、unsigned char、signed char和short全部轉(zhuǎn)換為int

對(duì)于bool類(lèi)型來(lái)說(shuō),true會(huì)被轉(zhuǎn)化成1,false轉(zhuǎn)換成0,其他類(lèi)型的轉(zhuǎn)換應(yīng)該都很好理解,都是將范圍更小的變量轉(zhuǎn)化成范圍更大的int,這種轉(zhuǎn)換稱(chēng)作整型提升。因?yàn)橥ǔnt類(lèi)型都是計(jì)算機(jī)最自然的類(lèi)型,也意味著計(jì)算機(jī)在處理int的時(shí)候,處理的速度最快。

將不同類(lèi)型進(jìn)行運(yùn)算的時(shí)候,也會(huì)做一些轉(zhuǎn)換。比如將int和float相加的時(shí)候,由于涉及到兩種類(lèi)型,其中范圍較小的那個(gè)會(huì)被轉(zhuǎn)換成較大的類(lèi)型。比如如果我們計(jì)算9.0 / 5,那么編譯器會(huì)先將5轉(zhuǎn)化成5.0,再進(jìn)行除法運(yùn)算,這樣得到的結(jié)果自然也是一個(gè)double。

C++11的規(guī)范中除了一個(gè)類(lèi)型轉(zhuǎn)換的校驗(yàn)表,我們可以參考一下校驗(yàn)表理解一下類(lèi)型轉(zhuǎn)換的過(guò)程。

  • 如果有一個(gè)數(shù)類(lèi)型是long double,則將另外一個(gè)數(shù)也轉(zhuǎn)成long double
  • 否則,如果有一個(gè)數(shù)類(lèi)型是double,則將另外一個(gè)數(shù)也轉(zhuǎn)成double
  • 否則,如果有一個(gè)數(shù)類(lèi)型是float,則將另外一個(gè)數(shù)也轉(zhuǎn)成float
  • 否則說(shuō)明所有操作數(shù)都是整數(shù),執(zhí)行整型提升

強(qiáng)制類(lèi)型轉(zhuǎn)換

C++當(dāng)中允許開(kāi)發(fā)者手動(dòng)強(qiáng)制對(duì)變量的類(lèi)型進(jìn)行轉(zhuǎn)換,這也是C++的設(shè)計(jì)思路,規(guī)則嚴(yán)謹(jǐn),但也允許推翻規(guī)則追求靈活度。

強(qiáng)制類(lèi)型轉(zhuǎn)換的方式有兩種寫(xiě)法:

  1. int a; 
  2. (long) a; 
  3. long (a); 

這兩行代碼都是將一個(gè)int型的a轉(zhuǎn)換成long型的,上面的是C語(yǔ)言的寫(xiě)法,底下一行是C++的寫(xiě)法。

還有一點(diǎn)要注意就是轉(zhuǎn)換的順序,我們來(lái)看一個(gè)例子:

  1. int a = 11.99 + 19.99; 
  2. cout << a << endl; 
  3. int b = int(11.99) + int(19.99); 
  4. cout << b << endl; 

在這段代碼當(dāng)中a和b輸出的結(jié)果是不同的,a輸出的結(jié)果是31,而b是30。

這是因?yàn)榈谝恍写a是先計(jì)算的加法,得到31.98,再通過(guò)類(lèi)型轉(zhuǎn)換將31.98轉(zhuǎn)換成int。對(duì)于浮點(diǎn)數(shù)向整型的轉(zhuǎn)換,C++會(huì)直接抹掉小數(shù)部分,所以得到的結(jié)果是31。而第二行代碼當(dāng)中,我們是先進(jìn)行的類(lèi)型轉(zhuǎn)換,11.99和19.99分別被轉(zhuǎn)換成了11和19,相加得到的結(jié)果也就是30了。

這里的一點(diǎn)差別很多新人經(jīng)常踩坑,千萬(wàn)注意。

本文轉(zhuǎn)載自微信公眾號(hào)「Coder梁」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Coder梁公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Coder梁
相關(guān)推薦

2021-12-15 10:25:57

C++運(yùn)算符重載

2021-12-16 10:40:11

C++運(yùn)算符重載

2021-10-27 16:27:20

C++指針操控

2021-10-21 18:52:00

C++數(shù)組存儲(chǔ)

2021-10-31 20:24:24

C++for循環(huán)

2009-08-11 15:51:08

C#運(yùn)算符算術(shù)運(yùn)算符

2021-10-29 09:44:50

C++指針變量

2021-11-01 15:35:31

C++自增自減

2021-12-12 18:13:54

C++This指針

2021-12-29 20:31:40

C++多態(tài)指針

2021-12-14 10:12:58

C++抽象數(shù)據(jù)

2021-11-26 00:03:20

C++編譯常量

2021-12-09 10:56:50

函數(shù)C++原型

2011-07-20 13:34:37

C++

2021-12-08 10:43:09

C++類(lèi)實(shí)現(xiàn)

2021-12-10 10:45:36

C++函數(shù)Stock

2021-10-26 00:19:51

C++結(jié)構(gòu)體存儲(chǔ)

2021-12-30 14:58:58

C++函數(shù)動(dòng)態(tài)

2023-09-07 23:30:47

運(yùn)算符C++

2021-11-09 10:38:16

C++Const指針
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕在线播放不卡 | www.中文字幕av | www日韩欧美 | 麻豆国产一区二区三区四区 | h视频在线播放 | 午夜在线影院 | 日本中文在线 | 欧美视频一级 | 亚洲男人的天堂网站 | 精品乱人伦一区二区三区 | 成人毛片视频在线播放 | 国产精品美女久久久久aⅴ国产馆 | 毛片一区二区三区 | 国产成人精品a视频一区www | 古典武侠第一页久久777 | 国产成人免费视频网站高清观看视频 | 欧美性网站 | 精产嫩模国品一二三区 | 亚洲成人免费电影 | 欧洲视频一区二区 | 精品国产免费一区二区三区五区 | 国产精品久久久久aaaa樱花 | 欧美视频一区二区三区 | 一区二区不卡视频 | 日日骑| 亚洲一区二区三区免费 | 欧美日韩一区不卡 | 天天操操 | 在线观看电影av | 国产成人精品999在线观看 | 91精品久久久久久久久中文字幕 | 免费观看色 | 一区二区亚洲 | 91亚洲国产亚洲国产 | 二区亚洲 | 一区中文字幕 | 一级毛片播放 | 极品久久 | 亚洲一区二区三区在线播放 | 91麻豆精品国产91久久久更新资源速度超快 | 国产欧美在线 |