C语言150问

一.嵌入式开发中为什么选择C语言(C语言久盛不衰的主要原因)?
操作系统内核都是用C语言实现的。
那为什么操作系统内核都是用C语言实现呢?

  1. C语言特点
    *C语言有出色的移植性,能在不同体系结构的软/硬件平台上运行。(修改的地方越少移植性越好)
    什么是代码移植性?如何提高代码移植性?
    可移植性并不是指所写的程序不作修改就可以在任何计算机上运行,而是指当条件有变化时,程序无需作很多修改就可运行。
    要使程序可移植:
    1)使用标准库函数,并且把它们和ANSI/ISO C标准中定义的头文件放在一起使用;
    2)尽可能使所写的程序适用于所有的编译程序,而不是仅仅适用于你现在所使用的编译程序;
    3)把其中不可移植的代码分离到一些独立的“.c”文件中。
    *C语言简介紧凑,能直接访问硬件。
    (汇编语言也能直接访问硬件,两者区别:汇编语言直接生成机器码控制硬件,效率高,但汇编语言是低级语言,不适用与内核中复杂功能的实现,对硬件的初始化时使用汇编语言;C语言经过预处理、编译、汇编生成机器码,效率低,但C语言属于高级语言,对硬件做复杂操作使用C语言)
    *C语言有较高的运行效率。(解释性语言(Java、python)效率低,但适用于不同语言)

  2. 嵌入式开发中的地位-开发工具

嵌入式Linux应用软件开发工程师
嵌入式Linux驱动开发工程师
嵌入式BSP开发工程师
嵌入式kernel开发工程师

  1. 高级语言中的低级语言
    C语言VS汇编语言:
    汇编:效率高,对硬件的可操控性强,体积小,不易维护,可移植性很差;
    C语言:效率比较低,硬件可操控性比较差,目标代码体积大,容易维护,可移植性很好。
    汇编语言直接生成机器码控制硬件,效率高,但汇编语言是低级语言,不适用与内核中复杂功能的实现,对硬件的初始化时使用汇编语言;C语言经过预处理、编译、汇编生成机器码,效率低,但C语言属于高级语言,对硬件做复杂操作使用C语言。
    C语言VS其他高级语言:
    C语言有较高的运行效率。(解释性语言(Java、python)效率低,但适用于不同语言)

二.精通C语言考核标准
1.企业笔试题
2.累计代码量
3.良好的编码规范(华为的编码规范要求)
4.行业应用的项目经验

三.如何学习C语言?
推荐教材:《C和指针》、《C语言专家编程》、《高质量C/C++编程》、《编程之美》、《C程序设计》、《程序员的自我修养》

  1. 机器语言à汇编语言àC语言
    汇编语言应该是我们现在学的最“低级”的语言了,因为现在不会再有人去学机器语言了。而汇编语言还在一些硬件或者嵌入式设备上使用并开发着。
    汇编语言和机器语言一一对应。
    汇编程序就是用来把由用户编制的汇编程序翻译成机器语言程序的一种系统程序。
    高级语言的翻译程序有两种:
    一种是先把高级语言程序翻译成机器语言,(或先翻译成汇编语言,然后又汇编程序再次翻译成机器语言)然后才能在机器上执行。——编译程序
    直接把高级语言程序在机器上运行,一边解释一边执行。——解释程序
    翻译程序包括汇编程序、解释程序、编译程序。

  2. C语言之父是谁?
    丹尼斯·里奇
    有无A语言,B语言,C语言?
    (1).A语言
    C语言的原型ALGOL 60语言。(也称为A语言)
    1963年,剑桥大学将ALGOL60语言发展成为CPL(Combined Programming Language)语言。
    1967年,剑桥大学的Matin Richards对CPL语言进行了简化,于是产生了BCPL语言。
    (2).B语言
    1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。意思是将CPL语言煮干,提炼出它的精华。并且他用B语言写了第一个UNIX操作系统。
    (3).C语言
    在1973年,B语言也给人“煮”了一下,美国贝尔实验室的D.M.RITCHIE在B语言的基础上最终设计出了一种新的语言,他取了BGPL的第二个字母作为这种语言的名字,这就是C语言。
    为了使UNIX操作系统推广,1977年Dennis M.Ritchie 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。

  3. C语言的标准有哪些?
    ANSI C和ISO C、C89、C99、C11

五. 编译型语言与解释型语言的区别?
编译型的语言: 专门的编译器, 针对特定的平台(操作系统)“翻译”成机器码(包括机器指令和操作数),并包装成该平台可执行程序的格式;如需要其他的代码,要进行链接。

优点: 可脱离开发环境,特定的平台上独立运行,运行效率较高。
缺点:无法移植;需要移植,要源代码重新编译。

代表语言:C C++

