较为舒适的码风速成指北
观前提示:本文主要基于C++来展开,C用户请自动无视文章中出现的包括但不限于万能头、命名空间和STL等的特性。
前言
作为一个已经AFO多年的OIer,而如今进入了幻想乡的freshman,对于程设这玩意多少是有点前辈的姿态的。虽然我知道这样不好,但是爽啊。
因此在看见某些编程小白的无知错误时,总免不了有些手痒痒,想当教师爷,于是就有了这篇对码风指手画脚的文章。
首先来到的是宇宙安全声明:本篇文章内所阐述的码风观点仅代表我个人,如有不同意见,那就是您对;同时我可能也会引用其他巨佬的代码,还请包容。
就酱(´・_・`)
什么是码风
伟大的哲学家子漫酱曾经说过:
一份赏心悦目的代码是工作效率的保证。
所谓码风,就是代码风格,直观上的表现就是代码看着舒不舒服。
每个人都会有自己独特的码风,这包括变量、函数的命名,有人喜欢用拼音,而有的人喜欢用英文,还有著名的驼峰命名法;还有括号打的位置,缩进的习惯乃至打空格的习惯,这些都是代码风格的一部分。
码风没有对错之分,但总的来说,让人看着舒服的代码总会有一些共性。
码风养成
关于括号
花括号
大抵有两种流派,一种是左花括号不换行
int main(){
return 0;
}
另一种自然就是换行流派了
int main()
{
return 0;
}
我个人觉得换过行会更加简洁,看着更有层次。但实际上好像是不换行的占多数来着。
其他括号没啥好说的,匹配上就行了。
关于空格
其实于我个人而言,我并不是很喜欢打空格。这主要是出于对MLE和TLE的恐惧,我觉得紧凑一点不是坏事。
例如这种:
for(int i=1;i<=n;++i)
{
int k=a[i];
if(k<=a[i-1]) ans++;
}
但在一些关键字处打上空格也有好处,据说是便于查错。鄙人未曾尝试过,所以不多做评价。
for (int i = 1;i <= n;i ++)
{
int k = a [i];
if (k <= a[i - 1]) ans ++;
}
关于缩进
理论上来说,如果你使用的代码编辑器(如Dev-C++、VSC等)不是太nt,一般缩进这块不太可能有什么大问题。
但还是可能会有这种代码飞到你面前
for(i=1;i<=100000;i++)
{if(i%2)
{
pi=pi+4.0/(2*i-1);}
if(……)
{
……
}
}
}
}
就…怎么说呢,看着非常难受。尽管在C/C++中缩进与否并不会影响代码运行(事实上有的语言是严格要求进行缩进的),但为了您和代码阅读者的寿命着想,还是尽可能正常缩进罢。
每对花括号内部的代码块都应要比上一层级的代码缩进一个,即一个Tab键。即使您的for/if后面的代码块仅有一行代码而无需使用花括号时,也请尽量将这行代码换行并缩进,这样便于认清代码的结构。
顺带一提,个人认为将原本有多个语句的for/if代码块使用逗号表达式来强制变为一行代码,以此来达到精简代码的目的是非常不明智的,这会严重牺牲代码的可读性。
关于函数及STL(C++)的使用
除了像dfs和递归等特殊场景下必须用到函数外,将代码中一些复用率高的代码打包成函数来调用,可以有效地提高可读性和查错、调试效率。
在大部分时候,自定义函数是能帮助到您解决很多实际性问题的。
一个大佬的主程序:
#include <bits/stdc++.h>
#define ......
......
using namespace std;
......
void imp(int k,int t)
{
......
}
void ......
......
int main()
{
int n,m;
ios::sync_with_stdio(false);
cin>>n>>m;
imp(n,m,1);
cos(a[1],d[1][1]);
dfs(n,1);
outans(d[1][1]);
return 0;
}
这个代码长约 200 行我就不放了
另一部分人的主程序:
#include <bits/stdc++.h>
using namespace std;
int main()
{
......
return 0;
}
同样 150 多行的代码很明显就繁琐了。
至于STL,这是C++用户独享的moment,建议多记一些,这是非常有益身心的。
关于命名
包括两个部分,变量和函数。但无论是变量还是函数,命名都有一个基本原则,那就是:尽可能地简单易懂。
在一些小东西的代码中,经常会看见以下两种命名风格:
int a=114514,b=1919,c=810;
double d,e,f;
char g,h,i;
还有这种:
int zhengshu=2333;
double xiaoshu=0.233;
char zifu;
这两种在变量、函数较少时可能还会比较好辨认,但一旦数量上来了,就会显得十分混乱(又尤其是第二种)。
推荐以下几种命名方式:
- 直接使用对应单词(如果有且较短时)
- 也可以使用英文的缩写
- 多用善用下划线,例如
my_name
- 还有经典的驼峰命名法:
MyName
当然,当你变成老东西后,也可能会搞一些整活性质的命名。对此我只能说:把你的注释写好!
关于注释
我最讨厌10种人:
一种是写代码不写注释的人
另一种是让我写注释的人
——
子漫酱
写注释真的很讨厌,但写注释也确实有助于增强代码的可读性,让人可以理解某段代码的用途,于人于己都很方便。
如果没有注释,你的函数、变量命名又很迷惑的话…
scanf(”%d“,&n);
for(int i=1;i<=n;i++)
{
qaq(i);
kkk();
}
orz();
这谁看的懂啊(╯‵□′)╯︵┻━┻
你可以像这样用注释来标明每个变量的用途
struct player {
string name;
int card[7], num[17], col[7], sum, niu, tieban, maxx, bomb, idd;
long long score;
/*
card:记每个牌的点数
num:记每种点数出现在的牌的数量
col:记每张牌的花色
sum:记所有牌点数的和
niu:记牌的类型
niu=0-10 无牛、牛一至九、牛牛
tieban:记录铁板的点数,如果没有铁板则记为0。
maxx:记录所有牌中最大的点数
bomb:记录炸弹的点数,如果没有炸弹则记为0.
*/
}a[100007];
也可以用注释给关键语句做上标注
for(int i=l;i<=1000;++i)
{
int cnt=0,y[1000],sum=0;//cnt作为i的因子个数计数器
//y[cnt]存储第cnt个因子
for(int j=1;j<=i/2;++j)
if(i%j==0)//判断是否为i的因子
y[++cnt]=j,sum+=j;//存储并累加
}
除此之外,还可以以注释的形式在代码前备注文件名、时间、作者等信息,便于进行溯源
/*
File name:*.cpp
Author:***
Description:******
Generation time:yyyy-mm-dd
*/
顺带一提,代码(包括注释)中尽量避免出现中文,以防由于设备或编辑器而带来的文字编码差异让你的代码变成锟斤拷烫烫烫。
一些奇技淫巧
如果您使用的是Dev-C++的话:
你可以使用自带的AStyle插件来进行代码格式化,非常方便,只不过我觉得很麻烦就是了。
如果您使用的是VSCode的话:
首先,你可以通过极其灵活的用户代码片段来对VSCode这样一个
其次,您会有海量的插件选择来美化你的代码。下面介绍一些我自己在用的插件