C++代码书写规范——给新手程序员的一些建议

代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码。特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候,如果碰到一些丑陋的代码,我们还要看懂并且修改它的时候,那种难受,肯定会让我们回想起多年以前自己还是新手程序员的时候,写下的那些丑陋的代码,并且深深内疚于将它们留给了我们的后继者,不知道他们和它们是否还安好。所以,强调代码的规范性,写出整洁,优雅,可读性高的代码应该是成为一个合格的程序员的第一步。这里我就抛砖引玉,给大家一些关于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)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 3,370评论 2 36
  • iOS编程规范0规范 0.1前言 为􏰀高产品代码质量,指导广大软件开发人员编写出简洁、可维护、可靠、可 测试、高效...
    iOS行者阅读 4,435评论 21 35
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 咖啡冥想 我16年12月份回老家的时候看到爸爸妈妈都因为胳膊和肩膀疼痛而受苦,我就想用自己所学的知识给他们做个疗愈...
    baby心理咨询师阅读 138评论 0 0
  • 又到五月,一个多节日的季节,其中一个重要的节日就是五月第二个星期天的母亲节。各大商场,甚至包括药店,美容院,菜市场...
    南方的向日葵阅读 256评论 1 1