C语言深入分析

上传人:笛音 文档编号:31201849 上传时间:2018-02-05 格式:DOCX 页数:19 大小:36.40KB
返回 下载 相关 举报
C语言深入分析_第1页
第1页 / 共19页
C语言深入分析_第2页
第2页 / 共19页
C语言深入分析_第3页
第3页 / 共19页
C语言深入分析_第4页
第4页 / 共19页
C语言深入分析_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《C语言深入分析》由会员分享,可在线阅读,更多相关《C语言深入分析(19页珍藏版)》请在金锄头文库上搜索。

1、(3)库函数调用和系统调用简单的回答是库函数调用 是 语言或应用程序的一部分,而 系统调用是操作系统的一部分。你要确保 弄懂 trap 的含义。系统调用是 操作系统内核 发现一个 trap 或者中断之后进行的。库函数调用 系统调用在 ANSI C 编译器中, C 函数库是系统的 各个操作系统的系统调用是不同的。符合 Posix 标准的 OS,它们的系统调用是相同的吗?调用函数库的一个程序 调用系统内核服务与用户程序相联系 是操作系统的一个进入点在用户的地址空间执行 在内核的地址空间执行运行时间属于“user”时间 属于“system 时间属于过程调用,开销较小 需要切换到内核上下文环境然后在切

2、换回来,开销较大在 C 函数库 libc 中大约 300 个程序 UNIX 中 约 90 个系统调用典型调用system fprintf malloc - chdir fork write brk但是,你必须记住:许多 C 函数库中的程序是 通过系统调用来实现功能的。比如文件系统相关的操作windows 中 fopen 大概就是调用 CreateFile(4)文件描述符和文件指针系统 IO 调用有 creat(),open(),read(),write(),close(),ioctl(),接受一个文件描述符,是一个整数,用于索引开放文件的每个进程表(per-process table -of

3、-open -file)为了确保程序的可移植性应该使用标准 IO 库调用,如 fopen(0,fclose(),fputc(),fseek()等,它们绝大多数中的名字中带有一个f。这些调用都接受一个类型为 FILE 结构的指针(有时称为流指针)的参数。FILE 指针指向一个流结构,在中定义。结构的内容根据编译器的不同而有所不同,在 UNIX 中通常是 Open File 的每个进程表的一个条目。在典型情况下,它包含了流缓冲区、 所有用于提示缓冲区有多少字节是实际的文件数据的变量以及提示流状态的标志(如 ERROR 和 EOF)等所以,文件描述符 就是 Open File 中的每个进程表的一个偏

4、移量(如3) 。它用于UNIX 系统中,用于标识文件。FILE 指针保存了一个 FILE 结构的地址。FILE 结构用于表示 开放的 I/O 流(如 hex 20938).它用于 ANSI C 标准的 IO 库调用中,用于标识文件。(5)确定一个变量 unsigned 还是 signed函数的参数形式是在函数内部定义的,所以你无法用函数来实现这个目的。那么用 宏。有符号数的本质就是 对最左边的一个位取补将会改变它的符号。由于其他位与这个测试无关,所以你可以将它的所有位都取补。#define ISUNSIGNED(a) (a =0 & a = 0)ANSI C 的类型提升规则 (所有的表达式中,

5、如果是个变量,因为编译器无法判断结果是否溢出,都对类型进行提升)char short intbit(unsigned /signed)enum如果 int 能够完整的容纳原先的数据,否则将被转换为 unsigned int gcc 居然丢出这样一句话来warning: comparison is always true due to limited range of data type如果是一个类型#define ISUNSIGNED(type) (type)0 - 1) 0)上海微创笔试1上海的苏州河由于遭受多年的工业污染,一直是条臭水沟。上海市政府下了很大决心清理苏州河,你觉得需要几年能让

6、河水变清?你的依据是什么? 2找出字符串 A 中包含的字符可以进行的所有不同组合。例如:abccd 中,ab,ac ,bc,cc,abd 等都是可能的组合。 (请用 C/C+编程,不允许上机操作) 3请估算月球的体积。 4经常去的技术网站,请举例。 5对软件开发过程的理解。 6上海有多少外籍和港澳台人士?你的依据是什么?(不得引用政府和调研机构数据)7字符串 A 是由 n 个小写英文字母(a z)构成的,定义为 char An。你能用更少的空间表示这个字符串吗?请写出从 char An到你的新的储存格式的转换函数。 (请用 C/C+编程,不允许上机操作) 8哈希表和数组的定义,区别,优缺点。

7、9用递归实现菲波列数列。 10用 dhtml 写页面。一些 software 必定会被问到的问题,供大家参考(这些问题很多都非常基础,出现在华为、中兴、intel、上海群硕、深圳正阳、腾讯、惠普、微软等公司,如果栽在这上面谁都不会甘心):C+部分:1、排序。这种题目几乎是必问的,一般是问你排序有几种,各种排序的比较啊等等。还有哪些排序是稳定的等,这些还是要记住的。末了,必定会问你快排的算法呵呵,狠一些的就让你写出来。 (至于堆排序桶排序啊什么的,倒是从来没有听说有人被问过我们觉得这么麻烦的算法面试官自己估计也不会记得呵呵)2、查找。哈希、二叉树、折半等对比。哈希映射和哈希表的区别。3、链表和数

