Spaceless

OI中常用的代码规范

本文介绍本人在 OI 中常用的代码规范

概览

所有的 #include 指令必须放置于整个程序开头
在.cpp文件中使用 using namespace std;
main 函数应该放置于整个程序末尾
不应该使用 int 代替 bool 表示逻辑值

预编译指令

#include 中,C 标准库头文件必须使用 c 前缀,而不是 .h 后缀
#include 中,C 标准库头文件应该放置于 C++ 标准库头文件前,其它头文件(如果有)应放置于最后
所有的预编译指令(包括 #ifdef 等)不能缩进

缩进

对于每个代码块,使用 4 空格或等长的Tab转空格(可以尝试Code::Blocks的默认自动缩进)

花括号

花括号必须遵循以下两种写法之一,前一种被称为「花括号不换行」,后一种被称为「花括号换行」
对于「花括号不换行」,左花括号的左边必须有且仅有一个空格
对于「花括号换行」,左花括号必须与上一级代码块的缩进相同
所有右花括号必须与上一级代码块的缩进相同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//不换行写法(邪教!)
if (condition) {
something;
} else {
something;
}

//换行写法(正义!)
if (condition)
{
something;
}
else
{
somethng;
}

for 中的三个语句外,每行不能有超过一个语句如果需要一行内求值多个表达式,可以但减少使用等效的逗号表达式替代
多个意义独立的代码块之间应该用空行隔开
右花括号前不应该有多余的空行

不应该有两个连续的空行
非空行尾不应该有多余的空格
所有的 #include 指令之后必须有一个空行
如果有 using namespace std;,则必须紧跟在 #include 后的空行后,之后必须一个空行
函数、成员函数、结构体、全局变量块之间必须用空行隔开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include<cstdio>
#include<iostream>

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 的局部变量

空格

在不影响代码可读性的前提下减少空格
||&&之类多条件并列的运算符左右必须要空格
= + - . -> ::之类两边不加空格
语句末尾打死不加空格(除非写Markdown)

1
2
3
4
5
6
7
8
9
10
11
12

if(条件1 && 条件2)
{
f[i][j]=f[f[i][j-1]][j-1];
}

struct Edge
{
int x;
Edge():x(0){}
}

指针与引用

在描述类型名时,指针符号 * 和引用符号 & 与左侧的类型名之间必须有一个空格,与右侧的其它关键字之间不能有空格,如 char *constint *&
在定义变量、函数返回值、参数时,指针符号 * 和引用符号 & 与左侧的类型名之间必须有一个空格,与右侧的变量、函数、参数名之间不能有空格

命名

所有结构体、函数、变量、参数名必须使用驼峰命名法,其中结构体名首字母必须大写,其它首字母必须小写
为方便,命名中的单词可以使用缩写,函数、变量、参数名可以用一个小写字母代替全局数组可以命名为一个大写字母

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

int aVarWithVeryLongName;

struct Node
{
int dep,s;
}

struct SegT
{
SegT *lc,*rc;
}

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

模板来自menci的博客