欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

养成良好的写代码习惯

程序员文章站 2024-01-25 16:09:22
...

第一讲, 养成良好的写代码习惯

  Any fool can write code that a computer can understand. 
  Good programmers write code that humans can understand.
  傻瓜写计算机能理解的代码。优秀的程序员写人类能读懂的代码。

在写代码的时候,养成良好的代码风格,可以避免很多bug。然后,我帮你们找bug的时候,也能更快的看懂代码。emmm,,,,
或者说以后,团队一起研发项目,你写的代码也不能太任性,要让团队里面其他人能看懂。
第一讲我就先讲一下良好的代码习惯

1. 缩进格式

(1)遇到大括号就回车

例如:
for(int i=1;i<=n;i++)
{
          ...
}
或者
for(int i=1;i<=n;i++){
          ...
}
个人推荐使用第一种,第一种方式更显而易见的排查出不小心漏掉的括号。

(2)代码对齐

#include<iostream> 
using namespace std;
#include <iomanip>
#include<math.h>
int main()
{
	int a,b,c,d,p;
		double s;
	while(cin>>a>>b>>c)
	{
			p=(a+b+c)/2;
	    d=(double)p*(p-a)*(p-b)*(p-c);
       		 s=sqrt(d);
	    cout<<setiosflags(ios::fixed)<<setprecision(2)<<s<<'\n';
}
	return 0;
}
这串代码是我在oj上随便找的一题
①第10行和第15行的代码没对齐
②while里面内容,参差不齐,是很不友好的习惯

(3)if语句,for语句不管有没有多个语句,都用花括号括起来

eg.:
int main()
{
	int flag=1;
	if(flag==1)
//	{
		cout<<"Yes";
//	}
	else
//	{
		cout<"nO";
//	}
}
if语句,for语句里面只有一条语句的时候,花括号可以忽略,但是极度不推荐省略!~

2. 常数名,变量名,函数名,类名都取有意义的字眼。

(1). 常量名,全部取大写字母

例如 
#define PI 3.1415926
const double E=2.71828;
const int N=1024;

(2). 变量名,做到见名之意

名字能告诉我们它要做什么,为什么存在,以及是如何工作的。选择能够表达意图的名字,将更有利于自己或别人理解代码。
不要怕在选择名字上花时间。
例如表示时分秒,用hour,mintue,second,求和sum,平均数ave,最大值max,长度length 。。。
诸如此类,用英文单词;
求周长C,求面积S,求体积V,这类变量命名可以依照数学习惯,也可以用英文单词;
避免使用a,b,c,d,e,qq,aa,bb这种没有意义的变量名称(oj上敲题可以适当随意)

此外,有一些固定的搭配:

  • ①标记变量,使用f,flag
我觉得有必要说一下什么是标记变量。
eg.:
有一个数组a[10]={5,2,1,2,6,3,4,1,10,4},检查这个数组里面有没有4,可以这样写代码
int main()
{
  int a[10]={5,2,1,2,6,3,4,1,10,5};
  int flag=0;//在编程语言里面0是假,1是真;定义flag=0;意思等同于先假设数组里面没有4这个元素
  for(int i=0;i<10;i++) //遍历数组
  {
  	if(a[i]==4)		//如果存在一个元素等于4,
  	{
  		flag=1;		//让flag=1,
  		break;		//如果flag=1,我们已经知道数组里面有4这个元素了,就没必要再去检测后面的元素了,加个brak语句,跳出循环。
  	}
  }
  if(flag==1)			//flag=1,说明数组里面有4,输出Yes;
  {
  	cout<<"Yes";
  }
  else				//反之,如果数组里面没有4,输入No
  {
  	cout<<"No";
  }
}
这个例子中,flag起到了一个标记的作用,可以称做作标记变量。
标记变量,一般使用f或者flag命名。
  • ② 临时变量,使用t,temp
临时变量,我们把为了做一件事而临时创建的一个变量叫做临时变量,一般用作临时的中间过渡。
eg.:
把a,b的值互相交换
int main()
{
	int a=2,b=3;	//随便定义两个变量a,b
	int temp;	//定义临时变量,不用初始化

	temp=a;	//把a赋值给temp
	a=b;//把b赋值给a	
	b=temp;//把temp(其实里面是原来a的值)赋值给b
}
比如a杯子里装的苹果汁,b杯子里面装的醋,如果让苹果汁和醋交换。
我们需要拿一个c杯子,
先把a杯的苹果汁倒入c杯;
再把b杯的醋倒入a杯;
然后把c杯的苹果汁倒入a杯;

这里的c杯就和temp一样,起一个临时过渡的作用,temp我们就成为临时变量;
临时变量,一般用t,temp命名
  • ③ 计数器 id,count
 eg.:
