10面试一面必备:c语言经典面试题

上传人:luoxia****01802 文档编号:47807121 上传时间:2018-07-05 格式:PDF 页数:9 大小:168.50KB
返回 下载 相关 举报
10面试一面必备:c语言经典面试题_第1页
第1页 / 共9页
10面试一面必备:c语言经典面试题_第2页
第2页 / 共9页
10面试一面必备:c语言经典面试题_第3页
第3页 / 共9页
10面试一面必备:c语言经典面试题_第4页
第4页 / 共9页
10面试一面必备:c语言经典面试题_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《10面试一面必备:c语言经典面试题》由会员分享,可在线阅读,更多相关《10面试一面必备:c语言经典面试题(9页珍藏版)》请在金锄头文库上搜索。

1、1 . 用预处理指令#define 声明一个常数,用以表明 1 年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: ; #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) ; 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的。 ; 意识到这个表达式将使一个 16 位机的整型数溢出因此要用到长整型符号 L,告诉 编 译器这个常数是的长整型数。 ; 如果你在你的表达式中用到 UL(表示无符号长整型) ,那么

2、你有了一个好的起点 。记住,第一印象很重要。 2 . 写一个“标准”宏 MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ( (A) 6) ? puts(“ 6“) : puts(“6” 。原因是当表达式中存在有符号 类型和无符号类型时所有的操作数都自动转换为无符号类型。 因此20 变成了一个非常大 的 正整数,所以该表达式计算出的结果大于 6。这一点对于应当频繁用到无符号数据类型的嵌 入式系统来说是丰常重要的。如果你答错了这个问题,你也就到了得不到这份工作的边缘。 13. 评价下面的代码片断: unsigned int zero = 0; unsigned i

3、nt compzero = 0xFFFF; /*1s complement of zero */ 对于一个 int 型不是 16 位的处理器为说,上面的代码是不正确的。应编写如下: unsigned int compzero = 0; 这一问题真正能揭露出应试者是否懂得处理器字长的重要性。 在我的经验里, 好的嵌入式程 序员非常准确地明白硬件的细节和它的局限,然而 PC 机程序往往把硬件作为一个无法避免 的 烦恼。 到了这个阶段, 应试者或者完全垂头丧气了或者信心满满志在必得。 如果显然应试者不是很 好,那么这个测试就在这里结束了。但如果显然应试者做得不错,那么我就扔出下面的追加 问题,这些问

4、题是比较难的,我想仅仅非常优秀的应试者能做得不错。提出这些问题,我希 望更多看到应试者应付问题的方法,而不是答案。不管如何,你就当是这个娱乐吧 动态内存分配(Dynamic memory allocation) 14. 尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的 过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么? 这里,我期望应试者能提到内存碎片,碎片收集的问题,变量的持行时间等等。这个主题已 经在 ESP 杂志中被广泛地讨论过了(主要是 P.J. Plauger, 他的解释远远超过我这里能提到 的任何解释) ,所有回过头看一下这些杂志吧!让应试

5、者进入一种虚假的安全感觉后,我拿 出这么一个小节目: 下面的代码片段的输出是什么,为什么? char *ptr; if (ptr = (char *)malloc(0) = NULL) else puts(“Got a null pointer“); puts(“Got a valid pointer“); 这是一个有趣的问题。最近在我的一个同事不经意把 0 值传给了函数 malloc,得到了一个合 法的指针之后,我才想到这个问题。这就是上面的代码,该代码的输出是“Got a valid po inter” 。我用这个来开始讨论这样的一问题,看看被面试者是否想到库例程这样做是正确 。得到正确的

6、答案固然重要,但解决问题的方法和你做决定的基本原理更重要些。 Typedef : 15 Typedef 在 C 语言中频繁用以声明一个已经存在的数据类型的同义字。 也可以用预处理器 做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 以上两种情况的意图都是要定义 dPS 和 tPS 作为一个指向结构 s 指针。哪种方法更好呢? ( 如果有的话)为什么? 这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。答案是: typedef 更好。思考下面的例子: dPS p1,p2; tPS p3,p4

7、; 第一个扩展为 struct s * p1, p2; . 上面的代码定义 p1 为一个指向结构的指,p2 为一个实际的结构,这也许不是你想要的。第 二 个例子正确地定义了 p3 和 p4 两个指针。 晦涩的语法 16 . C 语言同意一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b; 这个问题将做为这个测验的一个愉快的结尾。 不管你相不相信, 上面的例子是完全合乎语法 的。 问题是编译器如何处理它?水平不高的编译作者实际上会争论这个问题, 根据最处理原 则,编译器应当能处理尽可能所有合法的用法。因此,上面的代码被处理成: c = a+ + b; 因此, 这段代码持行后 a = 6, b = 7, c = 12。 如果你知道答案,或猜出正确答案,做得好。如果你不知道答案,我也不把这个当作问题。 我发现这个问题的最大好处是这是一个关于代码编写风格, 代码的可读性, 代码的可修改性 的好的话题.

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

当前位置:首页 > 资格认证/考试 > 计算机等级考试

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