蒟蒻 AstralNahida 的码风
前言
这里是蒟蒻 OIer AstralNahida 在 OI 中的码风的详细介绍。
个人认为码风相当清晰,供给各位参考。
约定
对于一些表示必要性的关键词,从 must 到 mustn't 排序如下:
必须 > 尽量 > 应当 > 建议 > 可以 > 不建议 > 不应当 > 尽量不 > 不得。
为方便阅读,本文中所有上述关键词都用粗体字表示。
另外,若没有「至少」、「至多」等词的限定,所有的数字默认为严格的。
例如「中间有一个空行」中的「有一个」默认为「有且仅有一个」。
第一部 · 整体
这里贴一份本人做洛谷 P2078 的代码:
#include <iostream>
#include <map>
#define upFor(i, a, b) for (int i = a; i <= b; i++)
#define Nahida return 0
std::map<int, int> pa;
int findRt(int x) {
return x == pa[x] ? x : pa[x] = findRt(pa[x]);
}
void merge(int x, int y) {
pa[findRt(x)] = findRt(y);
}
bool haveSameRt(int x, int y) {
return findRt(x) == findRt(y);
}
int main(void) {
int aVtxNum, bVtxNum, aEdNum, bEdNum;
std::cin >> aVtxNum >> bVtxNum >> aEdNum >> bEdNum;
upFor (i, -bVtxNum, aVtxNum) pa[i] = i;
upFor (i, 1, aEdNum + bEdNum) {
int u, v;
std::cin >> u >> v;
merge(u, v);
}
int ansA = 0, ansB = 0;
upFor (i, 1, aVtxNum)
if (haveSameRt(pa[i], 1)) ansA++;
upFor (i, -bVtxNum, -1)
if (haveSameRt(pa[i], -1)) ansB++;
std::cout << std::min(ansA, ansB) << '\n';
Nahida;
}
大概是这样式的。
由此可以看出,我的代码大致分为四个部分:
#include
部分,用于包含代码所需的头文件;#define
部分,用于进行一些简化代码的宏定义以及自己的一些小癖好(如 Line 6 的#define Nahida return 0
);- 全局变量、常量及函数的声明及定义部分;
- 主函数部分。
这一部只是提供代码的整体观感而已,码风具体规则详见下文。
第二部 · 头文件包含及宏定义
第一章 · 头文件
对于任意项目,在写代码的时候不得使用万能头 <bits/stdc++.h>
。除了刷题的时候可以少点时间,其它全是缺点。
对于引用的头文件,C 标准的头文件应当使用以 c
为前缀的形式,而非 .h
为后缀的形式。
例如,<string.h>
应当写成 <cstring>
。
对于所有头文件,建议将 C 标准的头文件放在一起,后必须接一个空行再把 C++ 的头文件包含进来。
另外,也建议以头文件的作用将包含的头文件分类,每个类别中间必须由一个空行分割。
上述两种分段方式任选其一即可。
另外,不得使用 using namespace std;
,否则函数名、变量名容易出现冲突。
必要时,可以使用 using std::sort;
此类方法,但仍需要确定函数名、变量名不出现冲突。
第二章 · 宏定义
对于任意宏定义,其作用为下列两种的任意一种:1° 简化代码或定义常量;2° 满足自己的小癖好。
如果一份代码中同时出现了这两种宏定义,则需要把两种宏定义分别放在一起,中间必须由一个空行分隔。
第三部 · 缩进及大括号
第一章 · 缩进
缩进必须使用 2 空格缩进或者 4 空格缩进,但不得混用。
在每一个大括号的内部或者 case
、public
、private
等的内部,必须使用一份缩进。
对于很长的表达式,需要分行来确保可读性、可维护性时,也必须使用一份缩进。
任意 #
开头的指令之前不得使用缩进,无论它是否在原本需要使用缩进的块内。
第二章 · 大括号
大括号的常用风格有以下两种:
- 「通透」风格:
if (1 + 1 == 2)
{
break;
}
- 「饱满」风格:
if (1 + 1 == 2) {
break;
}
必须使用这两种中的任意一种,且不得混用。
这里更建议使用第二种,否则若内部的语句很少,整个代码观感就比较空虚。
第四部 · 空格及空行
第一章 · 空格
必须妥善利用空格,否则代码过于紧凑(说难听点,挤成一坨),影响观感和可读性、可维护性。
以下列出的位置必须使用一个空格:
- 双目运算符的左右两侧(特殊地,
+
和-
作为正负号时,与后接的表达式之间不得使用空格); - 流运算符的左右两侧;
if
系列、while
和do-while
、switch
、for
和foreach
等与后接的(或前导的)大括号或小括号之间;- 一对大括号在同一行时,左大括号的后面和右大括号的前面;
- 三目运算符中,
?
和:
的左右两侧; *
表示指针类型时,若后接变量名,与变量名之间;#include
与后接的<>
之间;- 使用「饱满」风格的大括号时,左大括号与前导内容之间;
,
或;
与后接的表达式之间;- 其它必须使用空格的地方。
任何除了作为缩进以外的地方,都不得出现几个空格连用的情况。
以下列出的位置不得使用空格:
::
、->
、.
的左右两侧;*
表示指针所引用的内容时,与后接变量名之间;*
表示指针类型时,与前导的类型名之间;- 函数名与后接小括号之间;
,
或;
的左侧;- 单目运算符与参与运算的表达式之间;
+
和-
作为正负号时,与后接的表达式之间;- 其它不得使用空格的地方。
第二章 · 空行
必须妥善利用空行,否则代码过于紧凑(说难听点,挤成一坨),影响观感和可读性、可维护性。
在第一部中提到,代码大致分成四个部分,其中每个部分之间必须使用一个空行。
在其它的任何位置,应当根据代码内容合理地使用一个空行进行分隔,确保代码可读性、可维护性。
第五部 · 变量、常量及函数
第一章 · 定义
若非必要,尽量不定义全局变量。
定义常量,必须使用 #define
或 const
中的任意一种,不得混用。
定义函数时,若函数体不长,建议在主函数之前声明并定义;若函数体很长,应当在主函数之前声明,在主函数之后定义。
第二章 · 命名
命名尽量不过长,否则使用没有自动补全的编辑器时容易累死,表达式也容易过长,影响观感和可读性、可维护性。
同时,命名不得使用过于简单、没有意义的名字,尽量在命名中体现出该函数的作用。题目所给出的变量名除外。
需要注意的是,过于简单、没有意义的核心是没有意义,若单个字母有明显意义的,不算作不规范命名,如 for
中的 i
、表示顶点的 u
、v
等。
当然,变量较多时,确实不建议使用单个字母命名。
后记
差不多就是这样了。我这里给出的码风规范其实是相对宽松的,有很多自由的空间。
若有需要补充的地方,欢迎大家指出!
有些小萌新可能会问,码风真的有这么重要吗?
当然有的。上面我也提到了不少次,养成好的码风究其根本是为了保证代码的可读性和可维护性,同时保证代码美观。
好的码风对于 OIer 来说无疑是极其重要的,正所谓「码如其人」,如果你是一个有追求的 OIer,那么你应当拥有一个整洁、统一的码风。
当然,如果你决定将来做程序设计工作,你也应当养成好的码风,否则项目迟早被写成屎山。
好啦,就到这里吧,祝各位热爱自己的 OI 生涯。
更新记录
- 2025/4/26 14:09 本文正式告成,发布。
蒟蒻 AstralNahida 的码风的更多相关文章
- 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)
建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...
- 关于如何食用Xcode——用mac的小蒟蒻
前言QwQ 对于一只用Mac的小蒟蒻,没有Dev_c++简直太难受了,用在线IDE写代码又没法保存,那么我们怎么办呢? 好在App Store里有这个好东西 所以我们今天来介绍一下 “如何使用Xcod ...
- USACO 简易题解(蒟蒻的题解)
蒟蒻难得可以去比赛,GDOI也快到了,还是认真刷题(不会告诉你之前都在颓废),KPM 神犇既然都推荐刷USACO, 辣就刷刷. 现在蒟蒻还没刷完,太蒟刷得太慢,so 写了的搞个简易题解(没代码,反正N ...
- 【杂文】CSP2019蒟蒻AFO(假)记
[杂文]CSP2019蒟蒻AFO(假)记 [初赛前 N 天] 时间:2019-10-15 今晚 \(2012\) 的初赛题做到心态爆炸,选择考计算机基础知识一脸懵逼,填空和后面一道大模拟直接跳过,最后 ...
- 【杂文】NOIP2018 蒟蒻自闭记
[杂文]NOIP2018 蒟蒻自闭记 都 \(9102\) 年了,谁还记得 \(2018\) 年的事啊 \(QAQ\) . 还有两个月就要去参加首届 \(CSP\) 了. 想着如果再不记下去年那些事儿 ...
- NOIp蒟蒻的爆零记——HA-0132
考前: 从十一月开始的听课集训,连考六场:考前的最后两天写(da)着(zhe)各种各样的奇(C)葩(S)模板:一周的疯狂,已经过去: 考前的一晚:第二批高二的六个人聚在一起(还有滑稽大师),愉快的玩( ...
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
4636: 蒟蒻的数列 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 247 Solved: 113[Submit][Status][Discuss ...
- 【蒟蒻の进阶PLAN】 置顶+持续连载
看到周围神犇们纷纷列计划,本蒟蒻也决定跟随他们的步伐,计划大约是周计划吧,具体怎么安排我也不确定.. 2015.12.30 刚刚学习完最基础的网络流,需要进行这方面的练习,从简到难,有空余的话尝试学习 ...
- [BZOJ4636]蒟蒻的数列
[BZOJ4636]蒟蒻的数列 试题描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个数列,初始值均为0,他进行N次操作,每次将数列[a,b)这个区间中所有比k ...
- 蒟蒻修养之cf橙名计划
因为太弱,蒟蒻我从来没有上过div1(这就是今年的最后愿望啊啊啊啊啊)已达成................打cf几乎每次都是fst...........所以我的cf成绩图出现了惊人了正弦函数图像.. ...
随机推荐
- Jenkins使用maven打包项目
Jenkins使用maven打包项目 作为一名软件测试工程师,在日常工作中,我们经常需要使用Jenkins进行持续集成和持续部署(CI/CD).而Maven作为Java项目的构建工具,更是不可或缺.今 ...
- linux安装wps
1. http://wps-community.org/downloads 下载 wps-office_10.1.0.5672~a21_i386.deb ...
- 每次下载idea都必装的十个插件!
IDEA必备插件 Alibaba Java Coding Guidelines 功能: 阿里巴巴Java开发规范插件,用于代码规范检查. 特点: 基于阿里巴巴Java开发手册,提供实时代码规范检查,帮 ...
- 微信小程序实现分类菜单激活状态随列表滚动而自动切换效果详解
这篇文章主要介绍了微信小程序分类菜单激活状态跟随列表滚动自动切换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧 目录 view结构 ...
- Mybatis中的 switch
我这遇到个问题,如果 type字段为null则查询type is null,否则查对应的值 询问 AI 得知,可以用choose-when-otherwise <select> selec ...
- QT5笔记: 23. 标准对话框
文件对话框: QString fileName = QFileDialog::getOpenFileName(this, "打开一个文件", path, "文本(*.tx ...
- Ansible - [10] Vault(加密&解密)
加密文件 Ansible 有时需要访问一些敏感数据,如密码.Key等 使用ansible-vault可以加密和解密数据 # 创建测试文件 [root@control ansible]# echo 12 ...
- Scala变量补充
package com.wyh.day01 object ScalaLanguage { def main(args: Array[String]): Unit = { /** * 定义变量和常量 * ...
- 红队单兵渗透工具-DudeSuite
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! DudeSuite 红队单兵作战渗透测试工具 DudeSuite(Dude S ...
- 国产数据库高光时刻!天翼云TeleDB荣登TPC-DS全球测评总榜第二
近日,天翼云TeleDB数据库以40206063QphDS的吞吐量在国际权威机构TPC(国际事务处理性能委员会)发布的数据库基准测试TPC-DS中荣登全球榜单第二位.中国数据库技术跻身国际顶尖行列,这 ...