本文介绍在程序设计竞赛(OI、XCPC等)应当/建议遵循的代码规范。来源为I-Ripple本人的代码习惯,Google代码规范以及诸多算法竞赛前辈遗留下的代码规范
绪论
本文与一些知名代码规范存在冲突,窃以为在程序设计竞赛中应当抛弃部分工业界/职业程序员所使用的习惯。在此为算法竞赛后辈与读者阐明。
鉴于本文与其它代码规范存在冲突,仅向读者在此提供部分参考的代码规范。望读者择优而取之。
名词解释:
必须:表示与大多数规范相一致,读者应当遵循。
优先:表示作者认为优先使用的写法,读者在没有严格要求下应使用。
可以:表示作者认为可以使用的写法,推荐使用。
不应:表示作者认为不应当使用的写法
概论
- 所有的
#include
指令必须写于程序的起始部分 - 优先选择使用
using namespace std;
并应写于#include
指令的下一行
预编译指令
- 优先使用
#include<bits/stdc++.h>
适当情况下可以使用#include<bits/extc++.h>
- 在不使用万能头文件时,C标准库头文件必须使用
c
前缀,而不是.h
后缀。 - 优先使用
#include <foo>
,不应使用#include "foo"
。 - 不优先使用
#define
缩进
- 对于每个代码块,优先使用 4 空格或等长的 Tab 缩进。
大括号
- 优先大括号不换行(即Java风格)而非换行(K&R风格),例如:
int main() {
int a,b;
while(~scanf("%d%d",&a,&b)) {
//code
}
return 0;
}
//Java风格,所有的左大括号不换行,右大括号换行
- 右括号必须与上一级代码块的缩进相同。
空格
- 可以添加一个字符的空格于:
-
- 二目运算符两侧(除
,
),例如=
+
-
==
等。
- 二目运算符两侧(除
-
*
&
的左侧,例如const int &a
空行
- 函数、成员函数、结构体、全局变量块之间优先使用空行隔开。
- 如果有
using namespace std;
,则必须紧跟在#include
后的空行后 - 任何位置不能出现连续的两个(或以上)空行。
函数
main()
函数返回值一般情况下为int,并且return 0
不可忽略- 使用
#define int long long
时,同时使用signed main()
- 传参时,应该根据实际需要使用「引用」、「const 引用」和「值传递」。
命名规则
- 一般变量名优先使用单个/少量小写字母命名,参考
- 函数名/部分变量名优先使用对应算法缩写,如
KMP
CRT
NTT
CDQ
- 不应使用英文单词作为命名,若需使用请在其后加入下划线进行避让,如
updata_
aoto_
data_
- 如需较长的命名,优先使用下划线命名,如
my_data
number_edge
常见命名方式 - 常量名可以使用单个大写字母命名,如
N
M
常量定义
- 必须使用
const
,避免使用#define
变量定义
- 可以使用全局变量(关于爆栈问题尚待商榷)
- 局部变量必须在用时定义,且定义在这个变量被调用的最近的地方
- 局部变量必须在定义时进行初始化
- 一般情况下,不应在循环中定义变量
其他
- 优先使用各类STL容器
- 出于可读性考虑,尽量不压行
- 不应使用
goto
0 条评论