有一个数组a[10]={5,2,1,2,6,3,4,1,10,5},检查这个数组里面有几个4int main()
{
	int a[10]={5,2,1,2,6,3,4,1,10,5};
	int count=0; //计数器count初始化等于0
	for(int i=0;i<10;i++) //遍历数组
	{
		if(a[i]==4)		//每存在一个元素等于4,
		{
			count++;	//count就加1,这里也可以写成++count	
						//有些同学可能对++count和count++有迷惑,这个我在后面解释一下	
		}
	}
	cout<<"4的个数有"<<count<<"个";
	return 0;
}
或者oj做题经常遇到的
int main()
{
	int id=1;
	while(...)
	{
		.....
		.....
		cout<<"Case "<<id++<<":"endl  //这里id++不成写成++id
	}
	return 0;
}
上面两个例题,id,count的作用就是加1,计数。我们称这样的变量为计数器。
计数器,一般用id,count命名
  • ④for语句专用的i和j
这个不用多说
for(int i=1;i<=m;i++)
{
   for(int j=1;i<=n;j++)
   {
   	....
   }
}
i和j基本上就属于for,有时候i和j不够用了,可以用k,l,q,p,h等等
想到再补充

(3) 函数名

多个单词组成时第一个单词首字母小写,其他单词首字母大写,必要时使用下划线

例:
void work()
void print()
void sum()
int getTime()
void show_English_Score()
void showScore_Student()

这些函数的用途显而易见
不要像邓国烨那样sb(),aa(),bb()这样随便的定义函数名

(4)类名

首字母大写,例如class Student;
多个单词组成时所有单词首字母大写, 如class HelloWorld;
此外在写类中的成员函数时,有两种方式:

1,写在类外面
class Student
{
	public:
	Student(...)
	{
		...
	}
	void show(...);
	private:
		int score;
		....
}
Student::show(...)
{
	....
}
2,写在类里面
class Student
{
	public:
	Student(...)
	{
		...
	}
	void show(...)
	{
		...
	}
	private:
		int score;
		....
}
当然这两个方式都可以,我个人比较倾向于第二种,
写在里面我觉得更能凸显出类是一个整体,也便于排查;

3.下面说一下i++和++i的区别

我们C语言书,第24页最下面:
++是自增运算符,i++表示先取i的值,再将i的值加1;而++i是先把i的值加1,再使用。
所以,简单的说:
i++,是先引用再自加
++i,是先自加再引用

显然,上面一句话有两个关键字:引用 和 自加
看一个例子:

int main()
{
	int id;
	id=1;
	cout<<"case "<<id++<<":"<<endl;//这个时候,id先输出出去,id再自加
									//输出的时候,就是引用
	cout<<endl;

	id=1;
	cout<<"case "<<++id<<":"<<endl;//这个时候,id先自加,然后再输出


}

运行结果:
养成良好的写代码习惯
再分步看

先看i++


int main()
{
   int i=0,y;
   for(int k=1;k<=5;k++)  //循环5次
   {
   	y=i++;			 //每次执行这一步是,i的值先赋给y,i再自加1
   	cout<<y<<" ";
   }
}

运行结果:
养成良好的写代码习惯

再看++i


int main()
{
   int i=0,y;
   for(int k=1;k<=5;k++)  //循环5次
   {
   	y=i++;			 //每次执行这一步是,i的值先自加1,再赋给y
   	cout<<y<<" ";
   }
}

运行结果:
养成良好的写代码习惯

再回到刚刚才的代码

养成良好的写代码习惯
为什么这里count++和++count没有区别,以为它这里是个计数器啊,它有引用吗,没有啊。
++count的时候,先自加,再引用?没有引用
count++的时候,先引用?有引用吗?没有。那就自加

最后,

学会几个必备词汇(滑稽):
了解=听过名字;
熟悉=知道是啥
熟练=用过;
精通=做过东西。

讲几个关于程序员的段子:

  1. 问:程序员最讨厌康熙的哪个儿子。答:胤禩。因为他是八阿哥(bug)

  2. 程序员最憋屈的事情就是:你辛辛苦苦熬夜写了一个风格优雅的源文件,被一个代码风格极差的同事改了且没署名,以至于别人都以为你是写的。

  3. C程序员看不起C++程序员, C++程序员看不起Java程序员,
    Java程序员看不起C#程序员,C#程序员看不起美工,周末了,美工带着妹子出去约会了,一群程序员还在加班!

  4. 两程序员聊天,程序员甲抱怨:“做程序员太辛苦了,我想换行……我该怎么办?”程序员乙:“敲一下回车。”

  5. 程序员最讨厌的四件事:写注释、写文档、别人不写注释、别人不写文档……

  6. 女神:你能让这个论坛的人都吵起来,我今晚就跟你走。

    程序猿:C++语言是最好的语言!

    论坛炸锅了,各种吵架。

    女神:服了你了,我们走吧,你想干啥都行。

    程序猿:你走吧,我要让他们知道,C++才是最好的语言!

贴一句我很喜欢的话:
养成良好的写代码习惯