1. 程式人生 > >《C++ Primer》讀書筆記-第二章 變數和基本型別

《C++ Primer》讀書筆記-第二章 變數和基本型別

   第一篇文章寫完後收到了很多同學的後臺留言,有鼓勵的,也有提出建議的,還有說錯別字的,每一條都一一回復了,當然提出建議的大都是說排版問題,現在已經換到MarkDown編輯器了,大家湊合著看就行了,肯定不影響閱讀了,至於錯別字的,哈哈,你懂就行。

   第二章主要講變數和基本型別,這一章內容很多,我會分很多章節來寫。資料型別是程式的基礎:它告訴我們資料的意義以及我們能在資料上執行的操作。 C++不僅定義了幾種常用的基本內建型別(char, int, double等),還允許我們程式設計師定義自己的資料型別,最常用的就是我們後面經常提到的類,別害怕,類也是一種資料型別,只不過它比int、float等內建型別複雜一點,這個後面要經常提到。

基本內建型別

       內建型別毫無疑問就是編譯器為我們已經定義好了的資料型別,常用內建型別如下,內容較多,我們常用的有 int(整型)、bool(布林型別)、char(字元型別)、short(短整型)、float(浮點型)、double(雙精度浮點型)。

   同一型別的資料在不同機器上所佔的記憶體是不一樣的 

   內建型別的機器實現大多數計算機以2的整數次冪個位元作為塊來處理記憶體,下面區分兩個概念

      · 位元組(byte),可定址的最小記憶體塊

       · 字(word),儲存的基本單元,通常由幾個位元組組成 例如:在一個位元組為8位元

帶符號型別和無符號型別

    帶符號型別可以表示正數,負數或0,可以理解為帶的符號就是正負號,無符號型別只能表示非負數,畢竟不讓帶符號,預設就是正號了。 例如unsigned long。有個小規定是unsigned int可以縮寫為unsigned,誰讓人家比較常用呢,程式設計師又會偷懶。

型別轉換

    這個很好理解,不同的資料型別之間相互轉換,我直接寫程式碼你看註釋就好

 

 

 

bool b = 42; //b為真,除非b=0,其他均為真,bool型只有 0 1兩值
int i = b; //i=1,因為b是true,對應的int就是1,注意原來的42早就木有了,bool型值要注意啊,不要被外表給矇蔽了雙眼啊。bool型值要注意啊,不要被外表給矇蔽了雙眼啊。
int a = 3.66; //a=3,注意不是四捨五入,而是直接捨棄小數部分
double c = a; //c=3.0,a為int型,轉double直接在後面加0

 

 

 

 

    接下來兩個轉換稍微難理解一點,不過只要按照規則來推導,也很容易算出來

        unsigned char m1 = -1; //不帶符號的char,不能表示負數。

       signed char m2 = 256;  //有符號的char

假設char佔8個位元組,你可以先算算m1和m2各等於多少

    m1=255 因為:當我們給一個無符號數賦予一個超出它表示範圍的值時,只要對它總數取模算出餘數就好,在這裡,8位元unsigned char表示0-255區間,總數為256,-1對256模為255。m2無定義無定義就是不同的編譯器對它的處理方式不一樣,我們要避免給帶符號型別賦值超過它表示範圍的數。

 

int a = 1;
double b = 2.5;
cout << a+b << endl;

 

 

       //3.5,當碰到+/-等運算子,都會把小範圍的數轉成大範圍的(這就是傳說中的型別提升,一人得道,雞犬升天),int->double,它的主要目的是保證不損失精度

    我們可能會覺得自己肯定不會因為型別轉換這麼簡單的東西而犯錯,那我們來看看下面的程式碼,如果你看不出問題,就說明你也有可能會犯錯

 

unsigned u = 10;
int i = -42;
cout << u + i << endl;

 

 

    如果int是4位元組32位,它輸出4294967264,對無符號數賦予超出範圍的值了啊,要轉換成對應範圍內的值 int i=(-42)mod(0xffffffff)

    倒序輸出10到0這十一個數 

 

for(unsigned i=10; i>=0; --i)
    cout << i << endl;

 

 

    這個會死迴圈,你懂的,不懂的要打屁股了(i為無符號型別,故其值一定是大於等於0的,把unsigned換成int帶符號的就可以了)為了避免一些不必要的麻煩,建議不要混用帶符號型別和無符號型別 

-----------------------------------------------------------------------------------------------------

關於我自己

     * 一個正派但不正經的程式設計師

    *  18年計算機專業碩士畢業生,騰訊SNG部門實習生,現加盟快手科技 ,後端研發工程師一枚

    *  喜歡技術,喜歡網際網路

    * 民遙控 ,趙雷、陳粒、宋冬野

    * 公眾號:程式設計美學,時不時寫篇文章,偶爾數羊,其實說到底,只是想和你聊聊
在這裡插入圖片描述