代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码。特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候,如果碰到一些丑陋的代码,我们还要看懂并且修改它的时候,那种难受,肯定会让我们回想起多年以前自己还是新手程序员的时候,写下的那些丑陋的代码,并且深深内疚于将它们留给了我们的后继者,不知道他们和它们是否还安好。所以,强调代码的规范性,写出整洁,优雅,可读性高的代码应该是成为一个合格的程序员的第一步。这里我就抛砖引玉,给大家一些关于C++代码规范性的一些建议。
 

一、关于添加空格和空行的一些建议

写代码的时候添加良好风格的空格和空行可以使代码看上去更整洁,布局更清晰。

1.空格

  • 建议一:函数名之后不要留空格,紧跟左括号‘ (’,以与关键字区别。
  • 建议二:象 iffor、 **while **等关键字之后应留一个空格再跟左括号‘ (’,以突出关键字。
  • 建议三:‘,’之后要留空格。在for语句中的‘;’其后要留空格,如 for (i=0; i<5; i++)。
  • 建议四:对于表达式比较长的 **for **语句和 **if **语句,为了紧凑起见可以适当地去掉一些空格。
  • 建议五:赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符,如“ =”、“ +=” “>=”、“ <=”、“ +”、“ *”、“ %”、“ &&”、“ <<”、 “ ^”等二元操作符的前后应当加空格。
  • 建议六:一元操作符如“ !”、“ ~”、“ ++”、“ --”、“ &”(地址运算符)等前后不加空格。

下面这段代码就会显得不优雅,看着有些别扭。

//不好的风格
void func (int a,int b,int c,int d)
{
if(a>=0)
{
if(a>=b&&c>=d)
{
int * x = & a;
...//doSomeThing();
}
}
}

我们希望将它改为这样。

//良好的风格
void func(int a, int b, int c, int d)//建议一,建议三
{
if (a >= 0)//建议二,建议五
{
if ((a>=b) && (c>=d))//建议四
{
int *x = &a; //建议六
...//doSomeThing();
}
}
}

还有这样的for语句for (i = 0; i < 5; i ++),就属于空格滥用了,应该改为for (i=0; i<5; i++)

 

2.空行

  • 建议一:在实现函数时,函数与函数之间应加空行。
  • 建议二:在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行。

当程序中没有空行时是这样的。

void func1()
{
while (condition)
{
...//doSomeThing();
if (condition)
{
...//doSomeThingRelated();
}
else
{
...//doSomeThingRelated();
}
...//doSomeThing();
}
}
void func2()
{
...//doSomeThing();
}

而良好的空行不紧能使代码看上去更整洁,代码逻辑也会更清晰。

//良好的风格
void func1()
{
while (condition)
{
...//doSomeThing(); if (condition)
{
...//doSomeThingRelated();
}
else
{
...//doSomeThingRelated();
} ...//doSomeThing();
}
} void func2()
{
...//doSomeThing();
}

二、关于代码行格式的一些建议

  • 建议一:一行代码只做一件事情
  • 建议二:长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首 (以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
//不好的风格
void func()
{
int veryVeryLongWidth, veryVeryLongHeight;
if ((veryVeryLongWidth > veryVeryLongHeight) || (veryVeryLongWidth < veryVeryLongHeight))doSomeThing();
}

过长的代码行无论是书写还是阅读对人来说都不是一个美好的体验,所以我们建议以上代码要这样写。

//良好的风格
void func()
{
int veryVeryLongWidth;
int veryVeryLongHeight;
if ((veryVeryLongWidth > veryVeryLongHeight)
|| (veryVeryLongWidth < veryVeryLongHeight))
{
doSomeThing();
}
}

三、关于命名的一些建议

  • 建议一:变量,函数,文件命名应该具有描述性,最好采用英文单词或其组合(不要使用拼音,或者无意义的abc之类的,除了像for (i=0; i<5; i++)中的i这样的),以便记忆和阅读。
  • 建议二:类名和函数名用大写字母开头的单词组合而成。
    例如:
class Book;
class ReadBook;
void Draw();
void DrawImage();
  • 建议三:变量和参数用小写字母开头的单词组合而成。
    例如:
int value;
void SetValueMode(int valueMode);
  • 建议四:常量全用大写的字母,用下划线分割单词。
    例如:
const int MAX = 100;
const int MAX_LENGTH = 100;
  • 建议五:全局变量加前缀 g_(表示 global)。静态变量加前缀 s_(表示 static)。类的成员变量加前缀 m_(表示 member)。
    例如:
int g_maxValue;
static int s_maxValue;
void Object::SetValue(int maxValue)
{
m_maxValue = maxValue;
}

四、关于添加注释的一些建议

在C++中注释主要有两种,程序块的注释常采用“ /*…*/”,行注释一般采用“ //…”。注释主要用在3个地方。1、版权申明,2、函数说明,3、重要或复杂代码提示。对于前两种,每个人或者每个公司都有个人的规范和习惯,这里只要大家在公司内部统一即可。关于第三种给重要或复杂代码添加提示,我们有一下几点建议。

  • 建议一:注释的确很重要,但是最好的代码本身就是文档(self-document),类型和变量命名意义明确要比通过注释解释模糊命名好得多
  • 建议二:边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要记得删除。
  • 建议三:注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。

五、关于类中成员声明次序的一些建议

  • 建议一:在类中按照public:、protect:、private:的次序声明。如果那一块没有直接忽略。
  • 建议二:在同一块中按照1、结构体和枚举,2、常量,3、构造函数,4、析构函数,5、成员函数,6、成员变量的次序声明。

六、关于if语句中的变量“与零值比较”的一些建议

  • 建议一:不可将布尔变量直接与 TRUE、 **FALSE **或者 1、 **0 **进行比较。
    假设布尔变量名字为 flag,它与零值比较的标准 if 语句如下:
if (flag) // 表示 flag 为真
if (!flag) // 表示 flag 为假
  • 建议二:应当将整型变量用“ ==”或“!=”直接与 0 比较。
    假设整型变量的名字为 value,它与零值比较的标准 if 语句如下:
if (value == 0)
if (value != 0)

也可以将0放在比较运算符前面。

if (0 == value)
if (0 != value)

这时如果将“==”写成“=”,编译器会报错。

  • 建议三:不可将浮点变量用“ ==”或“!=”与任何数字比较。无论是 float 还是 double 类型的变量,都有精度限制。所以一定要避免将浮点变量用“ ==”或“!=”与数字比较,应该设法转化成“ >=”或“ <=”形式。
    假设浮点变量的名字为 x,应当将
if (x == 0.0) // 隐含错误的比较

修改为

const float EPSINON = 0.00001;
if ((x>=-EPSINON) && (x<=EPSINON))

其中 EPSINON 是允许的误差(即精度)。

  • 建议四:应当将指针变量用“ ==”或“! =”与** NULL **比较。
    假设指针变量的名字为 p,它与零值比较的标准 if 语句如下:
if (p == NULL) // p 与 NULL 显式比较,强调 p 是指针变量
if (p != NULL)

作者:吴尼玛cs
链接:https://www.jianshu.com/p/ccc1b1992894
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1. 在.cpp的开头应有一段格式统一的说明,内容包括:

a. 文件名 (FileName);
b. 简短说明文件功能、用途 (Comment);
c. 创建人 (Creater);
d. 文件创建时间 (Date)。
例:

//////////////////////////////////////////
    //
    // FileName: ***.cpp
    // Creator: piaocoder
    // Date: ****-**-**
    // Comment: ***
    //
    //////////////////////////////////////////

2. 对于主要功能函数应有注释说明。内容包括:功能、入口/出口参数,必要时还可有备注或补充说明,对于函数中的主要功能代码,也应有注释说明。注释以英文为主。

3. 每行代码的长度推荐为80列,最长不得超过120列;折行以对齐为准。

例:

HANDLE CSOpenFile(const char cszFileName[],\
                      int nMode);

或者:

BOOL CSReadFile(HANDLE hFile,\
                    void *pvBuffer,\
                    int nReadSize,\
                    int *pnReadSize\
                    );

4. 循环、分支代码,判断条件与执行代码不得在同一行上。

例:正确:

if (n == -2)
        n = 1;
    else
        n = 2;

不得写做:

if (n == -2) n = 1;
    else n = 2;

5. 指针的定义,* 号既可以紧接类型,也可以在变量名之前。

例:可写做:int* pnsize;

也可写做:int *pnsize;

但不得写做:int * pnsize;

6. 在类的成员函数内调用非成员函数时,在非成员函数名前必须加上“::”。

7. 函数入口参数有缺省值时,应注释说明。

例:

BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace /* = TRUE */);

或者:

BOOL KSSaveToFile(const char cszFileName[],BOOL bCanReplace );// = TRUE

8. else if 必须写在一行。

9. 与‘{’、‘}’有关的各项规定:

9.1 ‘{’、‘}’应独占一行。在该行内可有注释。

例:正确:

for (i = 0; i < cbLine; i++)
    { // .....
        printf("Line %d:", i);
        printf("%s\n", pFileLines);
    }

不得写做:

for (i = 0; i < cb; i++)
    {printf("Line %d:", i);
    printf("%s\n", pFileLines);}

9.2 ‘{’必须另起一行,‘{’之后的代码必须缩进一个Tab。‘{’与‘}’必须在同一列上。

例:正确:

if (i > 0)
    {
        m = 1;
        n++;
    }

不得写做:

if (i > 0){
            m = 1;
            n++;
    }

例外:

if (i == 0)
    { ASSERT(FALSE); return; }

9.3 在循环、分支之后若只有一行代码,虽然可省略‘{’、‘}’,但不推荐这么做。若省略后可能引起歧义,则必须加上‘{’、‘}’。

例:正确:

if (n == -2)
        n = 1;
    else
        n = 2;

或者:

if (n == -2)
        { n = 1; }
    else if (n != nTemp)
        { n = 2; }
    else
        { n = 3; }

不得写做:

if (n == -2)
        n = 1;
    else if (n != nTemp)
        n = 2;
    else
        n = 3;

不推荐:

if (i < 1)
        { n = 1; }
    else
    {
        if (i == 1)
            { n = 2; }
        else
        {
            if (i > 1)
                { n = 3; }
        }
    }

10. 与空格有关的各项规定。

10.1 在所有两目、三目运算符的两边都必须有空格。在单目运算符两端不必空格。但在‘->’、‘::’、‘.’、‘[’、‘]’等运算符前后,及‘&’(取地址)、‘*’(取值)等运算符之后不得有空格。

例:正确:

int n = 0, nTemp;
     
    for (int i = nMinLine; i <= nMaxLine; i++)
     
    (condition) ? funct1() : func2();
    Or
        (condition)
          ? long statement
          : another long statement;

不得写做:

int n=0, nTemp;
     
    for ( int i=nMinLine; i<=nMaxLine; i++ )

10.2 for、while、if 等关键词之后应有1个空格,再接‘(’,之后无空格;在结尾的‘)’前不得有空格。

例:正确:

if (-2 == n)

不得写做:

if(-2 == n)

if ( -2 == n )

10.3 调用函数、宏时,‘(’、‘)’前后不得有空格。

例:正确:

printf("%d\n", nIndex);

不得写做:

printf ("%d\n", nIndex);

printf( "%d\n", nIndex );

10.4 类型强制转换时,‘(’‘)’前后不得有空格

例:可写做:

(KSFile*)pFile;

也可写做:

(KSFile *)pFile

不得写做:

( KSFile* )pFile
    ( KSFile * ) pFile

10.5 代码行内的空格规则:

(1)关键字之后需要加空格

(2)函数名之后不能留空格

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

(4)‘,’之后要留空格,如果‘;’不是一行的结束符,其后应该留空格。

(5)一般的二元操作符前后都应该留空格。

(6)一般一元操作符前后都不加空格。

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

11. 与缩进有关的各项规定

11.1 缩进以 Tab 为单位。1 个 Tab 为 4 个空格

11.2 下列情况,代码缩进一个 Tab:

1. 函数体相对函数名及‘{’、‘}’。

例:

int Power(int x)
    {
      return (x * x);
    }

2. if、else、for、while、do 等之后的代码。

3. 一行之内写不下,折行之后的代码,应在合理的位置进行折行。若有 + - * / 等运算符,则运算符应在上一行末尾,而不应在下一行的行首。

11.3 下列情况,不必缩进:switch 之后的 case、default。

例:

switch (nID)
    {
        case ID_PLAY:
      ......
      break;
        case ID_STOP:
      ......
      break;
        default:
      ......
      break;
    }
————————————————
版权声明:本文为CSDN博主「piaocoder」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/piaocoder/article/details/45772087

C++代码书写规范——给新手程序员的一些建议的更多相关文章

  1. 一个想法照进现实-《IT连》创业项目:创业时该不该用新手程序员

    前言: 距离上一篇文章,转眼已然一个多月了,这段时间没出来和大伙汇报创业的进度,怪我了. 最近又感冒了,已经一个多星期了,还在感冒中,不过感冒也不能偷懒了,每天都有大把的事情等着我解决~~~ 不过今天 ...

  2. WEB标准:标准定义、好处、名词解释、常用术语、命名习惯、浏览器兼容、代码书写规范

    1. WEB标准是什么? “WEB标准”是一系列标准的总称.一般的误区经常把WEB标准说成DIV+CSS.准确的说法应该是:采用W3C推荐的WEB标准中的XHTML1.1结合CSS2.0 样式表制作页 ...

  3. 新手程序员随笔2——初识html、css和javascript

    翻看博客,发现好久木有发blog了.纠其原因,一则是近来工作上卡到了一个编程难题,我是一个单线程的小猿,当我手头有事情做的时候,我不想分心去做其它事情,如写blog.二则是我个人的写作能力不佳,想到写 ...

  4. 如何向新手程序员介绍Java编程

    学习Java,他们都说很easy. 作为一名刚从斯康星大学麦迪逊分校计算机科学系毕业的大学生,我通过一些编程课程认识了很多使用Java的朋友.现在很多学校都在从别的编程语言(大多是C ++)转教Jav ...

  5. (转)Java代码书写规范

    0. 安装阿里代码规范的eclipse插件 https://www.cnblogs.com/caer/p/7753522.html 1.基本原则 强制性原则:     1.字符串的拼加操作,必须使用S ...

  6. C#中的代码书写规范以及命名规范

    C#代码书写规则: 1. 尽量使用接口,然后使用类实现接口,以提高程序的灵活性. 2.一行不要超过80个字符 3.尽量不要手动更改计算机生成的代码 4.关键的语句写注释 5.建议局部变量在最接近使用它 ...

  7. Unity项目代码书写规范

    以Google的代码规范为主,稍加改动 https://google.github.io/styleguide/csharp-style.html 书写规范 基础写法 Pascal和驼峰混用,参数用驼 ...

  8. 新手程序员求职简历缺少这 3 点!别说8k薪资,4K你可能都拿不到!

    制作一份简历可能需要八百到千字,但HR看简历的时间只不过短短十秒,甚至可以说是一目十行. 我想针对想做程序员的刚毕业的学生分享着一点自己在求职招聘方面的感悟,不针对工作了多年的老同志了.快毕业那会儿, ...

  9. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

随机推荐

  1. 每天进步一点点------Error: Can't place pins assigned to pin location Pin_K22 (IOPAD_X41_Y19_N14)

    在QII中的Assignments----Device----Device and pin option-----(选项卡)Dual purpose pin将nCE0 的设置改为: use as re ...

  2. PHP实现敏感词过滤

    1.敏感词过滤方法 /** * @todo 敏感词过滤,返回结果 * @param array $list 定义敏感词一维数组 * @param string $string 要过滤的内容 * @re ...

  3. DFS(深度优先搜索)

    基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...

  4. 深入delphi编程理解之消息(六)无窗口单元消息的创建、接受及dispatch模式编程

    一.程序界面 二.程序代码 (一).主界面代码 //========================================================================== ...

  5. CSS - div居中在屏幕中(水平居中 + 垂直居中)

    方法一代码 <div> <h1>404 Not Found.</h1> </div> <style> div { text-align: c ...

  6. 通过ping和tracert命令来判断网络经过多少个路由。trace和route合作

    摘抄自: https://blog.csdn.net/foreverhuylee/article/details/49853075 当我们访问某个网络时,通过tracert命令,就能知道本机与目标主机 ...

  7. 入门chrome插件开发教程和经验总结,一篇就搞掂!

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_44244857/articl ...

  8. PS——"火龙"

    一.打开素材龙图案(因为老师给了素材,所以直接打开了) 二.Ctrl+J把背景图层复制一份,用魔棒工具把白色的背景去除(背景和龙的外围会出现蚂蚁线),Delete键清除,Ctrl+D取消选择 三.全选 ...

  9. Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

    在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图.待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程.注意因为代码比较多,这里的流程图 ...

  10. dwz中的(tree)树形菜单的默认收缩

    做网站后台时,为了方便管理,可能会用到dwz中的树形菜单,如下: 树形菜单的收缩有默认属性值,可以对其进行一定的初始设定: DWZ的树结构是按<ul>,<li>的嵌套格式构成, ...