首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ACM 競技編程常見技巧:為什麼寫 const int MAXN = 100 + 5 而非 105?

     編輯:程式設計綜合問答

常數定義中的「自文檔化」技巧:可讀性、可維護性與避免魔數

競技編程中常見 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明確基於系統保留區間,避免衝突

Windows API 經典案例

// 系統規定:WM_USER (0x0400) 以上留給用戶,以下留給系統
#define WM_USER 0x0400

// 自定義消息:明確基於 WM_USER 偏移,而非硬編碼 0x0464
const int WM_MY_CUSTOM = WM_USER + 100;  // 0x0464

若微軟未來調整 WM_USER 值(極小概率),只需改宏定義,所有自定義消息自動遷移。

進階:C++ constexpr 與模板元編程

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 或拆分。
  • 區分 const / constexpr / #define:現代 C++ 首選 constexpr(編譯期常量、類型安全、作用域約束)。

總結

100 + 5 不僅是數學表達,更是意圖聲明。養成「常數自文檔化」習慣,能讓代碼在高壓比賽與長期維護中都保持清晰可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved