代码的格式与变量的命名

代码的格式与变量的命名

(今天没题了)

正确的代码格式能够让你一眼就看清楚代码的架构, 同时, 当你拿着你的代码问别人的时候, 正确的代码格式会让别人更愿意回答你的问题, 别人也能更轻松找到你代码中的错误.

那么, 如何才是正确的代码格式呢?

大括号与缩进

大括号的风格有两种: 换行与不换行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 换行
for(...)
{
blah;
blah;
if(foo)
{
blah;
}
else
{
blah;
}
}
// 不换行
for(...){
blah;
blah;
if(foo){
blah;
}else{
blah;
}
}

个人更习惯后者. 需要注意的就是 每遇到一个左大括号, 下一行一定要多缩进一格, 遇到一个右大括号, 下一行少缩进一格. 这样的结构能够让我们更清楚地看到多层if与for之间的层次结构关系.

在一般的IDE上, 选中多行代码按Tab键(Q左边的)即可给这几行代码的开头添加一个锁紧, 按shitf-Tab即可去掉一个缩进.

同时, 大部分IDE的默认设置均是使用空格缩进, 每次缩进4个空格. 在某些IDE上(比如DevCPP)默认设置是使用制表符缩进, 这种设置的代码在粘贴到别的地方的时候可能出现格式错位, 建议修改为空格缩进.

修改方式: Devcpp中依次打开工具(Tools)-编译器选项(Compiler Options), 把左下角的"标签"(tab)选项卡中的"使用tab字符"去掉, 将tab位置(Tab size)修改为4.

其他IDE的修改方式大同小异.

空格

< > = != == ^ * + - &&等运算符的左右加上空格,如:

1
2
3
4
5
6
7
8
9
10
if(a < 1){
;
}
if(a != 1){
;
}
if(foo ^ bar){
;
}
foo = bar;

在每一个逗号的后面添加一个空格,如:

1
printf("%d%d%d%d", a, b, c, d);

在for循环中的分号后面加一个空格, 如:

1
2
3
for(int i = 1; i < 0; ++i){ // PS: 在某些环境下, for循环中使用++i比i++快一丢丢

}

! &等一元运算符(只有一个参数的运算符)后不加空格,如:

1
2
3
4
scanf("%d%d%d", &a, &b, &c);
if(!a){
;
}

变量和函数的命名

有意义的变量名字能够让阅读你代码的人立刻理解变量的意义是什么, 方便代码交流.

变量命名并没有清晰的规范, 以下的都是作者的个人经验

循环变量命名: i j k

和总量大小有关的变量命名: m n

数组的命名: data[MAXN][MAXN] array[MAXN][MAXN]

标志的命名: flag
如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int isPrime(int n){
int flag = 0;
for(int i = 2; i * i <= n; ++ i){
if(n % i == 0){
flag = 1; // 表明找到因子
break;
}
}
if(flag){
// 如果有因子
return 0;
}else{
return 1;
}
}

字符串命名: str1 str2

用英文单词命名: scores[MAXN] students[MAXN]

如果名字中要有多个英文单词, 有两种命名方式:

  1. 驼峰命名法(camel case) 第一个字母小写, 之后每个单词的首字母大写:
    thisIsAVeryLongVariableNameForSomeVeryStupidReason
  2. 蛇形命名法(snake case) 单词和单词之间用下滑线连接
    this_is_a_very_long_variable_name_for_some_very_stupid_reason

两种命名方式均被广泛使用, 根据个人习惯选择即可. 作者印象里c语言常用的是蛇形命名法, 但不确定

(不推荐, 但是比无意义命名好)汉语拼音命名: xueshengfenshu[MAXN]

函数命名:

英文单词命名, 尽量动词开头, 如:
is_prime get_numbers solve

算法名字命名, 如:
dfs dfs prim dijkstra

绝对不能用的命名: mian