50条编程建议,让别人对你的代码刮目相看【高质量编程】

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入学习模式。若有错误,请多多指教。

 点赞  收藏 留言 都是我创作的最大的动力!

大家的时间都很宝贵,话不多说进入正文。

目录

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入学习模式。若有错误,请多多指教。

一、文件结构

二、程序的版式

★空行

★★代码行  

★★★代码行内的空格 

★对齐 

 ★长行拆分 

★修饰符的位置 

★注释 

三、命名规则 

★共性规则

四、表达式和基本语句  

 ★复合表达式

★循环语句 

★switch 语句 

五、常量


一、文件结构

1)用 #include 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。

2)用 #include “filename.h” 格式来引用非标准库的头文件(编译器将 从用户的工作目录开始搜索)。

#include        //引用标准库的头文件


#include"my_file.h"      //引用非标准库的头文件

 3)头文件中只存放“声明”而不存放“定义”

二、程序的版式

★空行

4)在每个类声明之后、每个函数定义结束之后都要加空行。

函数间

// 空行 
void Function1(…) 
{ 
 … 
} 
// 空行 
void Function2(…) 
{ 
 … 
} 
// 空行
void Function3(…) 
{ 
 … 
}

 5)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

 函数内

// 空行
while (condition) 
{ 
     statement1; 
      // 空行
     if (condition) 
     { 
         statement2; 
     } 
     else 
     { 
         statement3; 
     } 
     // 空行
 statement4; 
}

★★代码行  

 6)一行代码只做一件事情,如:只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

变量定义

//良好的代码行
int n = 0;
int k = 0;
int m = 0;
//不良的代码行
int n=0,k=0,m=0;

语句: 

//良好的代码行
x = a + b; 
y = c + d; 
z = e + f;
//不良的代码行
x = a + b; y = c + d; z = e + f;

也许你现在会觉得小主有点大惊小怪,心里反驳道:切,这两种风格没什么区别,不都一样吗?  别急,客官接着往下瞧。

7)  if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 {}。这样可以防止书写失误。 

//良好的代码行

if (width < height) 
{ 
    dosomething(); 
}
// 空行
for (initialization; condition; update) 
{ 
    dosomething(); 
} 
// 空行 
other();

//不良的代码行

if (width < height) dosomething();
for (initialization; condition; update) 
    dosomething(); 
other();

都表达同样的内容,客官你的感受怎么样。

8)尽可能在定义变量的同时初始化该变量(就近原则)

        如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。
int width = 10;        // 定义并初绐化 width
int height = 10;       // 定义并初绐化 height

★★★代码行内的空格 

9)     关键字之后要留空格。像 constvirtualinlinecase 等关键字之后至少要留一个空格,否则无法辨析关键字。像 ifforwhile 等关键字之后应留一个空格再跟左括号‘(’,以突出关键字

10)     函数名之后不要留空格,紧跟左括号'(’,以与关键字区别

11)     ’向后紧跟,‘’ 、 ‘’ 、‘;’向前紧跟,紧跟处不留空格。

12)     ‘,’之后要留空格,如 Function(x, y, z)。如果‘;’不是一行的结束 符号,其后要留空格

        如 for (initialization; condition; update)

13)     赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符
 如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格

14)    一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格

15)    像“[]”、“.”、“->”这类操作符前后不加空格。

16)    对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i<10; i++)和 if ((a<=b) && (c<=d))

void Func1(int x, int y, int z); // 良好的风格 
void Func1 (int x,int y,int z);  // 不良的风格 

if (year >= 2000) // 良好的风格 
if(year>=2000)    // 不良的风格 
if ((a>=b) && (c<=d)) // 良好的风格 
if(a>=b&&c<=d)        // 不良的风格 

for (i=0; i<10; i++) // 良好的风格 
for(i=0;i<10;i++)    // 不良的风格 
for (i = 0; i < 10; i ++) // 过多的空格 

x = a < b ? a : b;         // 良好的风格 
x=aFunction(); // 不要写成 b -> Function();

对齐 

17)程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

18){ }之内的代码块在‘{’右边数格处左对齐。如果出现嵌套的{},则使用缩进对齐

函数

//良好的对齐方式

void Function(int x) 
{ 
… // program code 
} 

//不良的对齐

void Function(int x){ 
… // program code 
}

if语句 

//良好的对齐方式

if (condition) 
{ 
… // program code 
} 
else 
{ 
… // program code 
}

//不良的对齐方式

if (condition){ 
… // program code 
} 
else { 
… // program code 
}

for循环 

//良好的对齐方式
for (initialization; condition; update) 
{ 
… // program code 
} 

//不良的对齐方式
for (initialization; condition; update){ 
… // program code 
}

嵌套 

{ 
     … 
     { 
         … 
     } 
     … 
}

 ★长行拆分 

19)代码行最大长度宜控制在 70 至 80 个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。

20)长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读

//良好的拆分
if ( (very_longer_variable1 >= very_longer_variable12) 
    && (very_longer_variable3 <= very_longer_variable14) 
    && (very_longer_variable5 <= very_longer_variable16) ) 
{ 
    dosomething(); 
}

//不良的拆分
if ( (very_longer_variable1 >= very_longer_variable12) && (very_longer_variable3 <=                     
    very_longer_variable14) && (very_longer_variable5 <= very_longer_variable16) ) 
{ 
    dosomething(); 
}

