一、关于添加空格和空行的一些建议
写代码的时候添加良好风格的空格和空行可以使代码看上去更整洁,布局更清晰。
1.空格
- 建议一:函数名之后不要留空格,紧跟左括号‘ (’,以与关键字区别。
- 建议二:象 if、 for、 **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,应当将
修改为
| const float EPSINON = 0.00001; |
| if ((x>=-EPSINON) && (x<=EPSINON)) |
其中 EPSINON 是允许的误差(即精度)。
- 建议四:应当将指针变量用“ ==”或“! =”与** NULL **比较。
假设指针变量的名字为 p,它与零值比较的标准 if 语句如下:
| if (p == NULL) // p 与 NULL 显式比较,强调 p 是指针变量 |
| if (p != NULL) |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)