2022 10 11 CodingStyle

作者

Yestercafe
Yestercafe

评价一份代码的好坏有许多标准,但无论如何都不仅是能够编译通过,本文旨在给出一份基础的代码风格推荐。

目录

C / C++ 基础语法

注释

注释记号(comment marks)与注释文本之间要使用一个空格隔开:

1// 这是正文,前面有空格
2
3/* 这是正文,前后有空格 */
4
5/** 这是一个段落,
6    * 这是第二行,
7    * 每一行都符合这样的要求。并且,这行后面有空格。 */

单行注释使用 //。尽量避免与代码同行,注释应写在相关代码的上面。即使同行也在其之前使用适当数量的空格隔开:

1// 表示苹果的数量
2int apples;
3
4// 完成向量的头删操作,并获取被删除的首元素
5// TODO 该代码不完全安全,待添加向量为空的判断
6int head = vec.front();
7vec.erase(vec.begin());
8
9int apples;  // 表示苹果的数量。注意注释前有两个数量的空格与代码隔开

TODO 更多注释记号的说明:多行注释、Docs、TODO、!? 标记等。

变量声明与定义

创建变量时应通俗易懂,尽量避免使用意义不明的字母,或至少应有注释:

1// 请这样
2int apples;
3
4// 不要这样
5int a;
6
7// n 为输入数据组数
8int n;

对于较为复杂的变量名,无法用一个单词概括的,除第一个单词外其余单词首字母应当大写:

1// 请这样
2int appleTree;
3
4// 不要这样
5int appletree;
6
7// 请不要在变量名中出现下划线!(某 g 姓学长的执念)
8// NEVER DO THIS!
9int apple_tree;

除非变量之间有明确相关关系,否则尽量不要在一行声明多个变量, 一行声明多个变量时,需要用空格隔开 (遵循 , 运算符规则):

1// 请这样
2int apples;
3int appleTrees;
4
5// 或这样
6int apples, appleTrees, totalApples; // 空格应打在 ',' 号后面
7
8// 不要这样
9int a,b,c,d,n,m,s;

要求指针在声明时立即进行初始化,如:

1int* p1 = nullptr;  // C 语言则为 NULL
2
3int foo = 42;
4int* p2 = &foo;
5
6int* p3 = new int;
7// delete p3;

建议 newdelete 成对书写。

运算符与表达式

单目运算符

通常而言单目运算符应与参数之间不要有空格:

1// 请这样
2*pointer = 1;
3pointer++;
4
5// 不要这样
6* poniter = 1;
7pointer ++;
  • 指针
1// 声明指针时应当将 * 运算符与变量类型放在一起
2int* pointer;
  • 数组下标 [] 与圆括号 () 内不需要加空格:
1// 请这样
2arr[10] = 1;
3fib(5);
4
5// 不要这样
6arr[ 10 ];
7fib( 5 );

双目运算符

双目运算符有很多,包括四则运算符、逻辑运算符、位运算符等,运算数(operand)与运算符(operator)之间应有空格:

1// 请这样
2totalApples = smallApples + bigApples; 
3arr[1 + 2];
4fib(1 + 2);
5
6// 不要这样
7totalApples=smallApples+bigApples;
8arr[1+2];
9fib[1+2];

逗号运算符 ,

逗号运算符是一种特殊的运算符,它用于连接表达式,常出现在变量声明等情况中,逗号运算符后通常需要加上一个空格:

1// 请这样 
2int apples, appleTrees;
3swap(a, b);
4
5// 不要这样
6int apples,appleTrees;
7swap(a,b);

判断与循环

判断

if () 语句所形成的代码块会很大程度上影响代码的风格,因此请务必按照建议格式进行书写。

 1// 请这样
 2// 'if' 与 '()' 空一格
 3if (a > 0) 
 4{                     // '{}' 单独占一行,与 'if' 对齐
 5printf("%d", a);    // 代码块内容缩进一个 tab
 6}
 7else if (a < 0)       // 'else' 与 'else if' 另起一行
 8{
 9printf("%d", -a)
10}
11else
12{
13printf("a is zero.");
14}  

if () 语句嵌套:

 1/** 
 2* 嵌套部分遵循「代码块内容缩进一个 tab」的规则 
 3* 在此基础上进一步缩进,保证 `{}` 整齐成对出现
 4*/
 5if (a > 0)
 6{
 7if (b > 0)
 8{
 9  printf("balabala");
10}
11else
12{
13  printf("balabalabala");
14}
15}

循环

循环格式类似于 if 语句,在这之上注意保持上文提到的格式规范 for 循环的 () 内的三个部分都要写上,彼此之间用 ; + `` (空格) 隔开。

 1// 请这样
 2for (int i = 0; i < 10; i++)
 3{
 4  print("hello world");
 5}
 6
 7// 不要这样
 8int i = 0;
 9for ( ; ; )   
10{
11  if (i == 10)
12  {
13    break;
14  }
15  i++;
16}

whiledo .. while:

 1//请这样
 2while (i < 10)  // 注意空格
 3{
 4  printf("hello world");
 5}
 6
 7do
 8{
 9  printf("hello world");
10} while (i < 10);

循环与 if 语句结合:

1while (a < 10)
2{
3  if (b > 5)
4  {
5    printf("b is too large.");
6    break;
7  }
8}