本文介绍在程序设计竞赛(OI、XCPC等)应当/建议遵循的代码规范。来源为I-Ripple本人的代码习惯,Google代码规范以及诸多算法竞赛前辈遗留下的代码规范

绪论

本文与一些知名代码规范存在冲突,窃以为在程序设计竞赛中应当抛弃部分工业界/职业程序员所使用的习惯。在此为算法竞赛后辈与读者阐明。

鉴于本文与其它代码规范存在冲突,仅向读者在此提供部分参考的代码规范。望读者择优而取之。

Google C++编程风格指南

_rqy’s Code Style for OI

Menci’s Code Style for OI

Studying Father’s Code Style for OI

名词解释:

必须:表示与大多数规范相一致,读者应当遵循。

优先:表示作者认为优先使用的写法,读者在没有严格要求下应使用。

可以:表示作者认为可以使用的写法,推荐使用。

不应:表示作者认为不应当使用的写法

概论

  • 所有的#include指令必须写于程序的起始部分
  • 优先选择使用using namespace std;并应写于#include指令的下一行

预编译指令

  • 优先使用#include<bits/stdc++.h>适当情况下可以使用#include<bits/extc++.h>
  • 在不使用万能头文件时,C标准库头文件必须使用c 前缀,而不是.h后缀。
  • 优先使用#include <foo>不应使用#include "foo"
  • 不优先使用#define

缩进

  • 对于每个代码块,优先使用 4 空格或等长的 Tab 缩进。

大括号

  • 优先大括号不换行(即Java风格)而非换行(K&R风格),例如:
int main() {
    int a,b;
    while(~scanf("%d%d",&a,&b)) {
        //code
    }
    return 0;
}
//Java风格,所有的左大括号不换行,右大括号换行
  • 右括号必须与上一级代码块的缩进相同。

空格

  • 可以添加一个字符的空格于:
    1. 二目运算符两侧(除,),例如= + - ==等。
    1. * &的左侧,例如const int &a

空行

  • 函数、成员函数、结构体、全局变量块之间优先使用空行隔开。
  • 如果有using namespace std;,则必须紧跟在 #include后的空行后
  • 任何位置不能出现连续的两个(或以上)空行。

函数

  • main()函数返回值一般情况下为int,并且return 0不可忽略
  • 使用#define int long long时,同时使用signed main()
  • 传参时,应该根据实际需要使用「引用」、「const 引用」和「值传递」。

命名规则

  • 一般变量名优先使用单个/少量小写字母命名,参考
  • 函数名/部分变量名优先使用对应算法缩写,如KMP CRT NTT CDQ
  • 不应使用英文单词作为命名,若需使用请在其后加入下划线进行避让,如updata_ aoto_ data_
  • 如需较长的命名,优先使用下划线命名,如my_data number_edge 常见命名方式
  • 常量名可以使用单个大写字母命名,如N M

常量定义

  • 必须使用const,避免使用#define

变量定义

  • 可以使用全局变量(关于爆栈问题尚待商榷)
  • 局部变量必须在用时定义,且定义在这个变量被调用的最近的地方
  • 局部变量必须在定义时进行初始化
  • 一般情况下,不应在循环中定义变量

其他

  • 优先使用各类STL容器
  • 出于可读性考虑,尽量不压行
  • 不应使用goto
分类: 算法竞赛

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注