C/C++基礎----變量和基本類型
變量和基本類型
不同平臺下基本類型的字節數
類型 |
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
- 有符號類型賦值超出其範圍,結果未定義
- 切勿混用帶符號類型和無符號類型。
- 算數表達式中既有無符號數又有帶符號數,帶符號的數會轉換成無符號的數
指定字面值的類型
字符和字符串字面值 |
|||
前綴 |
含義 |
類型 |
|
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++基礎----變量和基本類型