创造高质量的个人代码风格

  • 一、文件结构
  • 二、程序的版式
    • · 空行
    • · 代码行
    • · 代码行内的空格
    • · 对齐
    • · 长行拆分
    • · 修饰符的位置
    • · 注释
  • 三、命名规则
    • · 命名规则
    • · 命名惯例
  • 四、表达式和基本语句
    • · 括号()的使用
    • · 浮点型变量的比较
    • · 指针比较
    • · for循环
    • · switch语句
  • 五、函数设计
    • · 参数规则
    • · 设计函数的建议
    • · 使用断言
  • 六、内存管理
    • · 内存分配
  • 完结

  太多人会写代码,却只有极少的程序员可以将代码写出美感,你想让自己的代码成为高质量代码吗?下面这些建议一定可以帮到你。

以下是高质量代码需遵循的建议,下方有优秀代码示例。

一、文件结构

【建议1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。

【建议2】用#include <filename.h>格式来引用标准库的头文件(编译器从标准库目录开始搜索)。

【建议3】用#include “filename.h”格式来引用非标准库的头文件(编译器先从用户的工作目录开始搜索,搜不到再到标准库里找,为节省时间引用库函数用<>格式)。

【建议4】头文件中只存放“声明”而不存放“定义”。

二、程序的版式

· 空行

【建议1】每个函数构建完成后在下方都要加一行空行,来与其他语句块分隔开。

【建议2】在一个函数体内,逻辑上密切相连的语句间不加空行,与其他语句间要用一行空格加以分隔。

【建议3】用空格将声明部分和程序其他部分区分开。

· 代码行

【建议1】一行代码只做一件事,如只定义一个变量,或只写一条语句。这样代码易于阅读和写注释。

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

【建议3】尽可能在定义变量的同时初始化变量。

· 代码行内的空格

