基础面试总结

来源:互联网 发布:淘宝鼠标滑动效果代码 编辑:程序博客网 时间:2024/04/27 15:07

百度校招面试 C++开发

C++类

1.强类型语言和弱类型语言,编译型语言和解释型语言,及程序编译的具体过程描述

强类型语言:一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型。你不能把一个整形变量当成一个字符串来处理。

主要语言:Java、C#、Python、Object-C、Ruby

弱类型语言:数据类型可以被忽略,一个变量可以赋不同数据类型的值。一旦给一个整型变量a赋一个字符串值,那么a就变成字符类型。

主要语言:JavaScript、PHP、C、C++(C和C++有争议,但是确实可以给一个字符变量赋整形值,可能初衷是强类型,形态上接近弱类型)

编译型语言需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。

优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。

缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。

代表语言:C、C++、Pascal、Object-C以及最近很火的苹果新语言swift

解释型语言:解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

优点:良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。

缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。

代表语言:JavaScript、Python、Erlang、PHP、Perl、Ruby

程序编译(c程序)的具体过程:

举例:gcc来生成可执行程序,命令为:gcc hello.c,默认生成可执行文件a.out。

具体流程如下:

1.预处理(Preprocessing)

2.编译(Compilation)

3.汇编(Assembly)

4.链接(Linking)

gcc compilation

预处理主要包括以下过程:

a.将所有的#define删除,并且展开所有的宏定义

b.处理所有的条件预编译指令,比如#if #ifdef #elif #else #endif等

c.处理#include 预编译指令,将被包含的文件插入到该预编译指令的位置。

d.删除所有注释

e.添加行号和文件标识,以便编译时产生调试用的行号和编译错误警告行号

f.保留所有的#pragma编译器指令,因为编译器需要使用它们

通常使用以下命令来进行预处理:

gcc -E hello.c -o hello.i

参数-E表示只进行预处理 或者 也可以使用以下指令完成预处理过程

cpp hello.c > hello.i

直接cat hello.i 就可以看到预处理后的代码

2.编译

编译过程分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化。

编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析及优化后生成相应的汇编代码。

$gcc -S hello.i -o hello.s

编译后的汇编代码(hello.s)

3.汇编

汇编器是将汇编代码编程机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

$gcc -c hello.c -o hello.o

由于hello.o的内容为机器码,不能以普通文本形式查看

4.链接

通过调用连接器ID来链接程序运行需要的一大堆目标文件,以及所依赖的其他库文件,最后生成可执行文件,

链接分为静态链接和动态链接

静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大

动态链接是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。

静态链接过程:

static linking



2.OSI七层模型,路由器和交换机在哪层?TCP和UDP的区别


TCP和UDP的区别:

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。 UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!    UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。 

 TCPUDP是否连接面向连接 面向非连接传输可靠性可靠 不可靠应用场合传输大量的数据少量数据速度慢快

3.进程和线程,如何区分父进程和子进程,进程之间通信的几种方式?

这里只回答第二个问题,其余两个,相关博文给出过,http://blog.csdn.net/patkritlee/article/details/52144219

父进程从fork()返回时的返回值是子进程的进程号,非零;而子进程从fork()返回(严格来说子进程是从这里开始的)时的返回值是0。所以通过判断p的值是否为0就能知道现在运行的是父进程还是子进程。

4.面向对象语言的三个特性

封装、继承、多态。 并具体展开,谈到多态的时候,举了 虚析构函数的例子,并提问 析构函数的顺序。


0 0