常數 是程式執行期間固定不變的值,又稱字面常數。分為整數、浮點數、字元、字串、布林等基本型別。
| 類別 | 範例 | 說明 |
|---|---|---|
| 整數 | 212, 215u, 0xFeeL, 0213 | 前綴:0x/0X=十六進位,0=八進位;後綴:u=unsigned, l=long (大小寫皆可) |
| 浮點數 | 3.14159, 314159E-5L, .123 | 十進位或科學記號;後綴 f/F=float, l/L=long double |
| 布林 | true, false | 關鍵字,非 1/0 |
| 字元 | 'a', '\n', L'中', '\u4E2D' | 單引號;L 前綴=寬字元 (wchar_t);轉義序列、通用字元名 |
| 字串 | "Hello", "Line1\nLine2", L"寬字串" | 雙引號;隱含結尾 '\0';相鄰字串字面常數自動連接 |
| 序列 | 意義 |
|---|---|
\n | 換行 |
\t | 水平定位 |
\\ | 反斜線 |
\" | 雙引號 |
\' | 單引號 |
\xhh | 十六進位字元 |
\ooo | 八進位字元 (1-3 位) |
#define PI 3.1415926535
#define MAX_SIZE 1024
#define GREETING "Hello"
特點:文字替換、無型別檢查、無作用域(全域可見)、除錯困難(符號表無記錄)。
const double PI = 3.1415926535;
const int MAX_SIZE = 1024;
const char* GREETING = "Hello";
優點:型別安全、有作用域、進入符號表可除錯、可用於編譯期常數表達式(配合 constexpr)。
// #define 版
#define LENGTH 10
#define WIDTH 5
int area = LENGTH * WIDTH;
// const 版
const int LENGTH = 10;
const int WIDTH = 5;
int area = LENGTH * WIDTH;
兩者輸出皆為 50,但 const 版本型別為 int,可參與型別檢查與多載解析。
constexpr 宣告編譯期可求值的常數或函數,比 const 語意更強:
constexpr double PI = 3.1415926535; // 編譯期常數
constexpr int factorial(int n) { // 編譯期函數
return n <= 1 ? 1 : n * factorial(n-1);
}
constexpr int FAC5 = factorial(5); // 編譯期計算 = 120
int arr[FAC5]; // 合法:陣列大小需編譯期常數
規則:constexpr 變數隱含 const,初始化式必須為常數表達式;constexpr 函數隱含 inline,本體受限(C++14 大幅放寬)。
MAX_BUFFER_SIZE、DEFAULT_TIMEOUT_MS。NET_MAX_CONN、DB_POOL_SIZE。constexpr 全域常數視為 API 契約一部分,命名更謹慎。
const char* msg = "Hello" "World"; // 自動連接 → "HelloWorld"
const char* path = "/usr/" "local/" "bin"; // 可跨行
const (執行期) / constexpr (編譯期)。constexpr 擴展編譯期計算能力,支援陣列大小、模板參數、std::array 大小等語境。