目录

一,前言

二,程序的版式

1. 空行

2. 代码行

3. 代码行内的空格

4. 对齐

5. 长行拆分

6. 修饰符的位置

7. 注释

8. 类的版式

三,命名规则

3.1共性规则

3.2 简单的 Windows 应用程序命名规则

四,表达式和基本语句

4.1 运算符的优先级

4.2 复合表达式

4.3 if 语句

4.4 for 语句的循环控制变量

五,总结


一,前言

自从计算机问世以来,程序设计就成了令人羡慕的职业,程序员在受人宠爱之后容

易发展成为毛病特多却常能自我臭美的群体。

如今在 Internet 上流传的“真正”的程序员据说是这样的:

(1) 真正的程序员没有进度表,只有讨好领导的马屁精才有进度表,真正的程序员会让

领导提心吊胆。

(2) 真正的程序员不写使用说明书,用户应当自己去猜想程序的功能。

(3) 真正的程序员几乎不写代码的注释,如果注释很难写,它理所当然也很难读。

(4) 真正的程序员不画流程图,原始人和文盲才会干这事。

(5) 真正的程序员不看参考手册,新手和胆小鬼才会看。

(6) 真正的程序员不写文档也不需要文档,只有看不懂程序的笨蛋才用文档。

(7) 真正的程序员认为自己比用户更明白用户需要什么。

(8) 真正的程序员不接受团队开发的理念,除非他自己是头头。

(9) 真正的程序员的程序不会在第一次就正确运行,但是他们愿意守着机器进行若干个

30 小时的调试改错。

(10) 真正的程序员不会在上午 9:00 到下午 5:00 之间工作,如果你看到他在上午 9:00 工

作,这表明他从昨晚一直干到现在。

本篇主要讲述C语言程序的版式 ,命名规则,表达式和基本语句的书写格式优化,让你的代码比别人更加出色,更加美观。大部分内容参考林锐的《高质量的C和C++编程》。


二,程序的版式

1,空行

空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加 清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。 所以不要舍不得用空行。

函数之间的空行

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

函数内部的空行

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

2,代码行

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

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

风格良好的代码行

int width; // 宽度
int height; // 高度
int depth; // 深度
x = a + b;
y = c + d;
z = e + f;
if (width < height)
{
dosomething();
}
for (initialization; condition; update)
{
dosomething();
}
// 空行
other(); 

风格不良的代码行

int width, height, depth; // 宽度高度深度
X = a + b; y = c + d; z = e + f;
if (width < height) dosomething();
for (initialization; condition; update) dosomething();
other(); 

尽可能在定义变量的同时初始化该变量(就近原则) 如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用 了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如

int width = 10; // 定义并初绐化

width int height = 10; // 定义并初绐化

height int depth = 10; // 定义并初绐化 depth

3. 代码行内的空格

