手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

C/C 程式设计员应聘常见面试试题深入剖析(2)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
3.内功题

  试题1:分别给出BOOL,int,float,指针变量 和“零值”比较的 if 语句(假设变量名为var)

  解答:

   BOOL型变量:if(!var)

   int型变量: if(var==0)

   float型变量:

   const float EPSINON = 0.00001;

   if ((x >= - EPSINON) && (x <= EPSINON)

   指针变量:  if(var==NULL)

  剖析:

  考查对0值判断的“内功”,BOOL型变量的0判断完万能够写成if(var==0),而int型变量也能够写成if(!var),指针变量的判断也能够写成if(!var),上述写法虽然程式都能正确运行,但是未能清楚地表达程式的意思。
 一般的,假如想让if判断一个变量的“真”、“假”,应直接使用if(var)、if(!var),表明其为“逻辑”判断;假如用if判断一个数值型变量(short、int、long等),应该用if(var==0),表明是和0进行“数值”上的比较;而判断指针则适宜用if(var==NULL),这是一种很好的编程习惯。

  浮点型变量并不精确,所以不可将float变量用“==”或“!=”和数字比较,应该设法转化成“>=”或“<=”形式。假如写成if (x == 0.0),则判为错,得0分。

  试题2:以下为Windows NT下的32位C 程式,请计算sizeof的值
void Func ( char str[100] )
{
 sizeof( str ) = ?
}

void *p = malloc( 100 );
sizeof ( p ) = ?
  解答:
sizeof( str ) = 4
sizeof ( p ) = 4
  剖析:

  Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是个指针;在失去其内涵的同时,他还失去了其常量特性,能够作自增、自减等操作,能够被修改。

  数组名的本质如下:

  (1)数组名指代一种数据结构,这种数据结构就是数组;

  例如:
char str[10];
cout << sizeof(str) << endl;
  输出结果为10,str指代数据结构char[10]。

  (2)数组名能够转换为指向其指代实体的指针,而且是个指针常量,不能作自增、自减等操作,不能被修改;
char str[10];
str ; //编译出错,提示str不是左值 
  (3)数组名作为函数形参时,沦为普通指针。

  Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。

  试题3:写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。另外,当您写下面的代码时会发生什么事?
least = MIN(*p , b);
  解答:
#define MIN(A,B) ((A) <= (B) ? (A) : (B))
  MIN(*p , b)会产生宏的副作用

  剖析:

  这个面试题主要考查面试者对宏定义的使用,宏定义能够实现类似于函数的功能,但是他终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。

  程式员对宏定义的使用要很小心,特别要注意两个问题:

  (1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:
#define MIN(A,B) (A) <= (B) ? (A) : (B)
#define MIN(A,B) (A <= B ? A : B )
  都应判0分;

  (2)防止宏的副作用。

  宏定义#define MIN(A,B) ((A) <= (B) ? (A) : (B))对MIN(*p , b)的作用结果是:

((*p ) <= (b) ? (*p ) : (*p ))

  这个表达式会产生副作用,指针p会作三次 自增操作。

  除此之外,另一个应该判0分的解答是:
#define MIN(A,B) ((A) <= (B) ? (A) : (B));
  这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。

  试题4:为什么标准头文档都有类似以下的结构?
#ifndef __INCvxWorksh
#define __INCvxWorksh
#ifdef __cplusplus

extern "C" {
#endif
/*...*/
#ifdef __cplusplus
}

#endif
#endif /* __INCvxWorksh */
  解答:

  头文档中的编译宏
#ifndef __INCvxWorksh
#define __INCvxWorksh
#endif
  的作用是防止被重复引用。

  作为一种面向对象的语言,C 支持函数重载,而过程式语言C则不支持。函数被C 编译后在symbol库中的名字和C语言的不同。例如,假设某个函数的原型为:
void foo(int x, int y);
  该函数被C编译器编译后在symbol库中的名字为_foo,而C 编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C 就是考这种机制来实现函数重载的。

  为了实现C和C 的混合编程,C 提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就能够调用C 的函数了。



文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS