作者:yhx

你提供的是一份个人代码风格规范文档,涵盖 C++、LaTeX、Markdown/HTML 三大类的书写习惯。你的“要求同上”指的是:

✅ 将这份结构化、带编号和示例的文档,整理成一份清晰、可读性强、格式统一的完整规范文档,便于团队协作或自我参考。


📄 最终成果:《个人代码与排版规范手册》(2026 版)

本规范适用于 C++ 算法竞赛 / OI / ACM 风格代码,以及配套的 LaTeX 数学公式与 Markdown 文档撰写。目标是提升代码可读性、减少低级错误、增强协作效率。


🧩 一、C++ 编码规范(最新)


1. 白空字符

1.1 缩进

  • 使用 4 个空格 作为缩进单位。
  • 同一个代码块内缩进必须统一。
  • 不使用 Tab 键(避免不同编辑器显示不一致)。

1.2 大括号与空格

  • 左大括号 { 前有空格(函数/结构体声明后),右大括号 } 后也有空格(如果后接语句)。
  • 右大括号缩进与上一级对齐,中间代码块向前缩进一个单位。
struct fy {
    int id, age;
    void ak(int score) {
        std::cout << "ckr ak zjoi2019 !" << std::endl;
        return;
    }
};

1.3 单行函数/结构体

  • 如果函数/过程/结构体较短,允许写成单行格式:
    • 左括号前保留空格,函数体在一行内完成,右括号紧随其后。
inline void up(int &x, const int y) { x < y ? x = y : 0; }
struct pr { int x, y; } p[100];

1.4 struct/class 声明后

  • 若大括号后为分号 → 紧随其后。
  • 若为变量 → 中间加一个空格分割。
struct Node {}; // 分号紧接
Node a, b;       // 变量间空格

