- admin 的博客
个人各种代码习惯 C++ (最新)
- @ 2026-1-15 23:58:12
作者: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 数组大小常量
- 可用
#define或const; - 若涉及多个
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 结构
if和else不能位于同一行;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, \nega & b,b | a,a ⊕ b,¬a - 逻辑与、或、异或、非分别使用:
效果:\wedge, \vee, \oplus (\veebar), \neg (!)a ∧ b,a ∨ b,a ⊕ b,¬a
2. 正斜体
- 标准数学函数必须使用正体:
\log,\sin,\gcd等。 - 库中没有的函数,需使用
\mathrm或\operatorname使之变为正体。 - 微分算子
dx的d和虚数单位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 日(当前实际时间)