【建议1】函数名紧跟左括号 ‘(’,不要留空格;而if、for、while等关键字之后应留一个空格再跟左括号,这样便于区别函数和关键字。

【建议2】逗号 ‘,’之后要留一个空格,分号 ‘;不是一行的结束符号时,其后要留一个空格。

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

【建议4】一元操作符如“!”、“~”、“++”、“- -”、“&”(地址运算符)等前后不加空格。

· 对齐

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

【建议2】{ }之内的代码块在 ‘{’ 右边数格处左对齐。

· 长行拆分

【建议1】每一行代码行不要太长。

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

    //变量千万不要这样定义,这样写只是为了举例if ((very_very_long_sentence1>= very_very_long_sentence2)&&(very_very_long_sentence3<= very_very_long_sentence4)&&(very_very_long_sentence5==very_very_long_sentence6))//操作符放在新行之首,同时注意对齐for (very_very_very_very_long_sentence=0;very_very_very_very_long_sentence<10;very_very_very_very_long_sentence++)

· 修饰符的位置

【建议1】修饰符 * 和 & 应紧靠变量名

    //y容易被误解为指针int* x, y; //此处y不易被误解int *x, y;//更好的格式应为分行定义int *x;int y;

· 注释

【建议1】注释是对代码的“提示”,要精简、准确,不要花里胡哨。

【建议2】对复杂或有特殊意义的代码才进行注释,简单语句不注释

【建议3】边写代码边注释,修改代码同时修改相应的注释,无用注释要删除。

下为良好风格的代码:

//一行只定义一个变量并尽量初始化int width = 0;int depth = 0;int height = 0;
//一行只写一个语句,操作符前后各加一个空格x = a + b;y = c + d;z = e + f;
//for与‘(’间留一个空格,‘;’后空一格,操作符前后都空一格
//‘{’和‘}’独占一行且位于同一列,与for左对齐for (i = 0; i < 10; i++){do_something();}//空一行,与其他语句隔开,一个模块为一部分other();

三、命名规则

· 命名规则

【规则1】标识符应直观且可拼读,望文知意。

【规则2】命名风格保持一致。若用“大小写”分隔方式,如AddNumber,就全用该方式;若用“小写加下划线”的方式,如add_number,就只用这种方式,不要将两种方式混用。

【规则3】程序不要出现仅靠大小写区分的相似的标识符

int x, X; //容易混淆,不要这样写

· 命名惯例

函数名首字母大写其余小写

int Add(int x);

#define定义的常量字母全大写

#define MAX 100

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

static int s_name; //静态变量

不得不用全局变量,全局变量加前缀g_(表示global)

int g_name; //全局变量

四、表达式和基本语句

· 括号()的使用

若代码行中的运算符较多,要用括号()确定表达式的操作符,防止产生歧义。

· 浮点型变量的比较

浮点型与0或浮点数的比较不能使用“==”或“!=”,应设法转换为“>=”或“<=”的形式。(因为精度缺失的原因)

#include<stdio.h>  //使用以下两个精度,需要包含改头文件。
DBL_EPSILON  //double最小精度
FLT_EPSILON  //float最小精度
float x = 0;
if (x == 1.0) //错误的比较
//应该转化为
if ((x - 1.0) > -FLT_EPSILON && (x - 1.0) < FLT_EPSILON)
//或
if (fabs(x - 1.0) < FLT_EPSILON)

注:fabs是C语言函数库中求绝对值的函数,头文件#include <math.h>。

· 指针比较

指针变量是与NULL(空指针)比较,而不是和0比。

· for循环

不要在for循环内修改循环变量,应在for后()内修改,防止for循环失去控制。

· switch语句

【建议1】每个case语句的结尾不要忘了加break,否则将导致多个分支重叠。(除非有意为之)

【建议2】不管用不用,都最好在代码块的最后加一个default分支,利于以后的修改。

五、函数设计

· 参数规则

如果参数是指针,且仅输入不改值,则应在类型前加const,以防该指针在函数体内被意外修改。

//源字符串不应被修改,用const修饰
char * strcpy(char *destination, const char *source);

· 设计函数的建议

每个函数的功能要单一,不要让一个函数实现多个功能;规模要小,尽量控制在50行代码以内。

· 使用断言

char *clone_string( const char *source )
{char *result;//使用断言,防止出现使用空指针的情况assert( source != NULL );......
}

断言的使用可排除不应发生的非法情况,让程序更稳定。

六、内存管理

· 内存分配

内存分配,极易出错,遵循建议,干掉小错误!
【建议1】用malloc申请完内存后,应立即判断是否申请成功,检查指针是否为空指针

//自定义函数中用断言
assert(p != NULL);
//main函数体中用
if (p == NULL)
//或
if (p != NULL)  //来防错

【建议2】定义数组和申请动态内存是需要赋初值,防止使用了未初始化的内存。

【建议3】当心数组和指针的下标是否发生“多1”或“少1”的操作,避免越界访问。

【建议4】动态内存分配后一定要记得在后面用free将它释放,且内存释放后要立刻将指针设置为空指针,防止产生“野指针”。

int* p = (int*)malloc(40);if (p == NULL)  //判断内存是否申请成功
{printf("%s\n", strerror(errno));return 0;
}free(p);  //内存释放
p = NULL;  //置为空指针

申请的动态内存不会自动释放,自己一定不要忘记手动释放,否则动态内存申请的太多而未释放可能导致程序崩溃。

完结

C语言细微的规则还有许多,有的一般的学习者都可避免,有的则太过细小,上面的内容已涉及绝大多数值得注意和学习的规则与建议,相信只要读者将它们完全融会贯通、内化到自己的代码风格中后,一个属于你自己的优秀代码风格诞生啦。别的程序员见到直接顶礼膜拜,面试官直接双手奉上好offer。

继续加油呀,与君共勉!

下接数据与数据类型——标识符与常变量

破开C暗夜的第一道光(2)——高质量代码风格相关推荐

  1. 破开C暗夜的第一道光(1)

    C语言学习应具备的思想 一.如何学习C语言 二.使用C语言编程的7个步骤 1.定义程序的目标 2.设计程序 3.编写代码 4.编译 5.调试程序 6.运行程序 7.维护和修改代码 一.如何学习C语言 ...

  2. 编写高质量代码改善C#程序的157个建议——建议157:从写第一个界面开始,就进行自动化测试...

    建议157:从写第一个界面开始,就进行自动化测试 如果说单元测试是白盒测试,那么自动化测试就是黑盒测试.黑盒测试要求捕捉界面上的控件句柄,并对其进行编码,以达到模拟人工操作的目的.具体的自动化测试请学 ...

  3. Github即将破百万的PDF:编写高质量代码改善JAVA程序的151个建议

    代码是我们前进的基石. 废话不多说直接把本书部分内容展示出来 目录 == 第1章Java开发中通用的方法和准则/1 建议1:不要在常量和变量中出现易混淆的字母/2 建议2:莫让常量蜕变成变量12 建议 ...

  4. iOS-《编写高质量代码》笔记-第一章

    <编写高质量代码> 作者 刘一道 看这本书的过程中,做了一些笔记,分享一下. 建议1:视OC 为一门动态语言 写代码的时候切忌心态浮躁,急功近利. OC和C++ 都是在C的基础上加入面向对 ...

  5. 破开C语言暗夜的第四道光(1)—— 函数基础知识

    函数基础知识 一.C语言中函数的分类 - 库函数 - 自定义函数 二.函数的声明与定义 - 函数的声明 - 函数的定义 三.函数的参数 - 实际参数(实参) - 形式参数(形参) 四.函数的调用 - ...

  6. 跟着开涛学SpringMVC 第一章源代码下载

    2019独角兽企业重金招聘Python工程师标准>>> 源代码请到附件中下载. 其他下载: 跟着开涛学SpringMVC 第一章源代码下载 第二章 Spring MVC入门 源代码下 ...

  7. 阿里巴巴助攻腾讯破6.2亿微商传销第一大案!涉案公众号粉丝2400

    此生最恨的就是传销,害了多少人,害了多少代人!微信的火爆带动了微商的发展,与此同时微商也带动了部分违法行为的发展,比如传销."只要一部手机,一个微信账号,消费128元就能代理整个商城产品,在 ...

  8. 愿为你破开鱼尾,但不会为你化身浮沫

    童话里未必都是骗人的. 童话也未必都是写给孩子们的. 记得上一次读<海的女儿>的时候,我还是个十岁都不到的小姑娘.我应该算是个早慧的孩子,那时候我仔细地思考过两个问题:一,王子究竟爱谁多一 ...

  9. 【商业模式学习感悟】《B站:叛逃二次元和想破开的圈》读后感

    0 引言 看了这篇文章<B站:叛逃二次元和想破开的圈>,作为B站的三次元用户(看新闻时事.知识分享居多),我写写个人感想吧. 先简单对文章<B站:叛逃二次元和想破开的圈>概括全 ...

最新文章

  1. SQL Server 2005 学习笔记系列文章
  2. 互换两个变量,不使用中间变量
  3. elementUI树状图竖向滚动条和横向滚动条问题
  4. 基于web的新闻发布系统_终极Linux系统ExTiX 19.8发布,基于深度操作系统deepin15.11...
  5. 今日恐慌与贪婪指数为75 贪婪程度有所上升
  6. 《Docker技术从入门到实践》第1,2章
  7. 我的第一个MFC小项目(4)之 位图转换(续)
  8. unity3d 射击游戏BOSS行为代码
  9. tp3.2 BIND_MODULE与DEFAULT_MODULE
  10. Elasticsearch Exception:The number of object passed must be even but was [1]
  11. input的onchange,onpropertychange,oninput事件 区别 及兼容各个浏览器使用方法
  12. prince2证书有含金量吗?
  13. 智课雅思词汇---二十二、-al即是名词性后缀又是形容词后缀
  14. 数字IC/FPGA设计面试与工作_sky
  15. 开源技术可以解决贸易战?Richard Stallman 给微软的十条公开建议等;开源之道每周评论(2019 10 08))...
  16. 用微博帐号登录出错了! 对第三方应用进行授权时出现错误,请您联系第三方应用的开发者: 十五发芽或者稍后再试。 错误码:21322 重定向地址不匹配
  17. ZEMAX牛顿望远物镜的优化设计
  18. 中国液压缸线性位置传感器市场趋势报告、技术动态创新及市场预测
  19. 什么是物联网世界中的远程服务?
  20. Waifu2x 算法黑科技二次元图片无损放大

热门文章

  1. 绩效考核管理系统使用说明1
  2. 英语老师教计算机,英语教案-小学计算机老师教案?
  3. java float转换_Java float转换为String
  4. android rom指什么,【安卓基础知识】什么是ROM、RAM
  5. 阿里云边缘云计算的技术和实践
  6. 针对大众点评网上商铺评论字体替换反爬的反反爬
  7. python输出假分数_解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的...
  8. python:print函数打印空行
  9. Linux C 以read()读取文件并提取字符串
  10. keydown与keypress的区别,组合键