Code Style for OI
本文介绍本人在 OI 中常用的代码规范。
概览
所有的 #include
指令必须放置于整个程序开头。
不应该使用 using namespace std;
。
main
函数应该放置于整个程序末尾。
不应该使用 int
代替 bool
表示逻辑值。
预编译指令
#include
中,C 标准库头文件必须使用 c
前缀,而不是 .h
后缀。
#include
中,C 标准库头文件应该放置于 C++ 标准库头文件前,其它头文件(如果有)应放置于最后。
所有的预编译指令(包括 #ifdef
等)不能缩进。
缩进
对于每个代码块,使用 4 空格或等长的 Tab 缩进。
花括号
花括号必须遵循以下两种写法之一,前一种被称为「花括号不换行」,后一种被称为「花括号换行」。
对于「花括号不换行」,左花括号的左边必须有且仅有一个空格。
对于「花括号换行」,左花括号必须与上一级代码块的缩进相同。
所有右花括号必须与上一级代码块的缩进相同。
// 1
if (condition) {
} else {
}
// 2
if (condition)
{
}
else
{
}
行
除 for
中的三个语句外,每行不能有超过一个语句。如果需要一行内求值多个表达式,可以使用等效的逗号表达式替代。
多个意义独立的代码块之间应该用空行隔开。
右花括号前不应该有多余的空行。
不应该有两个连续的空行。
非空行尾不应该有多余的空格。
所有的 #include
指令之后必须有一个空行。
如果有 using namespace std;
,则必须紧跟在 #include
后的空行后,之后必须一个空行。
函数、成员函数、结构体、全局变量块之间必须用空行隔开。
#include <cstdio>
#include <algorithm>
const int MAXN = 100;
const int MAXM = 200;
int n, m, a[MAXN + 1];
double p, q, x, y;
int main()
{
p = 1, q = 2;
return 0;
}
函数
main
函数的返回值类型必须是 int
,可以省略 return 0;
。
空函数体可以使用 {}
。
传参时,应该根据实际需要使用「引用」、「const
引用」和「值传递」。
变量
应该尽量少使用全局变量。
局部变量必须在用时定义,变量名不应该与上一个块中的变量重名,可以与全局变量重名。
只在一个函数内使用到的需要全局空间(如大数组)或生命周期的变量,必须定义为 static
的局部变量。
空格
逗号 , 与 for
中的分号 ; 后面必须有一个空格,前面不能有空格。
左圆(方)括号后、右圆(方)括号前,在书写长表达式时,为了便于阅读,可以加一个空格,如
f[i][j] = f[ f[i][j - 1] ][j - 1]
双目运算符、三目运算符的两侧必须有一个空格。
单目运算符的两侧不能有空格(++
、--
除外)。
冒号的两侧必须有一个空格。
struct Edge {
int x;
Edge() : x(0) {}
}
流程控制关键字之后,左圆括号前必须有一个空格,函数名之后,左圆括号前不能有空格。
对于「花括号不换行」,do-while
结构的 do
之后,左花括号前必须有一个空格,while
前必须有一个空格。
模板参数表中,如果右方括号前不得不加一个空格,则可以在对应的左方括号后加一个空格,为了对称。
.
、->
、::
的两边不能有空格。
指针与引用
在描述类型名时,指针符号 *
和引用符号 &
与左侧的类型名之间必须有一个空格,与右侧的其它关键字之间不能有空格,如 char *const
或 int *&
。
在定义变量、函数返回值、参数时,指针符号 *
和引用符号 &
与左侧的类型名之间必须有一个空格,与右侧的变量、函数、参数名之间不能有空格。
命名
所有结构体、函数、变量、参数名必须使用驼峰命名法,其中结构体名首字母必须大写,其它首字母必须小写。
为方便,命名中的单词可以使用缩写,函数、变量、参数名可以用一个小写字母代替。全局数组可以命名为一个大写字母。
int aVarWithVeryLongName;
struct Node {
int dep, s;
}
struct SegT {
SegT *lc, *rc;
}
bool getAns(std::vector<std::string> &res);