找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

作者:寒小阳
时间:2013年8月。
出处:http://blog.****.net/han_xiaoyang/article/details/10473845
声明:版权所有,转载请注明出处,谢谢。


前言

眼看着又要到一年一度的找工作季了,遥想去年这会儿,学校同学们也都是一副要上战场似得枕戈待旦整装待发的情景。想来自己当时笔试面试也确实参加了不少,无奈技术和智商平平,最后结果一般,但也确实经历了不少,外加一直有总结和整理资料的小习惯,手头上确实攒下了一些笔试面试的资源。又最近频繁有师弟师妹问我要相关的资料,想来还不如自己整理整理发到博客里,大家都能看看,希望能有一些帮助吧。

第一部分C/C++编程基础

这部分内容大部分来自林锐博士01年写的高质量C++/C编程指南,距今已经十多年了,但是我依旧清晰地记得师兄当初介绍这本几十页的书给我,看后的惊艳,确切的说来,这本书让我的编程风格编程习惯以及对C++/C的认识有了大的提升(这个说来尴尬了,本人属于木有任何天赋的程序员,和大牛们差几百个档,之前写的程序只能用惨不忍睹来形容,即使现在可能也只属于勉强能看)。直至后来参加大大小小的笔试面试,发现里面考察略深一点点的C++/C基础知识在书里面都能看到;而后来参加某互联网公司面试,当场写算法程序时,被面试官夸过编程习惯和编程风格非常好(介个,其实也有可能是刚好对上面试官胃口罢了...),我再一次意识到,这份资料确实是不错的,所以这里打算整理整理,发到博客上共享一下,已经看过和熟知的童鞋或者大牛们自行绕开吧。

今天写的这部分,大体上都是关于编程风格和编程习惯的,C/C++基础和注意点下次再说吧。

正题

一、文件结构

1.1版权版本声明

我看过一些写的比较详细正统的头文件和定义文件的开头都有这部分。具体包括以下内容:

1)版权信息。

2)文件名称,标识符,摘要。

3)当前版本号,作者/修改者,完成日期。

4)版本历史信息。

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

1.2关于头文件

1)为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。

2)用#include<filename.h>格式来引用标准库的头文件,用#include“filename.h”格式来引用非标准库的头文件。

3)头文件中只存放“声明”而不存放“定义”。

示例:

#ifndefGRAPHICS_H//防止graphics.h被重复引用

#defineGRAPHICS_H

#include<math.h>//引用标准库的头文件

#include“myheader.h”//引用非标准库的头文件

voidFunction1(…);//全局函数声明

classBox//类结构声明

{

};

#endif

1.3头文件作用

1)通过头文件来调用库功能。

2)头文件能加强类型安全检查。

二、程序的板式

2.1空行

建议:

1)在每个类声明之后、每个函数定义结束之后都要加空行。

2)在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。

实力如下图左右所示:

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

2.2代码行

建议:

1)一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。

2)if、for、while、do等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。

例下图中左侧为风格良好的代码,右侧为风格糟糕的代码。

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

3)尽可能在定义变量的同时初始化该变量,以减少安全隐患。

2.3代码行内的空格

1)关键字(const、virtual、inline、case、if、for、while)之后要留空格。而函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。

2)‘(’向后紧跟,不留空格;‘)’、‘,’、‘;’向前紧跟,不留空格。‘,’、‘;’后接空格。

3)二元操作符(“=”、“+=”“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”)前后应当加空格。一元操作符(“!”、“~”、“++”、“--”、“&”)前后不加空格。

4)对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))

示例如下:

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

2.4对齐

1)程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。

2){}之内的代码块在‘{’右边数格处左对齐。

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

2.5修饰符的位置

这里的修饰符主要指*和&,事实上关于它们应该靠近数据类型还是变量名,一直都有争议。将修饰符*靠近数据类型,例如:int*x;比较直观,但同时在某些情况下也容易引起误解(例int*x,y中的y容易被误解为指针变量)。所以这里:

建议大家在写程序时将修饰符*和&紧靠变量名。

所以:

int*x,y;//此处y不会被误解为指针

2.6注释

C语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释的主要作用是:

1)版本、版权声明;

2)函数接口说明;

3)重要的代码行或段落提示

一个示例如下图所示:

找工作笔试面试那些事儿(1)---C,C++基础和编程风格(1)

三、命名规则

关于变量和函数等的命名,程序员会有自己的认识和习惯,没有一种命名规则可以让所有的程序员赞同,重要的是要保持一致的风格。这个地方,比较著名的一种写法是Microsoft公司的“匈牙利”法。

主要命名规则总结如下:

1)类名和函数名用大写字母开头的单词组合而成。

例如:

classNode;//类名

classLeafNode;//类名

voidDraw(void);//函数名

voidSetValue(intvalue);//函数名

2)变量和参数用小写字母开头的单词组合而成。

例如:

BOOLflag;

intdrawMode;

3)常量全用大写的字母,用下划线分割单词。

例如:

constintMAX=100;

constintMAX_LENGTH=100;

4)静态变量加前缀s_(表示static)。

例如:

voidInit(…)

{

staticints_initValue;//静态变量

}

5)如果不得已需要全局变量,则使全局变量加前缀g_(表示global)。

例如:

intg_howManyPeople;//全局变量

intg_howMuchMoney;//全局变量

6)类的数据成员加前缀m_(表示member),这样可以避免数据成员与成员函数的参数同名。

例如:

voidObject::SetValue(intwidth,intheight)

{

m_width=width;

m_height=height;

}

有以下共同规则:

1.标识符应当直观且可以拼读,可望文知意,不必进行“解码”。用词要恰当,莫把CurrentValue写成NowValue。

2.标识符的长度应当符合“min-length&&max-information”原则。即最短的程度表达最多的信息。

3.命名规则尽量与所采用的操作系统或开发工具的风格保持一致。例如Windows中用AddChild。而Unix中用add_child。

4.程序中不要出现仅靠大小写区分的相似的标识符。例intx,X;voidfoo(intx)和voidFOO(floatx)是不好的命名方式。

5.变量的名字应当使用“名词”或者“形容词+名词”。例floatoldValue;和floatnewValue;

6.全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。例DrawBox();box->Draw();

7.用正确的反义词组命名具有互斥意义的变量或相作的函数等。例 intminValue;intmaxValue;intSetValue(…);intGetValue(…);