C语言初学者应该知道的(一)
C语言初学者应该知道的(一)
——编码风格与规范
一个程序员的编码水平如何,从他写的代码的风格,布局就可以看出来。所以良好的编码风格是非常重要的。清晰易读的代码,才是高质量的代码。
下面是我从网上找到的一个关于编码风格的帖子。
对于编程的初学者比较有用,高手就不必浏览了。
一.
每日编写如此之多的代码,很多同学现在的想法是,我要实现功能,实现了功能以后,万事大吉。
其实在实际工作当中不是这样的。在工作当中,因为各种原因,程序员们来来往往,是很频繁的事情。所以,要求我们的代码格式规范工整,这里就涉及到几点代码编写的要求:
1 变量名要有意义
变量名不能让人不知所云。比如动辄str1,str2。你今天知道这是个字符串,等你过一段时间再来看的话,你就未必知道这是个什么东西了。它到底是干嘛用的?我当时写了这玩意是有啥想法来着?一概不记得了。但是如果你起个有点意义的名字,情况就会好很多了。比如说,临时使用的SQL语句,你可以起个名字叫m_tmpSQL。我想,看到这个变量名的人,再怎么想,都能想出来这里面存放的是个SQL语句。
2 代码缩进工整
现在的IDE里,有很多自动缩进的功能,比如你在if后打上大括号,IDE会自动给你放到合适的位置。但是有一种情况,如果你的代码是复制粘贴进来的呢?这时候的缩进不见得完全准确。如果是VC6的话,可以使用ALT+F8,IDE会帮你搞定一切。一般来说,手工排版的话,在IDE里可以使用tab键。而如果是在文本编辑器里的话,建议使用四个空格。因为空格的长度在任何地方都是一样的,而一个制表位就不见得一样了。
3 合理适当的注释
很多同学写代码都不喜欢加注释的,原因多半还是认为自己肯定能看的懂。实际上,合理的注释是很有必要的。有些时候,为了完成一些功能,你灵光一现,写出了一些绝妙的代码,或者使用了复杂的逻辑来书写代码。可是你的后来人咋办呢?或者日后你自己修改的时候,面对满眼的if,else,for,switch,估计动起来也有点胆战心惊吧?并且,合理的注释在你写代码的时候,也能帮你厘清思路,明白自己在做什么,下一步要怎么进行
From:http://student.csdn.net/space.php?uid=39017&do=thread&id=452
二.标题:可不可以拜托各位一件事情?
很多同学喜欢把代码拿上来,询问。
不过,肖老师是程序白痴,看不懂同学们的代码。
举个例子
这是某位同学的代码,我仅仅是举例子,不是针对这位同学,希望不要见怪哈。
2 using namespace std; 这个也知道
3 int main() 这个简直太懂了
4 {
5 int num=1997; num请问是准备做什么的?
6 long fn[10000]={0}; fn请问是做什么的?10000是什么意思?
7 fn[0]=fn[1]=1; 为啥0和1这两个单元要赋初值?为啥是1?
8 int i,j; 这个能猜出来,这是循环变量。
9 for(i=2;i<=num;i++) 为啥是2开始,而不是0?
10 {
11 for(j=1;j<=fn[0];j++) 第二重循环式做啥的?fnp[0]不是1吗?为啥不写成1?
12 fn[j]*=i; 这个*是什么意思?
13 for(j=1;j<=fn[0];j++) 同样的问题
14 if(fn[j]>=10000) 10000是什么意思?
15 {
16 fn[j+1]+=fn[j]/10000; 这两行是什么意思?
17 fn[j]%=10000; 这里求出的余数是什么意思?
18 }
19 if(fn[j]>0) 为啥是大于0?可不可能小于0?
20 fn[0]++;
21 }
22 for(i=fn[0];i>0;i--) 为啥从后向前打印?
23 cout<<fn[i];
24 return 0;
25 }
26
27
这种程序,在我们的工程项目中,将会直接拒收。并且不计算工作量,嗯,顺便也就不发薪水了。
大家写程序,请务必写出人看得懂的程序,不要想当然的认为,每个人都有你这么高的水平,每个人理所当然,思路这会和你一致,一定能看懂你写的代码。
这里我也提示大家一段代码。
2 {
3 int nListCount=0;
4 va_list pArgList;
5 if (!szBuf) goto SafePrintf_END_PROCESS;
6 va_start (pArgList,szFormat);
7 nListCount+=Linux_Win_vsnprintf(szBuf+nListCount,
8 nMaxLength-nListCount,szFormat,pArgList);
9 va_end(pArgList);
10 if(nListCount>(nMaxLength-1)) nListCount=nMaxLength-1;
11 *(szBuf+nListCount)='\0';
12 SafePrintf_END_PROCESS:
13 return nListCount;
14 }
这是一段变参的字符串打印函数,我也没有加任何注释,如果有看不懂的同学,请直接向我询问。
里面使用的是匈牙利命名法。
From:http://student.csdn.net/space.php?uid=39028&do=thread&id=287
三.标题:程序的板式---c/c++的编程规范
版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。
1 空行
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。
【规则1-1】在每个类声明之后、每个函数定义结束之后都要加空行
【规则1-2】在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
2 代码行
【规则2-1】一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
【规则2-2】if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。
【建议2-3】
尽可能在定义变量的同时初始化该变量(就近原则)
3 代码行内的空格
【规则3-1】关键字之后要留空格。象const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。象if、for、while等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
【规则3-2】函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
【规则3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
【规则3-4】‘,’之后要留空格,如Function(x, y, z)。如果‘;’不是一行的结束符号,其后要留空格,如for (initialization; condition; update)。
4 对齐与缩进
【规则4-1】程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。
【规则4-2】采用统一的缩进格式,以四个空格作为缩进符号,不以tab字符作为缩进符号,因为tab字符在不同的编辑器中表示的宽度不同。
【规则4-3】{ }之内的代码块在‘{’右边第一缩进处左对齐。
5 注释
C 语言的注释符为“/* … */”。C++语言中,程序块的注释常采用“/* … */”,行注释一般采用“//…”。要求必须注释的对象包括以下四类:
(1)版本、版权声明;
(2)函数接口说明:完成的功能,输入,输出,返回值说明;
(3)数据结构(包括全局变量和常量):说明其物理含义和值域说明;
(4)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。
【规则5-1】采用“/* … */”注释的时候,在“/*”之后和“*/”之前必须至少保留一个空格。采用“//”注释的时候在“//”之后必须至少保留一个空格。
【规则5-2】采用/* … */注释的时候必须和所注释的对象保持对齐。采用行注释“//”的时候,如果在行前注释则必须和该行对齐;如果在行后注释,如果多行之间关系密切,则这些行的注释最好也能对齐;对于行后注释较长的,必须将注释折行并对齐。
/************************************* * 函数名称: * 函数功能: * 输入参数: * 输出参数: * 返 回 值: *************************************/ void function1(…) { … } |
Struct A{ Int m1; // 成员1 Char m2; // 成员2,用于… // 的处理 Double m3; // 成员3 }; |
【规则5-3】注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人眼花缭乱。注释的花样要少。
【规则5-4】如果代码本来就是清楚的,则不必加注释。否则多此一举,令人厌烦。例如:i++; // i 加1,多余的注释
【规则5-5】边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
6 长行拆分
【规则6-1】代码行最大长度宜控制在70至80个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。
【规则6-2】长表达式要在低优先级操作符处拆分成新行,操作符放在新行之首(以便突出操作符)。拆分出的新行要进行适当的缩进,使排版整齐,语句可读。
From:http://student.csdn.net/space.php?uid=32810&do=thread&id=455
三.匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。
举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易从变量名看出Switchboard是一个表单,同样,如果此变量类型为标签,那么就应命名成 lblSwitchboard。可以看出,匈牙利命名法非常便于记忆,而且使变量名非常清晰易懂,这样,增强了代码的可读性,方便各程序员之间相互交流代码。
想了解更多请查看http://baike.baidu.com/view/419474.htm?fr=ala0_1
四.骆驼命名法
骆驼式命令法,正如它的名称所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。例如,下面是分别用骆驼式命名法和下划线法命名的同一个函数:
printEmployeePaychecks();
print_employee_paychecks();
第一个函数名使用了骆驼式命名法——函数名中的每一个逻辑断点都有一个大写字母来标记;第二个函数名使用了下划线法----函数名中的每一个逻辑断点都有一个下划线来标记。
骆驼式命名法近年来越来越流行了,在许多新的函数库和Microsoft Windows这样的环境中,它使用得当相多。另一方面,下划线法是c出现后开始流行起来的,在许多旧的程序和UNIX这样的环境中,它的使用非常普遍
个人感觉这两种命名法都比较好,但是更倾向于骆驼命名法。
以上内容蓝色部分由本人书写,其他来源于网络。