C语言面试问答题

上传人:工**** 文档编号:486725788 上传时间:2023-11-13 格式:DOCX 页数:25 大小:394.83KB
返回 下载 相关 举报
C语言面试问答题_第1页
第1页 / 共25页
C语言面试问答题_第2页
第2页 / 共25页
C语言面试问答题_第3页
第3页 / 共25页
C语言面试问答题_第4页
第4页 / 共25页
C语言面试问答题_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言面试问答题》由会员分享,可在线阅读,更多相关《C语言面试问答题(25页珍藏版)》请在金锄头文库上搜索。

1、-标准化文件发布号:(9556 ? EUATWK ? MWUB-WUNN ? INNUL-DDQTY-KII注意:该文档由本人从网络和面试经历中总结而得,不保证答案完 全正确,如发现问题联系我: 1. 头文件中的 ifndef/define/endif 干什么用?预处理答: 防止头文件被重复引用2. #include 和 #include filename.h 有什么区别 ?答: 对于 include 编译器从标准库开始搜索 filename.h ; 对于 # include ufilename.h 编译器从用户工作路径开始搜索 filename.h,iS 有搜索到 再到标准 库搜索 file

2、name.h 3. 头文件的作用是什么?答:(1) .通过头文件来调用库功能。在很多场合,源代码不便(或不准 ) 向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文 件中的接口 声 明来 调用库功能, 而 不必关心接口怎么实现的。编译器会从库中 提取相应的代码。?头文件能加强类型安全检查。如果莫个接口被实现或被使用时,其方式 与头 文件中的 声明不 一致,编译器就会指出错误,这一简单的规则能大大减轻 程序员调 试、改错的负担。4. switch() 中不允许的数据类型是?答: 实型5. 简述数组与指针的区别答: 数组要么在静态存储区被创建 (如全局数组),要么在栈上被创建。指

3、针可以随时指向任意类型的内存块。6. 分别给出 BOOL, int, float, 指针变量与零值比较的讦语句(假设变量名为 var)答:BOOL 型变量 :if(!var)int 型变量 : if(var=O)float 型变量: const float EPSINON= 0.00001;讦(x = ? EPSINON) & (x = EPSINON)指针变量: 讦 (var=NULL)剖析:考查对 0 值判断的“内 功, BOOL 型变量的 0 判断完全可以写成if(var=0), 而int 型变量也可以写成if(!var), 指针变 量的判 断也可以写成if(!var), 上述写法 虽然

4、程序都能正确运行,但是未能清晰地表达程序的意思。一般的,如果想让讦判断一个变量的“真假化 应直 接使用 if(var). if(!var), 表明其为 逻辑判断;如果用讦判断一 个数值型变量 (short 、 int 、 long 等), 应该用 if(var=O), 表明是与 0 进行数值上的比较;而判断指针则适宜用 jf(var=NULL), 这是一种很好的编程习惯。浮点型变量并不精确,所以不可将float 变量用或 ! / 与数字比较,应该设法转化成或形式。如果写成if(x=O.O), 则判为错,得0 分。7. 写一个标准宏 MIN,这个宏输入两个参数并返回较小的一个。另外,当你 金丁下

5、而的代码时会发生什么事? least = MIN(*p+ ? b);#define MIN(A,B) (A)= (B) (A) : (B)MIN(*p+ z b)会产生宏的副作用剖析:这个 面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于 函数的功能,但是它终归不是函数,而宏定义中括弧中的参数也不 是 真的参 数,在宏展开的时候对参数进行的是一对一的替换。程序员对宏定义的使用要非常小心, 特别要注意两个问题:(1) 谨慎地将宏定义中的参数 和 整个宏用用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B) (A)= (B) (A) : (B)#define MIN(A

6、,B) (A = BA: 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 分并被面试官淘汰。& 为什么标准头文件都有类似以下的结构#ifndef _INCvxWorksh#define _

7、INCvxWorksh#ifdef_cplusplusextern ll Cl #end 讦#ifdef_cplusplus#end 讦#endif/* INCvxWorksh */答:头文件中的编译宏#ifndef _INCvxWorksh #define _ INCvxWorksh#endif 的丽是防止被重复引用。作为一种面向对象的语言, C+ 支 持函数重载,而过程式语言 C 则不支持。 函 数被 C+ 编译后在 symbol 库中的名字与C 语言的不同。例如,假设某个函数 的原型为:void foo ( int x, int y ) ;该函数被 C 编译器编译后在 symbol 库中

8、的名 字为 00,而 C+ 编译器则会产生像_砧。所讨之类的名字。JooJnt.int这样的名字包含了函数名和函数参数数M衣类切信息,C+就是考这种板制乘实现函数重载的。为了实现 C 和 C+ 的混合编程, C+ 提供了 C 连接交换指定符号extern 七来解决名字匹配问题,函数声明前加上 extern U 后,则编译器就会按照 C 语言的方式将该函数编译为_foo,这样C语言中就可以调用 C+的函数了。9?请说出static和const 关键字尽可能多的作用答:static 关键字至少有下列 n 个作用:( 1 ) 函数体内 static 变 量的作用范用为该函数体,不同于 auto 变量

9、,该变 量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;( 2 ) 在模块内的 static 全局变量可 以被模块内所用函数访问, 但不 能被模 块外其它函数访问;( 3 ) 在模块内的 static 函数只 可被这一模块内的其它函数调用, 这个函数 的使用范圉被限制在声明它的模块内;( 4 )在类中的static 成 员变量属于整个类所拥有,对类的所有对象只有一份拷贝;( 5 )在类中的static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的 static 成员变量。const 关键字至少有下列 n 个作用:( 1 ) 欲阻止一个 变量被 改变,可以

10、使用 const 关键字。在定义该 const 变 量 时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;( 2 ) 对指针 来说,可以指定指针本身为 const, 也可以指定指针所指的数据为 const, 或二者同时指定为 const ;( 3 ) 在一个函数声明中 const 可以修饰 形参, 表明它是一个输入参数,在函 数 内部不能改变其值;( 4 ) 对于类 的成员函数, 若指定其为 const 类型则表明其是一个常函数,不 能 修改类的成员变量;( 5 ) 对于类的成员函数,有时候必须指 定其返回值为 const 类型, 以使得其 返 回值不为 左值例如: const cl

11、assA operator* ( const classA & al,const classA & a2 ) ;operator*的 返回结果必须是一个const 对象。如果不是, 这 样的变态代码也不会编译 出错: classA a, b, c;(a * b) = c; 对 a*b 的结果赋值操作 (a *b) = c 显然不符合编程者的初衷,也没有任何意义。剖析:惊讶吗小小的 static 和 const 居然有这么多功能,我们能回答儿个如果只能 回答 2 个,那还真得闭关再好好修炼修炼。这个题可以考查面试者对程序设计知识的掌握程度是初级、中级还是比较深入,没有一定的知识广度和深度,不可能

12、对这个问题给出全面的解答。大多 数人只能回答出 static 和 const 关键字的部分功能。10. const 的用法,以及声明 const 变量与宏的区别;答: const 的 用法有四种:1. const 常量, 如 const int max = 100 :2. const 修饰类的数据成员;3. const 修饰 指针的情况;4?在一个函数声明中, const 可以修饰函数的返回值,或某个参数;对于成员函 数, 还可 以修饰是整个 函数。区别:l.const 常量 有数据类型,而宏 常量没 有数据类型;2 ?编译器可以对前者进行类型安全检查,而对后者只能进行字符替换,没有类 型安

13、全检查,而且字符替换可能会带来料想不到的边界效应;3 .有些集成化工具可以对const 常量进行调试, 但不 能对宏量进行调试。C+ 中弓 I 用与指针的区另 ij.答: 1 引用 实际上是所引加 的对 象或变量的 别名, 而指针是包含所指向对象或变量的 地址的 变量。2 引用在 定义时必须初 始化, 而指针在定义时不初始化。3 不可以有努NULL 的 引用, 而可以 有指向 NULL 的 指针。4 引用 在初始化后不可以改 变引用 关系, 而 指针可以随时指向其他对象(非const 指针 ) 。12. 函数 assert 的用法?答: 断言 assert 是仅在 debug 版本 起作用 的

14、宏, 用于 检查 不应该发生的 情 况。 程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害 测试 手段。13. 为什么数组名作为参数,会改变数组的内容,而其它类型如 int 却不会改 变变量 的值?答:当数组名作为参数时 ,传 递的实际上是 地址。而其他类型如 int 作为参 数时, 山于函数 参数值实质上是实参的一份拷贝, 被调函 数内部对形参的改变并不影响实参的值。14. 下列哪两个是等同的int b;A const int* a = &b;B const* int a = &b;C const int* const a = &b;D int const* const a = &b;各式表示的意思分别为:答:A const int* a= &b; /*a 是 const, 但指针 a 可变B const* int a= &b; /a 是 const? 但穴a 可变c const int* const a = &b; a 和*玄都是 const, 常量和指针的值都不能改变D intconst* const a = &b; a和都是const,常M和指针的值都不能改变 因此C, D两 者

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 营销创新

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号