標籤:雙層 字串 聲明 同名 strong inline 出現 編譯 小尺寸
變數和基本類型不同平台下基本類型的位元組數
類型 |
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,而且不要顯式地初始設定變數
- 對於複雜的聲明語句,可以從變數名從右往左理解
指標
- 常見錯誤:解引用無效指標(null 指標或已釋放的指標)
- 建議:初始化所有指標,並且盡量等定義了對象之後再定義指向它的指標。
- 推薦nullptr而非0,0指標具有二義性。
const和constexpr
const對象預設在檔案內有效,當多個檔案出現了同名const變數,等同於不同檔案中定義了獨立的變數。
如果想不同檔案之間共用const,則不管在聲明還是定義中都添加extern關鍵字。
頂層const表示本身是個常量,底層const表示指標指向的對象是一個常量。
- 執行對象拷貝操作時,頂層const不受影響,底層const卻不容忽視
常量運算式:值不會改變且在編譯階段就能計算結果的運算式。
auto與decltype
預先處理變數無視C++中關於範圍的規則
C/C++基礎----變數和基本類型