1. 程式人生 > >C/C++基礎----變量和基本類型

C/C++基礎----變量和基本類型

tex adding span imp 保留 基本類 lsp auto decltype

變量和基本類型

不同平臺下基本類型的字節數

類型

16位平臺

32位平臺

64位平臺

char

1

1

1

short

2

2

2

int

2

4

4

long

4

4

8

long long

/

8

8

指針

2

4

8

float

4

4

4

double

8

8

8

類型的最小尺寸

類型

含義

最小尺寸

bool

布爾類型

未定義

char

字符

8位

wchar_t

寬字符

16位

char16_t

Unicode字符

16位

char32_t

Unicode字符

32位

short

短整型

16位

int

整型

16位

long

長整型

32

long long

長整型

64

float

單精度浮點數

6位有效數字

double

雙精度浮點數

10位有效數字

long double

擴展雙精度浮點數

10位有效數字

數據類型選擇的經驗準則

  • 當知曉數值不可能為負時,選用無符號類型
  • 使用int執行整數運算,short常常太小,long和int一般尺寸一樣。如果int不夠,用long long。

  • 在算數表達式中不要使用char或bool,使用char特別容易出問題。如果要使用一個不大的整數,那麽明確執行為signed char或unsigned char。

  • 執行浮點數運算用double,float通常進度不夠而且兩者計算代價相差無幾。Long double一般沒有必要,且消耗不容忽視。

有符號類型和無符號類型

  • 無符號類型賦值超出其範圍,結果是取模後的值。如unsigned char c = -1; //假設char占8bit,c的值為255
  • 有符號類型賦值超出其範圍,結果未定義
    。如signed char c2 = 256; //假設char占8bit,c2的值未定義
  • 切勿混用帶符號類型和無符號類型。
  • 算數表達式中既有無符號數又有帶符號數,帶符號的數會轉換成無符號的數

指定字面值的類型

字符和字符串字面值

前綴

含義

類型

u

Unicode16字符

char16_t

U

Unicode32字符

char32_t

L

寬字符

wchar_t

u8

UTF-8(僅用於字符串字面常量)

char

整型字面值

浮點字面值

u or U

unsigned

f or F

float

l or L

long

l or L

long double

ll or LL

long long

初始化與賦值

初始化和賦值是兩個完全不同的操作

  • 定義於函數體(塊作用域)內的內置類型的對象如果沒有初始化,則其值未定義。養成初始化內置變量的習慣。
  • 類的對象如果沒有顯式地初始化,則其值由類確定。

聲明與定義

  • 聲明使得一個名字為程序所知,定義會申請存儲空間,還可能為其賦初始值
  • (分離式編譯)

    如果想聲明一個變量而非定義它,就在變量名前添加關鍵字extern,而且不要顯式地初始化變量
  • 對於復雜的聲明語句,可以從變量名從右往左理解

指針

  • 常見錯誤:解引用無效指針(空指針或已釋放的指針)
  • 建議:初始化所有指針,並且盡量等定義了對象之後再定義指向它的指針。
  • 推薦nullptr而非0,0指針具有二義性。

const和constexpr

  • const對象默認在文件內有效,當多個文件出現了同名const變量,等同於不同文件中定義了獨立的變量。

    如果想不同文件之間共享const,則不管在聲明還是定義中都添加extern關鍵字。

  • 頂層const表示本身是個常量,底層const表示指針指向的對象是一個常量。

  • 執行對象拷貝操作時,頂層const不受影響,底層const卻不容忽視

常量表達式:值不會改變且在編譯階段就能計算結果的表達式。

  • 復雜系統中很難分辨初始化是不是常量表達式,C11允許聲明為constexpr由編譯器來驗證
  • 盡管指針和引用可以定義成constexpr,其初始值受到嚴格的限制。constexpr指針的初始值必須是nullptr或者0,或者是儲存於某個固定地址中的對象。儲存於函數體之外的對象其地址固定不變,能用來初始化constexpr指針。

auto與decltype

  • auto一般會忽略掉頂層const,同時保留底層const。
  • decltype的表達式是一個變量,則decltype返回該變量的類型,包括頂層const和引用在內。

  • decltype如使用的表達式不是一個變量,則返回表達式結果對應的類型。
  • 如表達式是解引用操作,則得到引用類型。

  • 如果是加了雙層括號的變量,則結果永遠是引用。

預處理變量無視C++中關於作用域的規則

C/C++基礎----變量和基本類型