競技編程中常見 const int N = 100 + 5; 而非 105,本文解析其背後的工程化思維。
// 差:魔數,不知 105 從何而來
const int MAXN = 105;
// 好:顯式表達「最大 n=100,留 5 量安全裕度」
const int MAX_N = 100;
const int BUFFER = 5;
const int MAXN = MAX_N + BUFFER;
閱讀代碼者瞬間理解:題目上限 100,數組開 105 防越界。
| 場景 | 推薦寫法 | 優勢 |
|---|---|---|
| 數組大小 | MAX_N + 5 | 修改上限只需改一處,自動擴展 |
| 模數 | 1000000007 或 1e9+7 | 標準常數,直接寫字面量可接受 |
| 幾何計算 | const double EPS = 1e-9; | 語義清晰,避免硬編碼 0.000000001 |
| 圖邊數 | MAX_M = MAX_N * 2 | 無向圖雙向邊,關聯性顯式 |
| Windows 消息 | WM_MY_MSG = WM_USER + 100 | 明確基於系統保留區間,避免衝突 |
// 系統規定:WM_USER (0x0400) 以上留給用戶,以下留給系統
#define WM_USER 0x0400
// 自定義消息:明確基於 WM_USER 偏移,而非硬編碼 0x0464
const int WM_MY_CUSTOM = WM_USER + 100; // 0x0464
若微軟未來調整 WM_USER 值(極小概率),只需改宏定義,所有自定義消息自動遷移。
constexpr int max_n = 100;
constexpr int buffer = 5;
constexpr int max_size = max_n + buffer; // 編譯期計算,零開銷
// 模板參數化
template<int N = 100, int Buf = 5>
struct Config {
static constexpr int MAXN = N + Buf;
};
const int A = 1 + 1 + 1; 降低可讀性,直接寫 3。const int X = 100 + 5 * 2; → 110,建議加括號 (100 + 5) * 2 或拆分。constexpr(編譯期常量、類型安全、作用域約束)。100 + 5 不僅是數學表達,更是意圖聲明。養成「常數自文檔化」習慣,能讓代碼在高壓比賽與長期維護中都保持清晰可控。