//良好的拆分
for (very_longer_initialization; 
     very_longer_condition; 
     very_longer_update) 
{ 
     dosomething(); 
}
//不拆分
for (very_longer_initialization; very_longer_condition; very_longer_update) 
{ 
     dosomething(); 
}

修饰符的位置 

21)应当将修饰符 * 和 & 紧靠变量名

char *name; 
int *x, y; // 此处 y 不会被误解为指针

注释 

注释通常用于:
1 )版本、版权声明;
2 )函数接口说明;
3 )重要的代码行或段落提示。 虽然注释有助于理解代码,但注意不可过多地使用注释。

22)注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。注释的花样要少。

23)如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。

例如
i++; // i 加 1,多余的注释

24)边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。 

25)注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害

26)尽量避免在注释中使用缩写,特别是不常用缩写。

27)注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方

28)当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。

if (…) 
{ 
     … 
     while (…) 
     { 
        … 
     } // 注释
     … 
} // 注释

三、命名规则 

共性规则

29)标识符应当直观且可以拼读,可望文知意,不必进行“解码”。

        标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。
程序中的英文单词一般不会太复杂,用词应当准确。

 30)程序中不要出现仅靠大小写区分的相似的标识符。

int x, X;         // 变量 x 与 X 容易混淆 
void foo(int x);  // 函数 foo 与 FOO 容易混淆 
void FOO(float x);

 31)程序中不要出现标识符完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但会使人误解。

32)用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。

int minValue; 
int maxValue;

33)类名和函数名用大写字母开头的单词组合而成。

 class Node;             // 类名 
 class LeafNode;         // 类名 
 void Draw(void);         // 函数名 
 void SetValue(int value); // 函数名

34)变量和参数用小写字母开头的单词组合而成。

BOOL flag; 
int drawMode;

35)常量全用大写的字母,用下划线分割单词 

const int MAX = 100; 
const int MAX_LENGTH = 100;

36)静态变量加前缀 s_(表示 static) 

static int s_initValue; // 静态变量

37)如果不得已需要全局变量,则使全局变量加前缀 g_(表示 global)。

int g_howManyPeople; // 全局变量

 38)类的数据成员加前缀 m_(表示 member),这样可以避免数据成员与成员函数的参数                   同名。

void Object::SetValue(int width, int height) 
{ 
     m_width = width; 
     m_height = height; 
}

四、表达式和基本语句  

C++/C 语言的运算符有数十个,运算符的优先级与结合律如表 4-1 所示。注意一元
运算符 + - * 的优先级高于对应的二元运算符
50条编程建议,让别人对你的代码刮目相看【高质量编程】_第1张图片

39)如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级 

word = (high << 8) | low

if ((a | b) && (a & c))

 复合表达式

40)不要编写太复杂的复合表达式。

i = a >= b && c < d && c + f <= g + h ; // 复合表达式过于复杂

41)不要有多用途的复合表达式。

d = (a = b + c) + r ;

//应改为
a = b + c; 
d = a + r;

42)不要把程序中的复合表达式与“真正的数学表达式”混淆。

if (a < b < c)     // a < b < c 是数学表达式而不是程序表达式

//应改为
if ((a

循环语句 

C++/C 循环语句中,for 语句使用频率最高,while 语句其次,do 语句很少用。 

43)在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的
 循环放在最外层,以减少 CPU 跨切循环层的次数。

//低效率: 长循环在最外层
for (row=0; row<100; row++) 
{ 
    for ( col=0; col<5; col++ ) 
    { 
        sum = sum + a[row][col]; 
    } 
}
//高效率:长循环在最内层
for (col=0; col<5; col++ ) 
{ 
    for (row=0; row<100; row++) 
    { 
         sum = sum + a[row][col]; 
    } 
}

44)不可在 for 循环体内修改循环变量,防止 for 循环失去控制 

45)建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法

// 循环变量属于半开半闭区间
for (int x=0; x

switch 语句 

46)  每个 case 语句的结尾不要忘了加 break,否则将导致多个分支重叠(除非有意使多个分       支重叠)。

47)不要忘记最后那个 default 分支。即使程序真的不需要 default 处理,也应该保留语句 default : break; 这样做并非多此一举,而是为了防止别人误以为你忘了 default 处理。

switch (variable) 
{ 
    case value1 : … 
                  break; 
    case value2 : … 
                  break; 
    … 
        default : … 
                  break; 
}

五、常量

48)尽量使用含义直观的常量来表示那些将在程序中多次出现的数字或字符串。 

#define MAX 100 /* C 语言的宏常量 */ 
const int MAX = 100; // C++ 语言的 const 常量 
const float PI = 3.14159; // C++ 语言的 const 常量

49)在 C++ 程序中只使用 const 常量而不使用宏常量,即 const 常量完
 全取代宏常量

50)如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不
 应给出一些孤立的值。

const float RADIUS = 100; 
const float DIAMETER = RADIUS * 2;

 希望大家能养成良好的代码风格,若觉得小主的内容对你有帮助,给小主点一个免费的赞吧!

声明:本篇内容来自《高质量 C++/C 编程指南林锐

我不是知识的创作者,只是知识的搬运工。

你可能感兴趣的:(C基础知识梳理,c语言,c++,linq,开发语言)