8、组的区别。在什么情况下用链表什么情况下用数组。4、栈和队列的区别。5、多态。overload 和 override 的区别。6、字符串有关的函数。比如让你写一个拷贝字符串的函数啊,或者字符串反转啊什么的。strcpy 和 memcpy。7、继承、多继承。8、面向对象有什么好处9、说说 static 的与众不同之处。如果一个变量被声明为 static,它会被分配在哪里。在什么时候分配空间等。10、软件开发的几个过程。如果说到测试,一定会问测试分哪几种,有什么区别等。11、什么是虚函数、纯虚函数、虚的析构函数,用途。12、还没想起来,欢迎大家补充网络部分:1、 OSI 模型 7 层结构。TCP/I

9、P 模型结构2、 TCP/UDP 区别3、建立连接的步骤1: CObject 类中的析构函数为什么是虚函数 ZZ 面试 SE 时,很多公司喜欢问到虚函数相关。宝宝有一次被问到, CObject 类中的析构函数为什么是虚函数,不懂。后来上网查到了答案,特贴上来与大家分享MFC 类库中,CObject 类的重要性不言自明的。在 CObject 的定义中,我们 看到一个有趣的现象,即 CObject 的析构函数是虚拟的。 在 AFX.H 中, CObject 的定义: class CObject public: / Object model (types, destruction, allocati

10、on) virtual CRuntimeClass* GetRuntimeClass() const; virtual CObject(); /virtual destructors are necessary . . ; 为什么 MFC 的编写者认为 virtual destructors are necessary (虚拟的析构函数是必要的)?在著名的 VC 教程 精通 Visual C+ for Windows 95/NT(电子工业版, 1997 年 5 月版,胡俭,丘宗明等著)第 99 页中有这样一段话: “如果 CObject 的析构函数不是虚拟的,派生类就不会自动地得到虚拟的 析构

11、函数,当对象撤消时就会带来问题 只有当前类的析构函数得到 调用而基类的析构函数就得不到调用。.” 我认为这段解释是这本很不错的书中一个不应出现的严重错误。其意思是说: 若: class CBase public: CBase() . ; . ; class CChild : public CBase public: CChild() . ; . ; main() Child c; . return 0; 上段代码在运行时,当栈框中的自动对象 c 被撤消时,只调用CChild() , 而不调用CBase()。 我想但凡对 C+继承性理论有所了解的人都会立刻指出这是错误的。 由于在生成 CChil

12、d 对象 c 时,实际上在调用 CChild 类的构造函数之前必须首先 调用其基类 CBase 的构造函数,所以当撤消 c 时,也会在调用 CChild 类析构函数 之后,调用 CBase 类的析构函数(析构函数调用顺序与构造函数相反)。也就是说,无论析构函数是不是虚函数,派生类对象被撤消时,肯定会依次上调其基类的 析构函数。 那么为什么 CObject 类要搞一个虚的析构函数呢? 仍以上面代码为例,如果 main()中有如下代码: . CBase * pBase; CChild c; pBase = . 那么在、当 pBase 指针被撤消时,调用的是 CBase 的析构函数还是 CChild

13、 的呢? 显然是 CBase 的( 静态联编)。但如果把 CBase 类的析构函数改成 virtual 型,当 pBase指针被撤消时,就会先调用 CChild 类构造函数,再调用 CBase 类构造函数。在这个例子里,所有对象都存在于栈框中,当离开其所处的作用域时,该对象 会被自动撤消,似乎看不出什么大问题。但是试想,如果 CChild 类的的构造函数在堆中分配了内存,而其析构函数又不是 virtual 型的,那么撤消 pBase 时,将不会 调用 CChild:CChild(), 从而不会释放 CChild:CChild()占据的内存,造成内存泄露。 而将 CObject 的析构函数设为

14、virtual 型,则所有 CObject 类的派生类的析构函数都将 自动变为 virtual 型,这保证了在任何情况下,不会出现由于析构函数未被调用而导致 的内存泄露。这才是 MFC 将 CObject:CObject()设为 virtual 型的真正原因。 注意:析构函数可以为 virtual 型,构造函数则不能。面试常见问题解答 2:几种查找方式的比较 ZZ hash 表的查找性能是与装填因子(= 填充数/ 表长)成正比的;2 叉树查找则需要遍历节点,性能为 O(n);折半查找性能应该为 log(n);面试常见问题解答 4:overload 和 override 的区别重写 Overri

15、ding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded 的方法是可以改变返回值的类型。数据结构面试题目一对 n 个顶点的无向图和有向图用邻接矩阵和邻接表表示时,如何判断下列问题1)图中有多少边?2)任意两个顶点的 i 和 j 是否有变相连?3)任意一个顶点的度是多少?二有向图 G 用邻接矩阵存储,其第 i 行的所有元素之

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

当前位置:首页 > 行业资料 > 其它行业文档

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