Menci's 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 *constint *&

在定义变量、函数返回值、参数时,指针符号 * 和引用符号 & 与左侧的类型名之间必须有一个空格,与右侧的变量、函数、参数名之间不能有空格。

命名

所有结构体、函数、变量、参数名必须使用驼峰命名法,其中结构体名首字母必须大写,其它首字母必须小写。

为方便,命名中的单词可以使用缩写,函数、变量、参数名可以用一个小写字母代替。全局数组可以命名为一个大写字母。

int aVarWithVeryLongName;

struct Node {
    int dep, s;
}

struct SegT {
    SegT *lc, *rc;
}

bool getAns(std::vector<std::string> &res);