變數 是具名儲存區,具備型別(決定大小、配置、解讀)、名稱(標識符)、作用域與生命週期。
| 類別 | 關鍵字 | 典型大小 | 說明 |
|---|---|---|---|
| 布林 | bool | 1 byte | true/false |
| 字元 | char | 1 byte | ASCII/UTF-8 碼點 |
| 寬字元 | wchar_t | 2/4 bytes | 平台相關 |
| 整數 | short, int, long, long long | 2/4/4/8 bytes | 至少 16/32/32/64 位 |
| 浮點數 | float, double, long double | 4/8/8-16 bytes | IEEE 754 單/雙/擴展精度 |
| 無型別 | void | N/A | 不完整型別,用於指標/回傳 |
確切大小用 sizeof(T) 查詢,包含 <cstdint> 使用固定寬度型別 int32_t, uint64_t 等。
extern int x;int x = 10;
// C++98
int x = 10;
int y(20);
// C++11 統一初始化 (列表初始化)
int a{10};
int b{};
double c{3.14};
vector v{1,2,3}; // 避免窄化轉換
// C++11 auto 型別推導
auto d = 10; // int
auto e = 3.14; // double
auto f = {1,2}; // initializer_list
統一初始化 { } 可防窄化轉換 (int x{3.14} 編譯錯誤)、統一語法、適用所有型別。
| 屬性 | 左值 | 右值 |
|---|---|---|
| 定義 | 表達式指向可識別記憶體位置 | 非左值的表達式 (暫時值、字面常數、運算結果) |
| 可出現位置 | 賦值號左/右兩側 | 僅賦值號右側 |
| 可取址 | 是 | 否 |
| 範例 | 變數、解參考、前置++、函數回傳參考 | 字面常數、算術表達式、後置++、函數回傳值 |
C++11 引入右值參考 T&&,實現移動語意與完美轉發,區分 std::move(x) (轉右值) 與 std::forward。
auto / decltype:型別推導,減少冗長聲明。std::nullptr_t:空指標字面常數型別,取代 NULL/0。std::byte (C++17):原始位元組型別,非字元、非整數,用於低層記憶體操作。enum class (C++11):強型別枚舉,作用域限定、不可隱性轉換整數。using 別名宣告:using Vec = vector; 取代 typedef,支援模板別名。| 陷阱 | 建議 |
|---|---|
| 未初始化區域變數 | 統一初始化 T x{};,啟用警告 |
| 有號/無號混用比較 | 避免混用,或顯式轉換 |
| 隱性窄化轉換 | 用 {} 初始化觸發編譯錯誤 |
| 巨集定義常數 | 改用 constexpr/const |
| typedef 難讀 | 改用 using 別名 |
<cstdint> 固定寬度型別。extern。std::move/std::forward。auto、{}、using、enum class 現代語法,寫出型別安全、可維護程式碼。