解释型语言:专门的解释器对源程序每一行解释成特定平台的机器码并立即执行的语言;
解释型语言不会对整体性的编译和链接处理,解释型语言相当于把编译语言中编译和解释过程混合到了一起同时完成。

优点:跨平台较容易,是以牺牲程序执行效率为代价。
缺点:效率较低,不能脱离解释器独立运行

代表语言:ruby python

关于java语言:

java语言比较特殊,由于java语言编写的程序需要经过编译,
的字节码(*.class),这个字节码不可执行。必须使用java解释器来解释执行。
所以java语言既是编译型语言,也是解释型语言。
六. 面向过程处理机制 VS 面向对象处理机制
首先我们得知道C语言是面向过程的,而C++和Java是面向结构的。
面向过程与面向结构的区别:
面向过程中重用的是过程和函数,但是面向对象重用的是类,一种将数据和处理数据的过程及函数封装在一起的实
体,面向对象一个很大的好处就是数据 和方法的封装,由此面向对象的三大特性得到发挥。
面向过程追究的是实现,而面向对象追究的是结果。
举例来说,从出发点A到目的地B,面向过程要做的是规划每一条路径具体到每一个细节,而面向对象只注重结果,直
接上了一辆出租车告诉司机目的地,其他都不用管。
面向结构与面向对象的优点:
面向结构:1、运行效率高;2、移植性好;3、代码简洁紧凑;
面向对象:1、代码复用性好; 2、代码维护性好; 3、代码拓展性好;
拓展(以下转自网络):

1、从概念方面看,面向结构软件是功能的集合,通过模块以及模块和模块之间的分层调用关系实现;面向对象软件是事物对象的集合,通过对象以及对象和对象之间的通讯联系实现;
2、从构成方面看,面向结构软件是过程和数据的集合,以过程为中心;面向对象软件是数据和相应操作的封装,以对象为中心;
3、从运行控制方面看,面向结构软件采用顺序处理方式,由过程驱动控制;面向对象软件采用交互式、并行处理方式,由消息驱动控制;
4、从开发方面看,面向结构方法的工作重点是设计;面向对象方法的工作重点是分析;但是,在面向结构方法中,分析阶段和设计阶段采用了不相吻合的表达方式,需要把在分析阶段采用的具有网络特征的数据流图转换为设计阶段采用的具有分层特征的软件结构图,在面向对象方法中设计阶段的内容是分析阶段成果的细化,则不存在这一转换问题;
5、从应用方面看,相对而言,面向结构方法更加适合数据类型比较简单的数值计算和数据统计管理软件的开发;面向对象方法更加适合大型复杂的人机交互软件的开发。

七. C语言能否实现面向对象的机制
我们知道嵌入式是在操作系统内部做开发的,操作系统所有的内核几乎都是c语言。它具有出色的可移植性,能在多种不同体系结构的软硬件平台上运行。具有很高的运行效率,而且简洁紧凑,有灵活的语法机制,并能直接访问硬件。c语言是面向过程机制,它有很多的缺点,如代码的复用性,维护性,扩展性都比较差。所以c语言需要模拟面向对象机制来弥补这些缺点。
面向对象的特征为
(1)封装,隐藏内部实现
(2)继承,复用现有代码
(3)多态,改写对象行为
1.封装
封装是一种信息隐藏技术,它体现于类的说明,是对象的重要特征。封装数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户见到对象的外特性(对象能接受哪些消息,具有那些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和对象者的使用分开,使用者不必知晓行为实现的细节,只须用设计者提供的消息来访问该对象。
在c语言中,可以用结构+函数指针来模拟类的实现,而用这种结构定义的变量就是对象。我们可以在头文件中声明,在c文件中真正定义,这样可以隐藏内部信息,因为外部不知道对象所占内存的大小,所以不能静态的创建该类的对象,只能调用类提供的创建函数才能创建。这种方法的缺陷是不支持继承,因为子类中得不到任何关于父类的信息。
2.继承
继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其它类的全部描述,同时可修改和扩充。继承具有传递性。继承分为单继承(一个子类只有一父类)和多重继承(一个类有多个父类,当前RT-Thread的对象系统不能支持)。类的对象是各自封闭的,如果没继承性机制,则类对象中数据、方法就会出现大量重复。继承不仅支持系统的可重用性,而且还促进系统的可扩充性。
在c语言中,可以利用“结构在内存中的布局与结构的声明具有一致的顺序”这一事实实现继承。
3.多态
对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接受消息的对象自行决定,如是,同一消息即可调用不同的方法。例如:抽象设备具备接口统一的读写接口。串口是设备的一种,也应支持设备的读写。但串口的读写操作是串口所特有的,不应和其他设备
操作完全相同,例如操作串口的操作不应应用于sd卡设备中。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样,在这些低层次上生成的对象就能给通用消息以不同的响应。在c语言中我们可以用万能指针void*来实现多态。

猜你喜欢

转载自blog.csdn.net/qq_37831145/article/details/81506967