1. 程式人生 > >C++ 學習筆記 變數和基本型別(一)

C++ 學習筆記 變數和基本型別(一)

C++ 學習筆記

一、變數和基本型別概述

型別是所有程式的基礎。型別告訴我們資料代表什麼意思以及可以對資料執行哪些操作。

c++基本型別:

  1. 字元型
  2. 整型
  3. 浮點型

c++ 還提供了可用於自定義資料型別的機制,標準庫正式利用了這些機制定義了許多更復雜的型別,比如可變長字串string 和vector等。此外,我們還能修改已有的型別以形成複合型別。

二、基本內建型別
  1. 算數型別:表示整數、浮點數、單個字元和布林值的型別。
  2. void型別:void型別沒有對應的值,僅用在有限的一些情況下,通常用作無返回值函式的返回型別。

下面詳細介紹。

C++算數型別
型別 含義 最小儲存空間
bool 布林型 -
char 字元型 8位
wchar 寬字元型 16位
short 短整型 16位
int 整型 16位
long 長整型 32位
float 單精度浮點型 6位有效數字
double 雙精度浮點型 10位有效數字
long double 擴充套件精度浮點型 10位有效數字

算數型別的儲存空間依機器而定。這裡的儲存空間是指用來表示該型別的二進位制位(bit)數。C++ 標準規定了每個算數型別的最小儲存空間,但它並不阻止編譯器使用更大的儲存空間。

注: 因為位數的不同,這些型別的所能表示的最大(最小)值也因機器的不同而有所不同。

2.1 整型:
表示整數、字元和布林值的算數型別合成為整型 (integral type)
2.1.1 分類

整型按細分型別分為以下幾個:

  1. 整數

    a. short: 一般為半個機器字(word)長

    b. int: 為一個機器字長

    c. long: 為一個或兩個機器字長

  2. 字元

    a. char: 保證了有足夠的空間,能夠儲存機器基本字符集中任何字元相應的值,因此char型別通常是單個機器位元組(byte)

    b. wchar_t: 用於擴充套件字符集,比如漢字和日語,這些字符集中的一些字元不能用單個char表示

  3. 布林值

    a. true: 任何非零的值都代表true

    b. false: 0代表false

整型按是否帶符號分為帶符號和無符號型別:

  1. 帶符號的(signed):可表示整數也可以表示負數(包括0)
  2. 無符號的(unsigned):只能表示大於或等於0的數

注:整型 int、short、long都預設為帶符號型。要獲得無符號型則必須指定該型別為unsigned,比如unsigned long。unsigned int 型別可以簡寫為unsigned,也就是說,unsigned後不加其他型別說明符意味著是 unsigned int。

char有三種不同的型別:普通char、unsigned char 和 signed char,雖然char有三種不同的型別,但是隻有兩種表示方式。可以使用unsigned char 或 signed char 表示 char 型別。

2.1.2 整型值的表示

​ 無符號型中,所有的位都表示數值。如果在某種機器中,定義一種型別使用8位表示,那麼這種型別的unsigned 型可以取值 0 到 255。

​ 表示signed 整型型別最常見的策略是用其中一個位作為符號位。符號位為1,值就為負數;符號位為0,值就為0或正數。 一個使用一位符號位的表示方式的8位signed整型取值是從 -128 到 127。

2.1.3 整型的賦值

​ 物件的型別決定物件的賦值。那當我們試著把一個超出其取值範圍的值賦給一個指定型別的物件時,結果哦取決於這種型別是 signed 還是unsigned 的。

​ --- 對於 unsigned 型別來說,編譯器必須調整越界值使其滿足要求。編譯器會將該值對unsigned 型別的可能取值數目求模,然後取所得值。另外對於unsigned 型別來說,負數總是超出其取值範圍。unsigned 型別的物件可能永遠不會儲存負數。有些語言中將負數賦給unsigned 型別是非法的,但在C++ 中這是合法的,其結果是該負數對該型別的取值個數求模後的值。

​ --- 對於signed 型別來說,當將超過取值範圍的值賦給signed 型別時,由編譯器決定實際賦的值。

2.2 浮點型

​ 型別 float 、double、long double 分別表示單精度浮點數,雙精度浮點數和擴充套件精度浮點數。一般 float 型別用一個字(32位)來表示,double用兩個字(64位)來表示,long double型別用三個或四個字(96或 128 位)來表示。型別的取值範圍決定了浮點數所含的有效數字位數。

3. 字面值常量

​ 像42 這樣的值,在程式中被當做 字面值常量( literal constant),稱之為字面值是因為只能用它的值來稱呼它,稱之為常量是因為它的值不能被修改。每個字面值都有相應的型別,例如: 0 是 int 型, 3.14159 是double 型。只有內建型別存在字面值,沒有類型別的字面值。因此,也沒有任何標準庫型別的字面值。

3.1 整型字面值規則

​ 定義字面值整數常量可以使用以下三種進制中的任一種:十進位制、八進位制和十六進位制。當然這些進位制不會改變其二進位制位的表示形式。例如我們將值20定義成下列三種形式中的任意一種:

​ 20 // decimal

​ 024 // octal

​ 0x14 // hexadecimal

​ 字面值整數常量的型別預設為 int 或 long 型別。其精度型別決定於字面值 —— 其值適合 int 就是 int 型別,比 int 大的值就是 long 型別。

​ 通過增加字尾,能夠強制將字面值整數常量轉換為 long 、unsigned 、或unsigned long 型別。通過在數值後邊加 L 或者 l ,指定常量為 long 型別。(注:定義長整型時,應該使用大寫字母L,避免混淆)

​ 類似的,可以通過在數值後邊加 U 或者u 定義 unsigned 型別。同時加 L 和 U 就能得到unsigned long 型別的字面值常量,但其後綴之間不能有空格。

​ 例如:

​ 128u // unsigned 1L // long

​ 1024UL // unsigned long 8Lu // unsigned long

3.2 浮點字面值規則

​ 通常可以用十進位制或者科學計數法來表示浮點字面值常量。使用科學計數法時,指數用 E或 e 表示。預設的浮點字面值常量為 double 型別。在數值的後面加上 f 或 F 表示單精度。同樣加上 L 或者 l 表示擴充套件精度。

3.3 非列印字元的轉義序列

​ 比如退格或控制符,還有一些在語言中有特殊意義的字元,比如單雙引號、反斜線符號。不可列印字元和特殊字元都用轉義字元書寫。轉義字元都以反斜線符號開始。

3.4 字串字面值

​ 字串字面值常量用雙引號括起來的菱格或者多個字元表示。不可列印字元表示成相應的轉義字元。

​ 為了相容C語言,C++ 中所有的字串字面值都由編譯器自動在末尾新增一個空字元。

字串字面值的連線:兩個相鄰的僅由空格、製表符或換行符分開的字串字面值(或寬字串字面值),可連線成一個新字串字面值。

3.5 多行字面值

​ 在一行的末尾加一反斜線符號可將此行和下一行當做同一行處理。