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

//不换行写法(邪教!)
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

#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

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

int aVarWithVeryLongName;
  
struct Node
{
    int dep,s;
}
  
struct SegT
{
    SegT *lc,*rc;
}
  
bool getAns(std::vector<std::string> &res);

模板来自menci的博客