问答题

一、C语言有什么缺陷
我认为c语言的缺陷有语法定义不严格,运算符和运算优先级过多(不便于记忆)。语法不严格体现在,假如你写同样一个程序,在Java里面会报错,而在c语言里面是不会报错的。比如C语言中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。这样就会导致你编写的程序会有很多漏洞,黑客往往会抓住这些漏洞进行攻击。也就是说,c语言危险性比较高。这也是为什么c语言比较难学的原因,因为你编写完一个程序很可能就是错的,但又很难发现。
二、简述一下C语言/C++的编译过程
1.预处理
读取C/C++源程序,对其中的伪指令(以#开头的指令)进行处理。
①将所有的“#define”删除,并且展开所有的宏定义。
②处理所有的条件编译指令,如:“#if”、“#ifdef”、“#elif”、“#else”、“endif”等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。
③处理“#include”预编译指令,将被包含的文件插入到该预编译指令的位置。
(注意:这个过程可能是递归进行的,也就是说被包含的文件可能还包含其他文件)
删除所有的注释。
添加行号和文件名标识。
保留所有的#pragma编译器指令。
2.编译
编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,这个过程往往是我们所说的整个程序的构建的核心部分,也是最复杂的部分之一。
3.汇编
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。所以汇编器的编译过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译就OK了。
4.链接
将源文件中用到的库函数与汇编生成的目标文件.o合并生成最终的可执行文件。

posted @ 2020-01-21 22:50  Zenlena  阅读(182)  评论(2编辑  收藏  举报