3.1关键字之后要留空格。象 const、virtual、inline、case 等关键字之 后至少要留一个空格,否则无法辨析关键字。象 if、for、while 等关键字之后应留 一个空格再跟左括号‘(’,以突出关键字。 z

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

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

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

3.4赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符, 如“=”、“+=” “>=”、“”这类操3作符前后不加空格。

3.5对于表达式比较长的 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=a<b?a:b; // 不好的风格
int *x = &y; // 良好的风格
int * x = & y; // 不良的风格
array[5] = 0; // 不要写成 array [ 5 ] = 0;
a.Function(); // 不要写成 a . Function();
b->Function(); // 不要写成 b -> Function();

4.对齐

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

4.2{ }之内的代码块在‘{’右边数格处左对齐。

风格良好的对齐

void Function(int x)
{
… // program code
}
if (condition)
{
… // program code
}
else
{
… // program code
}
for (initialization; condition; update)
{
… // program code
}
While (condition)
{
… // program code
}

风格不良的对齐

void Function(int x){
… // program code
}if (condition){
… // program code
}
else {
… // program code
} for (initialization; condition; update){
… // program code
}while (condition){
… // program code
}

5 .长行拆分

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

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

if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{ dosomething();
} virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix, CMatrix rightMatrix); for (very_longer_initialization; very_longer_condition; very_longer_update)
{ dosomething();
}

6. 修饰符的位置

修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即 x 是 int 类型的指针。上述写法的弊端是容易引起误解,例如:int* x, y; 此处 y 容易被误解为指针变 量。虽然将 x 和 y 分行定义可以避免误解,但并不是人人都愿意这样做。

应当将修饰符 * 和 & 紧靠变量名 例如:

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

7.注释

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

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

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

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

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

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

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

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

/*
* 函数介绍:
* 输入参数:
* 输出参数:
* 返回值 :
*/
void Function(float x, float y, float z)
{ …
}
if (…)
{ … while (…) {
…
} // end of while
…
} // end of if

8.类的版式

类可以将数据和函数封装在一起,其中函数表示了类的行为(或称服务)。类提供 关键字 public、protected 和 private,分别用于声明哪些数据和函数是公有的、受保护 的或者是私有的。这样可以达到信息隐藏的目的,即让类仅仅公开必须要让外界知道的 内容,而隐藏其它一切内容。我们不可以滥用类的封装功能,不要把它当成火锅,什么 东西都往里扔。 类的版式主要有两种方式:

(1)将 private 类型的数据写在前面,而将 public 类型的函数写在后面。

(2)将 public 类型的函数写在前面,而将 private 类型的数据写在后面。

以数据为中心版式

class A
{ private:
int i, j;
float x, y; … public:
void Func1(void);
void Func2(void);
…
}

以行为为中心的版式

class A
{ public:
void Func1(void);
void Func2(void);
… private:
int i, j;
float x, y; …
}

三,命名规则

比较著名的命名规则当推 Microsoft 公司的“匈牙利”法,该命名规则的主要思想 是“在变量和函数名中加入前缀以增进人们对程序的理解”。例如所有的字符变量均以 ch 为前缀,若是指针变量则追加前缀 p。如果一个变量由 ppch 开头,则表明它是指向 字符指针的指针。

“匈牙利”法最大的缺点是烦琐,例如

int i, j, k;

float x, y, z;

倘若采用“匈牙利”命名规则,则应当写成

int iI, iJ, ik; // 前缀 i 表示 int 类型

float fX, fY, fZ; // 前缀 f 表示 float 类型

如此烦琐的程序会让绝大多数程序员无法忍受。 据考察,没有一种命名规则可以让所有的程序员赞同,程序设计教科书一般都不指 定命名规则。命名规则对软件产品而言并不是“成败悠关”的事,我们不要化太多精力 试图发明世界上最好的命名规则,而应当制定一种令大多数项目成员满意的命名规则, 并在项目中贯彻实施。

3.1共性规则

3.1.1 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。 标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。 程序中的英文单词一般不会太复杂,用词应当准确。例如不要把 CurrentValue 写成 NowValue.

3.1.2 标识符的长度应当符合“min-length && max-information”原则。 几十年前老 ANSI C 规定名字不准超过 6 个字符,现今的 C++/C 不再有此限制。一 般来说,长名字能更好地表达含义,所以函数名、变量名、类名长达十几个字符不足为 怪。那么名字是否越长约好?不见得! 例如变量名 maxval 就比 maxValueUntilOverflow 好用。单字符的名字也是有用的,常见的如 i,j,k,m,n,x,y,z 等,它们通常可用作函数 内的局部变量。

3.1.3 命名规则尽量与所采用的操作系统或开发工具的风格保持一致。 例如 Windows 应用程序的标识符通常采用“大小写”混排的方式,如 AddChild。 而 Unix 应用程序的标识符通常采用“小写加下划线”的方式,如 add_child。别把这两类风格混在一起用。

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

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

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

变量的名字应当使用“名词”或者“形容词+名词”。

float value;
float oldValue;
float newValue;

3.1.6 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。 类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。

DrawBox(); // 全局函数box->Draw(); // 类的成员函数

3.1.7 DrawBox(); // 全局函数 box->Draw(); // 类的成员函数。

int minValue;
int maxValue;
int SetValue(…);
int GetValue(…);

3.2 简单的 Windows 应用程序命名规则

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

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

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

BOOL flag;
int drawMode;

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

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

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

void Init(…)
{ static int s_initValue; // 静态变量…
}

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

int g_howManyPeople; // 全局变量
int g_howMuchMoney; // 全局变量

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

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

四,表达式和基本语句

4.1 运算符的优先级

C++/C 语言的运算符有数十个,运算符的优先级与结合律如表 4-1 所示。注意一元 运算符 + - * 的优先级高于对应的二元运算符。

4.2 复合表达式

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

例如:

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

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

例如:

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

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

例如:

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

4.3 if 语句

4.3.1 if 语句是 C++/C 语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式 写 if 语句。本节以“与零值比较”为例,展开讨论。

整型变量与零值比较 应当将整型变量用“==”或“!=”直接与 0 比较。 假设整型变量的名字为 value,它与零值比较的标准 if 语句如下:

if (value == 0)

if (value != 0)

不可模仿布尔变量的风格而写成

if (value) // 会让人误解 value 是布尔变量

if (!value)

4.3.2 指针变量与零值比较 z 【规则 4-3-4】应当将指针变量用“==”或“!=”与 NULL 比较。 指针变量的零值是“空”(记为 NULL)。尽管 NULL 的值与 0 相同,但是两者意义不 同。假设指针变量的名字为 p,它与零值比较的标准 if 语句如下:

if (p == NULL) // p 与 NULL 显式比较,强调 p 是指针变量 if (p != NULL)
不要写成 if (p == 0) // 容易让人误解 p 是整型变量 if (p != 0) 或者
if (p) // 容易让人误解 p 是布尔变量 if (!p)

4.4 for 语句的循环控制变量

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

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

循环变量属于半开半闭区间

for (int x=0; x<N; x++)
{
…
} 

循环变量属于闭区间

for (int x=0; x<=N-1; x++)
{
…
}

五,总结

本篇主要是讲解C语言代码优化问题,让你的代码更加间接,更有利于自己和别人读写。

关注即可提高学习效率!

0 Warning, 0 Error!

如何让你的代码比别人更加赏心悦目?相关推荐

  1. [Vue进阶]为什么我的代码让别人看起来头皮发麻?

    前面的话 首先我想说的是,这篇文章不是介绍什么高深的技术,请各位熟知.涉及的都是日常开发当中一些不符合规范的案例,借此分享给诸位.如果你是小白,或许这篇文章对你有点帮助,如果你是老司机,看完请轻点拍! ...

  2. 怎么把python代码发给别人_教你装逼了:怎么样发布你的 Python 代码给别人 “pip install”...

    我们经常在使用某些功能的时候,都会去安装一些第三方的模块,比如 "pip install requests",感觉逼都被别人装了,你有没有想过,自己搞一个模块,给别人直接 pip ...

  3. 2018-3-10 kKNN与K-mean的区别以及各自的Python代码(别人写的好的文章)

    看了百度中的内容觉得他们之间并没有任何实质性的联系,之所以自己写下来,单纯的知识自己对单词的不了解,总是会觉的他们两个是一个概念 但是发现并不是那么简单的 好的Blog KNN与K-Means的区别 ...

  4. 如何避免自己写的代码成为别人眼中的一坨屎 (摘自微信公众号,顶级程序员)...

    从微信公众号上读到一篇文章,记录下来提醒自己也分享给大家~ 一.注释 不要给不好的名字加注释,一个好的名字比好的注释更重要: 不要"拐杖注释",好代码 > 坏代码 + 好注释 ...

  5. js混淆加密,通过混淆Js代码让别人(很难)还原,js代码加密

    使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护. 1.为什么需要js混淆 在 ...

  6. 写一个关机代码让别人的电脑根据你的指令关机,c语言写小程序恶搞别人

    目录 要求: c语言在电脑上实现控制关机 写关机程序的代码 ​编辑 如何把这个程序让同学运行起来 要求: 运行起来,电脑1分钟内关机,如果输入:我是猪(可以是其他整蛊句子),就取消关机: c语言在电脑 ...

  7. js混淆加密,通过混淆Js代码让别人(很难)无法还原

    1.为什么需要js混淆 在web系统发展早期,js在web系统中承担的职责并不多,只是简单的提交表单,js文件非常简单,也不需要任何的保护. 随着js文件体积的增大,为了缩小js体积,加快http传输 ...

  8. 如何避免自己写的代码成为别人眼中的一坨屎!

    普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.笔者推荐三本经典的书籍<代码整洁之道 >.<编写 ...

  9. 过年了,是不是应该写点代码祝福别人

    (function(a) { // 控制台输出信息if (!a) return;var msg = "%c祝福大家新年快乐,\n狗年大吉\n ------http://www.cnblogs ...

最新文章

  1. html 显示消息数量,html实现消息按钮上的数量角标的实例详解
  2. 在SQLite中使用事务
  3. Xcode9新特性介绍-中文篇
  4. nginx location 匹配 多个规则_三道小练习助你弄懂 Nginx location 匹配
  5. autocad 如何摆正显示_如何在 VB 中连接 AutoCAD
  6. hadoop 自定义OutputFormat
  7. d3 v4 api transitions
  8. 分类算法学习(一)——KNN算法的原理及简单实现
  9. 海大上机-(专硕)2014-4-手机通讯录
  10. html embed如何禁止自动播放,html embed用法
  11. Java课程设计题目七:魔板游戏
  12. 整形美容的消费者心理分析
  13. 小学生python游戏编程arcade----动画图片实现爆炸效果
  14. 【小样本基础】Meta-Learning 元学习流程:图解MAML代码
  15. 小米手机刷机失败之小米La¥%¥Ji
  16. 啊哈添柴挑战Java1016. 反向输出一个三位数
  17. 某版本瑞数解决方案-爬虫
  18. 算法复杂度:算法时间复杂度和空间复杂度表示法
  19. 从联想昭阳到MacBook Pro,致我的那些败家玩意——电脑
  20. linux io栈(读写流程)

热门文章

  1. 微信小程序开发入门教程(七)
  2. 中科院计算机所博士何飞,专家人才库数据----中国科学院计算技术研究所
  3. 宇视设备搜索工具_【聚焦】2019版中国纸箱行业供应商搜索引擎、全球瓦楞行业设备前沿技术报告将于4月瓦楞展现场首发!...
  4. linux内存映射原理,Linux内存管理实践-使用fault()实现内存映射
  5. Parsing error: No Babel config file detected for xxx Either disable config file checking...报错解决方法
  6. 好工具推荐系列:看图软件irfanview/Honeyview/pineapple-pictures
  7. 辽师计算机杂志期刊等级认定,辽师学术期刊认标准(2017年5月修订).doc
  8. 报表增删改开发过程中知识整合
  9. C++课程设计----电话管理系统
  10. BAT命令常用API