本文介绍博主在OI中常见代码风格,也用来规范自己。
本文内容自发稿开始保证实施

Ender’s Code Style for OI

概览

可以使用万能头文件#include<bits/stdc++.h>
使用using namespace std;时,应放在#include下一行。
结构体应放于所有函数之前,main函数应放于程序末尾。

缩进

所有同级命令均应为等长缩放长度,所有被包含的命令应使用4个空格或等长Tab缩进。

大括号

对于所有需要大括号的命令和函数,左大括号不应换行,左边必须有一个空格;右大括号与命令应为等长缩进,例:

1
2
3
4
5
6
7
8
9
10
11
12
// 结构体
struct Node {
// do something...
};

// 其他,以if为例
if(condition) {
// do something...
}
else {
// do something...
}

对于所有几乎只包含一条return语句的函数,右大括号可以不换行,其余均应换行,例:

1
2
3
4
5
6
bool cmp(int a,int b) {return a>b;}
int find(int x){return fa[x] == x ? x : fa[x] = find(fa[x]);}

void search(int cur) {
// do something...
}

除循环嵌套以外,如果包含的命令只有一行,应不使用大括号且不换行,例:
for(int i = 1; i <= n; i++) cin >> a[i];
组合使用的代码可以不换行且应以空格可开,例:
a = q.top(); q.pop()

函数

一般情况下,main函数声明时省略其括号内的void,最后一句必须为return 0;,例:

1
2
3
4
int main() {
// do something...
return 0;
}

对于比赛或者Cena提交,需将文件x相关d代码写为两个分开的函数,并在主函数开头以及结尾调用,例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
inline void fi() {
freopen("mod.in", "r", stdin);
freopen("mod.out", "w", stdout);
}
inline void fo() {
fclose(stdin);
fclose(stdout);
}
int main() {
fi();
//do something...
fo();
return 0;
}

变量声明

局部变量在需要时定义,除循环以外应尽量减少重名。
如果一个变量更改数值非常频繁,应使用register注册变量,例:
for(register int i = 1; i <= 2147483647; ++i)
如果一个变量确定不包含负数,且数值较大,则应使用unsigned无符号类型。

空格

除文章其他地方规定以外,为了便于阅读检查,可在语句中适当添加空格,例:

1
2
int a, b, c;
mid = (l + r) >> 1;

命名

不相关的数组与变量应该分行声明。
所有函数、变量、参数名都必须使用“驼峰命名法”,且除辅助变量都必须有相应意义。
结构体首字母应大写且名称有意义。
例:

1
2
3
4
5
6
7
8
9
struct Edge {
int from, to, dist;
Edge() {}
Edge(int _from, int _to, int _dist): from(_from), to(_to), dist(_dist) {}
};

int getRoot(int k) {
// some commands can get root...
}

类型别名、常量类型变量与宏定义

较大的数应使用const定义而不是#define,且其名称应为全大写。
较长类型名称应使用typedef而不是#define
当某类型代码大量使用时可以使用#define来缩短代码长度。

例:

1
2
3
4
5
6
7
8
#define rep(i,s,n) for(int i = s;i <= n; i++)
const int MAXN = 100010;
const int MAXM = 200010;
typedef longlong ll;
int he[MAXN], ne[MAXM], etop = 1;
ll c, d;

rep(i,1,c) cin >> a[i];