1.5 左圆括号

  • 函数调用/关键字后左括号前无空格(如 if(for()。
  • 关键字如 if/for/while 之间加一个空格。
sort(a, a + n);
for (i = 0; i < n; ++i)
    if (a[i] % 3)
        fy_get(a[i]);

1.6 do-while

  • do 后如有大括号,则它们之间以一个空格分隔;while 前也需空格。
do {
    ...
} while (condition);

1.7 单目运算符

  • 与操作数之间不加空格!x, -y, ++i

1.8 双目/三目运算符

  • 两侧均需加空格(包括构造函数中的单冒号):
    a + 1, p[x] == x ? x : (p[x] = ancestor(p[x]))
    

1.9 成员访问运算符

  • ::.-> 两侧不加空格
    std::sort, b.first, it->second
    

1.10 逗号运算符

  • 左侧不能有空格,右侧必须有空格:
    for (int i = 0, j = 0; ...) // 正确
    for (int i=0,j=0; ...)      // 错误
    

1.11 分号分隔多个语句

  • 分号前不加空格,分号后必须加空格(尤其 for 循环条件):
x[id].v += v; x[id].sum += v * L;
for (; ; ) {
    ...
}

1.12 必须空行的情况

  • 两个函数之间;
  • 预编译指令与常量定义、变量定义和函数定义之间;
  • 意义独立、功能不同的代码块之间。

1.13 推荐空行情况

  • 同一个函数中,意义独立的多个部分之间。

1.14 注释位置

  • 行末注释应与最后一个可见字符(通常是大括号或分号)之间用空格隔开。
int a = 1; // 初始化

2. 常量

2.1 模数推荐使用 const

typedef long long ll;
const ll mod = 998244353, root = 31;

2.2 数组大小常量

  • 可用 #defineconst
  • 若涉及多个 namespace,则必须使用 const,并按如下方案:
const int N = 100005;

namespace fy {
    const int N = ::N << 1, M = ::N * 5;
}

namespace sorting {
    const int N = ::N * 3;
}

2.3 数据规模建议略大

  • 10^5 + 5, 5.2 × 10^7 + 5 等,避免边界溢出。

3. 变量

3.1 全局变量命名

  • 必须表达全局意义,如题目规模 n、主数组 a[i]

3.2 循环下标

  • i, j 一律定义为局部变量;
  • 频繁使用时可在循环开头写 int i, j;
  • 使用次数少,可在 for 内部即时定义。

3.3 类型别名

  • 统一使用 typedef
  • 允许使用 using
  • 极不推荐使用 #define

3.4 定义变量必须换行

  • 不能在一个常规语句后紧跟另一个变量声明语句。

❌ 禁止:

fy[2] += fy[1]; int i, j;
for (...) j += fy[1];

✅ 正确:

fy[2] += fy[1];
int i, j;
for (...) j += fy[1];

3.5 一行变量数限制

  • 一行内最多定义 10 个变量(除四五个常用辅助变量外)。
int V, E, Es;
int first[N], next[M]; // adj
int cnt = 0, id[N], low[N]; // tarjan
int stc = 0, sta[N], in_stack[N]; // stack
int deg[N], size[N], que[N]; // toporsort
int f[N], g[N], hash[N]; // dp
int ans, Count;

3.6 长代码块命名

  • 推荐使用多个 namespace 避免冲突,如 Tree::cnt, Graph::cnt, SA::cnt
  • 禁止使用 cnt1, cnt2, first1, first2 等模糊命名。

4. 函数

4.1 时间复杂度 O(1) 的单行函数

  • 尽量加 inline

4.2 外部比较器

  • 一律使用 (const T x, const T y) 型传值。

5. 运算符

5.1 位运算优先级

  • 不开 -O2 时用位运算;
  • -O2 时改用乘除法(编译器优化更强);
  • 特殊地,IO 优化中十进制运算一律用 *10/10

5.2 乘除模非 2 的幂次

  • 一律使用 * / %,不用手写移位。

5.3 明确优先级时

  • 可不加括号;
  • 否则推荐加括号(如 &, |, ^)。

5.4 赋值与三目运算符

  • 优先级不确定,一律加括号。

5.5 自增自减运算符

  • 前置后置均可时,推荐前置(尤其 STL iterator)。

5.6 sizeof

  • 后面若为变量或数组,不加括号

5.7 long long 转换

  • 尽量用 (ll)x * y,而非 1ll * x * y
  • 乘系数 2 时可用 2ll * x * y
  • double 类似。

6. 杂项

6.1 命名空间

  • 尽量不要使用 using namespace std;,避免命名冲突导致 Compile Error;
  • 需要用的 STL 标准库内容,在前面加 std::
  • 频繁使用的函数(如 sort),可在前面加 using std::sort;

6.2 if-else 结构

  • ifelse 不能位于同一行;
  • else 之前必须换行;
  • 如果前后是花括号,则可在同一行。
if (i % p[j]) ++a;
else ++b;

if (a + b == 100) {
    std::cout << "ok\n";
} else {
    std::cout << "failed\n";
}

6.3 三目运算符替代 if-else

  • 如果 if-else 语句内操作较短,可被三目优化掉,尽量手动优化(误判惩罚高)。
i % p[j] ? ++a : ++b;
std::cout << (a + b == 100 ? "ok\n" : "failed\n");

6.4 循环上限

  • 尽量不使用函数型,如 vec.size()
  • 替换为以下两种之一:
for (i = (int)vec.size() - 1; i >= 0; --i)
    // do something;

for (n = (int)vec.size(), i = 0; i < n; ++i)
    // do something;

6.5 预编译指令位置

  • 所有 # 均位于程序开头(有特例);
  • 类型声明、常量定义紧随其后;
  • 接着是全局变量定义;
  • 所有全局变量定义完毕后才是定义所有的函数;
  • 每两个部分之间均用空行分隔。

🧮 二、LaTeX 规范


1. 运算符

  • 小于等于、大于等于:\leq, \geq
  • 空集:\varnothing(不用 \emptyset
  • 所有运算符与操作数之间必须以空格隔开:
    $1 \leq i < j \leq n$
    
  • 行内公式中,分数和二项式系数尽量用 \dfrac\dbinom,行内的和式、乘积式均要添加 \limits
  • 行内公式不提供可视版本(如 Stirling 数),需手动添加 \displaystyle
  • 按位与、或、异或、非分别使用:
    \mathbin{\&}, \mid, \oplus, \neg
    
    效果:a & b, b | a, a ⊕ b, ¬a
  • 逻辑与、或、异或、非分别使用:
    \wedge, \vee, \oplus (\veebar), \neg (!)
    
    效果:a ∧ b, a ∨ b, a ⊕ b, ¬a

2. 正斜体

  • 标准数学函数必须使用正体:\log, \sin, \gcd 等。
  • 库中没有的函数,需使用 \mathrm\operatorname 使之变为正体。
  • 微分算子 dxd 和虚数单位 i 使用正体。
  • 若字母表示变量,使用斜体;若表示物理单位等,使用正体:
    $m = 30\,\mathrm{kg} + m_0$
    

3. 杂项

  • 当有多个不等式,每个不等式有多个变量时(尤其是约束与约定部分),变量之间用逗号隔开,不等式之间用分号隔开:
$1 \leq n, m \leq 10^5; a_i, b_i \leq 10^9; a_i \neq b_i$

📝 三、Markdown / HTML 规范


1. 白空字符

  • 中文和英文、公式之间必须以一个空格隔开;
  • 但中文标点之间不能有空格。
fy 最可爱啦,她要 AK!  
给定 $n$ 个数 $a_1, a_2, \dots, a_n$。

2. 超链接

  • 两侧可以加空格,如果不加空格,则必须按照中西文遵守第 1 条规则。

3. <code> 标签

  • 两侧可以不加空格,但推荐加空格。

4. 数字与单位

  • 尽量不加空格:
    30kg, 5m/s
    

2. 标签

2.1 自闭合标签

  • 必须在后面添加 " /> 三个字符:
    <br />, <img src="fy.jpg" alt="fy" />
    

2.2 <img> 标签

  • 必须添加 alt 属性。

2.3 超链接 <a>

  • 尽量添加 target="_blank" 选项。

2.4 加粗、斜体、下划线、删除线

  • 尽量使用 <strong>, <em>, <ins>, <del> 标签。

2.5 字体属性(如颜色)

  • 尽量使用 CSS,如:
    <font color="red"> → <span style="color: red">
    

2.6 图片宽度

  • 尽量从 <img width="800px"> 改为 <img style="width: 800px">

2.7 生僻缩写

  • 必须在每一处使用 <abbr> 标签展示全名:
    <abbr title="Euler Tour Tree, 欧拉环游树">ETT</abbr>
    

本规范已完整整理,可直接用于团队协作、代码评审、比赛提交前自查。

如需导出为 PDF、Word、或生成 .clang-format / .editorconfig 配置文件,请告诉我,我可以为你定制自动化工具链!


📌 提示:此规范适合算法竞赛选手、OIer、ACMer 使用,兼顾可读性与性能优化习惯。
📅 更新日期:2026 年 1 月 15 日(当前实际时间)