【计算机类职业资格】程序员面试-5及答案解析.doc
《【计算机类职业资格】程序员面试-5及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员面试-5及答案解析.doc(25页珍藏版)》请在麦多课文档分享上搜索。
1、程序员面试-5 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.C+中的多态种类有哪几种 (分数:3.00)_2.什么函数不能声明为虚函数 (分数:3.00)_3.是否可以把每个函数都声明为虚函数 (分数:3.00)_4.C+中如何阻止一个类被实例化 (分数:3.00)_5.当 while()的循环条件是赋值语句时会出现什么情况 (分数:3.00)_6.不使用 if/:?/switch 及其他判断语句如何找出两个 int 型变量中的最大值和最小值 (分数:3.00)_7.C 语言获取文件大小的函数是什么 (分数:3.00)_8.表达式 a
2、bc 是什么意思 (分数:3.00)_9.如何打印自身代码 (分数:3.00)_10.如何实现一个最简单病毒 (分数:3.00)_11.如何只使用一条语句实现 x 是否为 2 的若干次幂的判断 (分数:3.00)_12.如何定义一对相互引用的结构 (分数:3.00)_13.什么是逗号表达式 (分数:4.00)_14./n 是否与/n/r 等价 (分数:4.00)_15.什么是短路求值 (分数:4.00)_16.已知随机数函数 rand7(),如何构造 rand10()函数 (分数:4.00)_17.printf(“%p/n“,(void*)x)与 printf(“%p/n“, class Ba
3、se public: Base() f(); virtual void f() cout“base“endl; ; class Derived:public Base public: Derived(); void f() cout“Derived“endl; ; int main() Base*p=new Derived; p-f(); return 0; 程序输出结果: base Derived base Derived 上例中,Base*p=new Derived,基类的指针生成了一个派生类对象,将会隐式调用 base 的构造函数,尽管对象是 Derived,但构造基类部分时,还只是个
4、Base,所以会调用基类的虚函数 f()。 析构函数可以是虚函数,而且有的时候是必需的,基类指针指向派生类,用基类指针 delete 时,如果不定义成虚函数,派生类中派生的那部分无法析构。 析构函数执行时先调用派生类的析构函数,然后才调用基类的析构函数。如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用 delete 销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数。这样会造成销毁对象不完全。程序示例如下: #ineludeiostream using namespace std; class CPerson public: virtual CPer
5、son(); protected: char * m_lpszName; char * m_lpszSex; ; class CStudent:public CPerson public: CStudent(); protected: int m_iNumjber; ; CPerson:CPerson() cout“CPerson!“endl; CStudent:CStudent() cout“CStudent!“endl; int main() CPerson * poCPerson=new CStudent; if(NULL=poCPerson) exit(0); delete poCPe
6、rson; cout“CStudent 对象已经完成析构“endl; CStudent oCSmdent; return 0; 程序输出结果: CStudent! CPerson! CStudent 对象已经完成析构 CStudent! CPerson!3.是否可以把每个函数都声明为虚函数 (分数:3.00)_正确答案:()解析:虽然虚函数很有效,但是不可以把每个函数都声明为虚函数。因为使用虚函数是要付出代价的。由于每个虚函数的对象在内存中都必须维护一个虚函数表,因此在使用虚函数时,尽管带来了使用的方便,却会额外产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么根本没有必要使用虚函
7、数。4.C+中如何阻止一个类被实例化 (分数:3.00)_正确答案:()解析:C+中可以通过使用抽象类,或者将构造函数声明为 private 阻止一个类被实例化。抽象类之所以不能被实例化,是因为抽象类不能代表一类具体的事物,它是对多种具有相似性的具体事物的共同特征的一种抽象。例如,声明一个抽象类车,但是却不能用这个类来创造某个具体的事物来,只能派生一个汽车,才可以产生出来。 引申: 1)一般在什么时候将构造函数声明为 private? 例如,要阻止编译器生成默认的复制构造函数的时候。 2)什么时候编译器会生成默认的复制构造函数? 只要自己没写,而程序需要,都会生成。 3)如果已经写了一个构造函
8、数,编译器还会生成复制构造函数吗? 会。5.当 while()的循环条件是赋值语句时会出现什么情况 (分数:3.00)_正确答案:()解析:在 while()的循环条件里面定义一个变量并赋值为 0,程序代码如下: while(int i=0) print if(“%d/n“,i); i-; 以上代码不执行任何动作,相当于执行了 while(0)操作,循环结束,while 循环体不执行。而在 while 的循环条件里面定义一个变量并赋值为非 0 时,相当于执行了 while(1),程序进入无限循环。 while(int i=1) printf(“%d/n“,i); i-; 需要注意的是,上述代码
9、之所以不停地输出为 1,而不是执行 i-,是因为在 while 循环条件里,重新定义了一个局部变量 i,对其进行了重新赋值,所以 i 的初始值一直为 1,而不是自减。6.不使用 if/:?/switch 及其他判断语句如何找出两个 int 型变量中的最大值和最小值 (分数:3.00)_正确答案:()解析:寻找两个变量中的较大值,一般可以用判断型语句进行比较,如 if(ab),按照题目中的要求,不能采用判断语句,所以可以利用绝对值的方法或是移位的方法。 方法一: int max=(a+b)+abs(a-b)/2 如果 ab,则 max=a;如果 ab,则 max=b。 int min=(a+b)
10、-abs(a-b)/2 如果 ab,则 min=b;如果 ab,则 min=a。 上例中,abs 是 C 语言中的用于求绝对值的函数,C 语言中还有一个类似的函数,函数名为 fabs。 方法二:对变量的差值进行移位操作,通过其是否为非 0 值确定两个变量的大小。 #includestdio.h int main() int a=1,b=4; int c=a-b; int MAX=(unsigned)c(sizeof(int)*8-1); if(!MAX) printf(“%d/n“,a); else printf(“%d/n“,b); return(0) 程序的输出结果: 4 方法三:通过移位
11、操作来判断。程序示例如下: void compare(int a,int b) static char* op=“=“,“,“; int i=(unsigned(a-b)31)+(unsigned(b-a)31)*2; printf(“%d%s%d/n“,a,opi,b); 上例中,满足: 1)如果 ab,那么(unsigned(a-b)31)=0,(unsigned(b-a)31)*2=2。 2)如果 a=b,那么(unsigned(a-b)31)=0,(unsigned(b-a)31)*2=0。 3)如果 ab,那么(unsigned(a-b)31)=1,(unsigned(b-a)31)
12、*2=0。 方法四:通过加减运算与移位运算结合的方式实现。 void compare3(int a,int b) int min=a+(b-a)31) int max=a-(a-b)31) coutminendl; coutmaxendl; 注意:正数的补码和原码相同。负数的补码是正数的补码按位取反,末位加 1。7.C 语言获取文件大小的函数是什么 (分数:3.00)_正确答案:()解析:某些标识符是预定义的,扩展后将生成特定的信息,它们同预处理器表达式运算符#define 一样,不能取消定义或重新定义。预定义标识符见下表。 预定义标识符 函数描述_FILE_ 包含当前程序文件名的字符串,包含
13、了详细路径,如G:/program/study/c+/test1.c _LINE_ 包含当前源文件行数的十进制常量_包含DATE_ 编译日期的字符串字面值_STDC_ 如果编译器遵循ANSI C标准,它就是个非零值_TIME_ 包含编译时间的字符串字面值_FUNC_(在有些编译系统中为_FUNCTION_) 当前所在函数名,在编译器的较高版本中支持其中,标识符_LINE_和_FILE_通常用来调试程序,标识符_DATE_和_TIME_通常用来在边以后的程序中加入一个时间标志,以区分程序的不同版本。当要求程序严格遵循 ANSIC 标准时,标识符_sTDC_就会被赋值为 1。8.表达式 abc 是
14、什么意思 (分数:3.00)_正确答案:()解析:在弄清这个问题前,先看如下代码: #includestdio.h int main() int a=5,b=4,c=3; printf(“%d/n“,abc); return 0; 程序输出结果: 0 在上例中,abc 到底是如何执行的呢?对于这种连续运算,根据优先级,首先进行 ab 的比较判断,本例中 ab 为真,所以返回值为 1,接着比较该返回值与 c 的大小。因为 c 的值为 3,1c 表达式为假,所以返回值为 0。最终的输出为 0。 对于赋值运算符,结果又如何呢?以如下程序为例。 #includestdio.h int main() i
15、nt b,c; int a=(b=(c=020) printf(“%d%d%d/n“,a,b,c); return 0; 程序输出结果: 0 0 16 在赋值语句中,c=020,因为以 0 开头的数字一般表示的都是八进制的数值,所以折合成十进制的数为16。根据优先级关系,b 的值为(c=020)%c printf(p,10,10,10,34,p,34,10,10,10);%c return 0;%c“; printf(p,10,10,10,34,p,34,10,10,10); return 0; 上面代码的实现需要注意以下几个方面的内容: 1)写好一个程序。 2)定义一个字符串 str 把原来
16、的代码抄进去;不能显示的字符和特殊字符都用%c 替换,如换行、引号等。用一个输出语句 printf 打印 str。注意这里,格式控制时,10 表示换行,34 表示”,92 表示/,110 表示 n,9 表示/t。10.如何实现一个最简单病毒 (分数:3.00)_正确答案:()解析:可以把最简单的病毒理解为一个无限运行的恶意程序,无限运行可以通过无限循环实现,而恶意可以通过申请内存空间来实现,所以可以用如下代码来实现一个最简单的病毒。 while(1) int *p=new int 10000000; 该代码首先新建一个无限循环,然后在循环内执行一个内存申请操作,最终系统内存会被该程序占用完,导
17、致系统出现宕机的情况。 引申:嵌入式系统中经常要用到无限循环,怎样用 C 语言编写无限循环? 有多种执行无限循环的方式,第一种是使用 while,将 while 条件置为 1,具体使用方式如下: while(1) 除了使用 while 以外,也可以使用 for 循环,for 语句为空,因为没有循环区间,没有循环条件,也没有条件语句,所以能够执行无限循环。具体使用方式如下: for(;) 使用 for 循环的上述方式表示无限循环时,也可以将循环条件设置为 1。方式如下: for(;1;) 除了以上两种方法以外,还有一种不推荐使用的方法使用 goto 语句,程序示例如下: Loop: . goto
18、 Loop; goto 语句一般不推荐使用,但是在必要的嵌入式环境下也不失为一种不错的解决方案。11.如何只使用一条语句实现 x 是否为 2 的若干次幂的判断 (分数:3.00)_正确答案:()解析:如果一个数是 2 的若干次幂,那么其二进制表示中最高位为 1,其他位为 0,该数减去 1 之后的数的二进制表示为全 1,所以将两数进行与操作,判断其最终结果是否为 0,可以只用一语句实现判断该数是否是 2 的若干次幂的功能。 程序示例如下: int i=512; coutboolalpha(i12.如何定义一对相互引用的结构 (分数:3.00)_正确答案:()解析:用常规的定义相互引用的结构一般容
19、易出现类似于死锁一样的问题。例如,A 引用 B 的成员,B 也引用 A 的成员,由于 C 语言需要先声明后使用,所以常规的方法会引起编译器错误。 程序示例如下: typedef struct int afield; BPER bpointer; *APTR; typedef struct int bfield; APTR apointer; *BPTR; 上例中 BPER 没有被定义就已经被使用了,所以错误,需要采取其他的方式来实现。指针就是一种不错的方式,以下方式都可以实现定义一对相互引用的结构。 struct b;此处使用结构体的不完整声明 struct a int afield; str
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 面试 答案 解析 DOC
