C语言的间隔编码------提高程序可读性
1、一行只写一条语句
- 虽然我的代码我做主,但为了他人着想,不要在一行写多条语句。
- 程序需要多人负责维护,考虑到日后的情况,应遵循“一行只写一条语句”的准则。
2、区分声明语句和执行语句–插入空行
2.1具有代表性的声明语句
int a; //变量声明语句
int a[10]; //数组声明语句
//函数、结构体、类、共用体等的声明和定义
int f(int x,inty);
class MyClass{...};
2.2具有代表性的执行语句
a=b+c; //赋值语句
if(scanf("%c",c)!=EOF) //条件语句
printf("520");
2.3二者区别
分析语句会对数据产生什么样的影响,以此区分。
只要是对数据进行操作和处理的语句,都可以视为执行语句。
如果未正确区分声明语句和执行语句,会严重影响程序可读性。
因此应严格区分声明语句和执行语句,一般在二者之间插入空行即可实现。
2.4示例
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//空格
size_t mystrlen(char c[])
{
int i=0; //声明语句
//空格
while(c[i++]); //执行语句
//空格
return i-1;
}
int main()
{
char c[10];
char d[10];
size_t len;//声明语句
//空格
scanf("%s%s",c,d);//执行语句
puts(d);
printf("strcmp result=%d\n",strcmp(c,d));//比较的时ascll码,按位,有大的立马跳出
strcat(c,d);
puts(c);
system("pause");
}
- 人们阅读的时候,代码越长,效果越明显。
- 需要注意,隔的空行太多会起反作用。隔1~2行是不错的选择。
3、区分段落
3.1作用
- "插入空行以提高可读性"的准则并不仅仅适用于声明语句和执行语句的区分。当然,声明语句之间也要学会区分,执行语句之间也要学会区分。
- 编写程序的时候,无论声明语句还是执行语句,要注意把相似的语句集中在一起。
- 有经验的程序会有意将相似功能的执行语句集中在一起,并在其前后插入空行,以便区分于其他语句。
3.2示例
#include<stdio.h> //第一段
//空格
#define TURE 1
#define FALSE 0//第二段
//空格
int main()
{
int num1;
int num2; //第三段
//空格
char c1; //第四段
char c2;
//空格
printf("请输入第一个数字。\n");
scanf("%d",&num1); //第五段
//空格
printf("请输入第二个数字。\n");
scanf("%d",&num2); //第六段
//空格
sum=num1+num2;
printf("两数之和是%d\n") //第七段
//空格
return 0; //第八端
}
- 上述程序中,按声明语句区分,如第1-四段
- 上面示例中,将执行语句划分为4段,即第五到第八段。
- 对程序有清晰认知的程序员在最初编写程序时,会用空格区分语句,从而分段,使程序更容易理解。
4、区分各种控制语句
4.1作用
- 表达统一思想的段落内部也应该插入空行,以划分更细的层次,最常见的就是针对控制语句,如if、while、for、switch语句等。即使在段落内部,也应该在控制语句前后插入空行,一边快速识别。
4.2示例
- 以空行明确区分多条控制语句,显著提高代码可读性
if(a1==b1)
printf("%d和%d相等\n"a1,b1);
if(a2==b2)
printf("%d和%d相等\n"a2,b2);
if(a3==b3)
printf("%d和%d相等\n"a3,b3);
- case之间插入空行
#include<stdio.h>
#include<stdlib.h>
//空格
int main()
{
int mon;
int year;
//空格
while(scanf("%d%d",&year,&mon)!=EOF)
{
//空格
switch(mon)
{
//上面语句是switch语句开始部分
case 1:printf("%d is %d days\n",mon,28+(year%4==0&&year%100||year%400==0));break;
//空格
case 2:printf("%d is 31 days\n",mon);break;
case 3:printf("%d is 30 days\n",mon);break;
//空格
default:printf("error mon\n");
}
//空格
}
system("pause");
}
- 实际编程中,不会有那么简单的选择,switch语句越多,效果越明显
4.3 switch语句适用的划分准则
- switch语句开始部分独占一行
- 以空行区分开case语句
- 用空格区分default语句
4.4相互重叠的多种控制结构
- 下面举个if…else语句、while语句for语句控制的例子,有助于明确各个范围
#include<stdio.h>
#include<stdlib.h>
int main()
{
int year,mon,day,total,i;
//k空格
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
//空格
while(scanf("%d%d%d",&year,&mon,&day)!=EOF)
{
total=0;
//空格
for(i=0;i<mon-1;i++)
{
total=total+a[i];
}
//空格
total=total+day;
//空格
if(mon>2)
{
total=total+(year%4==0&&year%100||year%400==0);
}
//空格
printf("%4d-%02d-%02d is %dth days\n",year,mon,day,total);
}
system("pause");
}
5、区分各函数
5.1作用
- 一个程序是由若干个函数组成,在每个函数之间插入空行,可以提高其作为模块单元的辨识度。
- 函数没有空行,难以掌握函数的起始位置和结束位置,难以了解程序是由几个函数组成,难以定位某个特定函数。
5.2示例
#include<stdio.h>
void f1()
{
...
}
//空2行
void f2()
{
...
}
//空2行
.....
//空2行
void f9()
{
...
}
//空2行
void f10()
{
...
}
//空2行
int main()
{
int a=1;
void f1();
void f2();
.....
void f9();
void f10();
return0;
}
- 考虑到各函数内部一般插一个空行,各函数之间一般插2-3个空行。
6、运算符前后需要留出空格
6.1作用
- 有些程序员误认为,源代码越长,目标代码也越长,他会就会极力避免使用空格和空行。如果运算符之间留出充足的空间,那么虽然代码长度或宽度有所增加,但可读性会大大改善。
6.2示例
for ( x = 1, y = 1, z = 1; x <= y && x <= z; x++, y--, z++ ) {
...
} //这段代码中,所以运算符之间都空出了1-2个空格
与其用:
for();
不如用:
for ();
- 在运算符前后各插入一个或多个空格,可以使前后部分更加明确。有些程序员会实现规定编码使应该在运算符前后空几格、条件表达式前后空几格等原则,这是很好的编码习惯。
- 建议大家编码时,先制定好,再编。
7、不要在一元运算符与操作数之间插入空格yiyuan
7.1一元运算符
- ++、- -这种只需要一个操作数的运算符称为一元运算符。
- . 不能在一元运算符与操作数之间插入空格,不然编译都不能通过。
7.2示例
- 错误示例:
f = a + ++ b - c - -- d + e;//更难理解了
- 我们应该把一元运算符和操作数紧贴在一起,让代码更容易理解:
f = a + ++b - c - --d + e;
- 或者加括号
f = a + (++b) - c - (--d) + e;
8、分号前不要加空格
8.1原因
- 有时,人们会在分号前插入空格,以对其各语句末尾部分。但是,给其他程序员看的话,会让他产生疑问"是不是少了标识符,还是?"
示例
- 下面这个例子,难免让人看起来产生疑问 “是不是少写了????还是???”
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int b[10] = {1,2} ;
- 因此,分号前不要加空格,语句结束立马加分号。
9、不要滥用Tap键
9.1why?
- . 一般情况用space键就可以空出1~2个空格的,就不要使用Tap键了。
- . python编程中尤其明显,Tap和space有明显的划分。但在c语言中,我们用space就可以了,如果用太多Tap,反而会降低代码的可读性。
9.2举例
- 滥用,真的丑,难读
if (num1 = num2) {
num3 = num1;
num2++;
}
- 节制一下使用,好得多
if(num1 = num2) {
num3 = num1;
num2++;
}
10、逗号后必须插入一个空格
10.1作用
- 罗列函数参数时需要用逗号区分各参数
。
10.2示例
- 逗号后没有空格
- 逗号后没有空格,就不容易区分各参数,特别是变量名类似的,如下:
scanf("%d %d %d",&number1,&number2,&count,&county);
2.逗号后有空格
- 逗号后应该留1~2个空格,以便更好区分参数
scanf("%d %d %d", &number1, &number2, &count, &county);
11不要用很多空格来表示强调
11.1 c语言怎么表示强调?
- c语言中并没有特定的表示强调的方法,这就导致很多初级程序员采用左右留出大量空格的方法以强调特定部分。其实这会严重损害程序的可读性。
- 之前说过逗号后要有1~2个空格,但并不是越多越好。过多会起相反作用。
11.2 表示强调的示例
- 错误示例—使用空格
printf("总计%d, 合计%d", totalSun, netSum);
- 正确方法----添加注释来强调特定语句
//注意:明确区分totalSum与netSum的意义
//合计是指...
//总计是指....
printf("总计%d, 合计%d ", totalSun, netSum);
12、变量初始化时的列对齐
12.1对齐原则?
- 首先要根据变量的用途,对声明语句加空行。
- 对齐初始值所在列的方法很常见,但并不是全部都有助于改善可读性。如果仅仅为了遵守公司对齐初始值所在列的编码规则而机械化的对其,反而会损害代码可读性。
- 公司制定这条规则的本意是,在提高而不是损害可读性的范围内对齐列。
- 因此,正确的做法是,在不能插入过的空格的前提下,对齐初始值所在列。
12.2 示例
int main() {
int enyerYear = 2020;
int enterMonth = 11;
int exitYear = 2022;
int exitMonth = 12;
int newItemStock = 0; //5
int newItemFlow = 0; //6
long double statoNewItemStock = 0;
long double statoOldItemStock = 0;
double bankCredit = 0;
double bankDebit = 0;
......
- 可以看到,此时的5和6完全可以再往左边靠一点,但是实际却没有那样做。如果往左靠的话,那阅读这段代码的人难免会把5、6和上面4行声明变量联想在一起,他们是否有上面关联性?如果5、6的变量名和上面的类似,人们更会产生更多联想。
- 总之,初始值应该按列对齐,但也要考虑变量的含义,通过空格的多少控制不同含义的变量初始值在不同位置对齐。
13、一行只声明一个变量
13.1 连续声明又怎样?
- 一行声明多个变量,其实有很多问题
程序员写的代码:
int number1, number2, number3;
douber number4, number5, number6;
c编译器将上述代码翻译如下:
int number1, int number2, int number3;
douber number4, int number5, int number6;
number5和number6被意外声明为int型,why?
- c语言中,如果变量前面没有制定变量类型,那么会默认将变量类型指定为int型。
- 因此,一行最好只声明一个变量
13.2 倔强,就是想声明多个怎么办?
- 方法一:如果非要合并多行以声明变量,可以考虑在一行中声明多个变量并用分号隔开。
//用分号隔开各变量
int number1; int number2; int number3;
douber number4; int number5; int number6;
- 方法二:用逗号隔开各变量
//用逗号隔开各变量
int number1, int number2, int number3;
douber number4, int number5, int number6;
13.3 总结
- 虽然声明变量的方式不少,但是最规范的还是一行只声明一个变量。而且,这样的话,还可以在语句旁边添加相应的注释语句,锦上添花,哈哈哈。。。
14、小结
作为一名准程序员,我有我的个性,我自己能看懂我的代码已不能成为代码规范的准则了,他人方便阅读的代码才是好代码。点滴积累,平时多多注意,你也可以写一手好的规范代码!!!