评价一份代码的好坏有许多标准,但无论如何都不仅是能够编译通过,本文旨在给出一份基础的代码风格推荐。
目录
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;
建议 new
和 delete
成对书写。
运算符与表达式
单目运算符
通常而言单目运算符应与参数之间不要有空格:
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' 对齐
5 printf("%d", a); // 代码块内容缩进一个 tab
6}
7else if (a < 0) // 'else' 与 'else if' 另起一行
8{
9 printf("%d", -a)
10}
11else
12{
13 printf("a is zero.");
14}
if ()
语句嵌套:
1/**
2 * 嵌套部分遵循「代码块内容缩进一个 tab」的规则
3 * 在此基础上进一步缩进,保证 `{}` 整齐成对出现
4 */
5if (a > 0)
6{
7 if (b > 0)
8 {
9 printf("balabala");
10 }
11 else
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}
while
与 do .. 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}